您说对了:
切勿使用query_posts
了
pre_get_posts
pre_get_posts
是一个过滤器,用于更改任何查询。它最常用于仅更改“主查询”:
add_action('pre_get_posts','wpse50761_alter_query');
function wpse50761_alter_query($query){
if( $query->is_main_query() ){
//Do something to main query
}
}
(尽管这可能是多余的,但我还将检查is_admin()
返回的false)。主要查询在您的模板中显示为:
if( have_posts() ):
while( have_posts() ): the_post();
//The loop
endwhile;
endif;
如果您需要编辑此循环,请使用pre_get_posts
。即,如果您想使用query_posts()
-请pre_get_posts
改为使用。
WP_Query
主要查询是的重要实例WP_Query object
。WordPress使用它来决定使用哪个模板,例如,传递到url中的任何参数(例如,分页)都将被引导到该WP_Query
对象的实例中。
对于辅助循环(例如,在侧栏或“相关文章”列表中),您需要创建自己的WP_Query
对象单独实例。例如
$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
//The secondary loop
endwhile;
endif;
wp_reset_postdata();
注意wp_reset_postdata();
-这是因为辅助循环将覆盖$post
标识“当前帖子” 的全局变量。这实质上将其重置为“ $post
on on”。
get_posts()
实际上,这是WP_Query
对象的单独实例的包装。这将返回一个post对象数组。上面循环中使用的方法不再对您可用。这不是一个“循环”,仅仅是一个post对象数组。
<ul>
<?php
global $post;
$args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
回答您的问题
- 使用
pre_get_posts
改变你的主查询。WP_Query
模板页面中的辅助循环使用单独的对象(方法2)。
- 如果要更改主循环的查询,请使用
pre_get_posts
。