将主页帖子限制为一个类别,并保持粘性顺序和分页

时间:2013-08-17 00:59:17

标签: wordpress pagination categories sticky

我有一个WordPress主页。它列出了所有类别的所有帖子。这是WP的默认行为。

如何制作,只显示“新闻”类别中显示的帖子

下面的代码是漂浮在网络上的流行代码。它通过限制类别来工作,但是打破了粘贴帖子的行为(它们不会浮动到帖子顺序的顶部),和分页(它重复他们在下一页)。 效率低下,因为它必须重新查询主页类别(网站上最受欢迎的页面)。

<?php
if ( is_home() ) {
    query_posts( 'cat=2' ); // This is the category 'News'.
}
?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
Post codes....

那么,最好的方法是什么?似乎高级过滤器是执行此操作的正确方法。任何WordPress大师都知道答案吗?

谢谢! 德鲁

3 个答案:

答案 0 :(得分:2)

使用pre_get_pots过滤器: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

function my_before_query( $query ) {

   if( !is_admin() && $query->is_main_query() && is_home() ){
       $query->set('cat', 2); 

   }
}
add_action( 'pre_get_posts', 'my_before_query', 1 );

答案 1 :(得分:0)

不确定分页的内容,这也没有解决您的性能问题,但这是几年前我提出的关于粘性帖子问题的解决方法。

您基本上会运行两个查询,其中粘性帖子堆叠在非粘贴帖子的顶部。下面是原始代码的简化版本,因此我还没有测试过这段确切的代码。然而,一般原则是存在的。如果你愿意,我可以发布原始实现(它是一个主页小部件)。

<ul>
    <?php

    $args_sticky = array(
        'cat' => 2,
        'post__in' => get_option( 'sticky_posts' );
    );

    /*
     *STICKY POSTS
     */
    //Display the sticky posts next

    $the_query = new WP_Query( $args_sticky );

    while ( $the_query->have_posts() ) : $the_query->the_post();
    ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
    <?php
    endwhile;

    wp_reset_postdata();

    /*
     *NON-STICKY POSTS
     */
    //Display the non-sticky posts next

    $args = array(
       'cat' => 2,
       'post__not_in' => get_option( 'sticky_posts' );
    );

    $the_query = new WP_Query( $args );

    while ( $the_query->have_posts() ) : $the_query->the_post();
    ?>
        <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
    <?php
    endwhile;

    wp_reset_postdata();

?>
</ul>

有关详细信息,请参阅:http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters

答案 2 :(得分:0)

我认为你的原始代码几乎可以使用它,但我不确定原始query_string是否会自动附加:

<?php
    global $query_string;

    if ( is_home() ) {
        query_posts( $query_string . '&cat=2' );
    }
?>

我是@Simalam提出的解决方案的粉丝。这将产生更清晰的模板代码。