我有一个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大师都知道答案吗?
谢谢! 德鲁
答案 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提出的解决方案的粉丝。这将产生更清晰的模板代码。