问题描述
我正在阅读 Stephen Harris 对于使用 WP_query()
,query_posts()
和 pre_get_posts
的 this question 的极好答案。
他说 「pre_get_posts 是一个过滤器,用于更改任何查询,最常用于更改’main query’ 。」
可以使用 pre_get_posts
过滤仅使用 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();
任何帮助非常感谢。
最佳解决方案
最简单的方法是立即在查询之前添加动作和 remove it 。
add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');
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();
编辑
您可以使用的另一种技术是设置您自己的查询 var 并在钩子中检查:
// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
$query_vars[] = 'my_special_query';
return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );
// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
if( isset( $query->query_vars['my_special_query'] ) )
// do special stuff
return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );
并在模板中:
// set the query var (along with whatever others) to trigger the filter
$args = array(
'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );
次佳解决方案
pre_get_posts
fires for every post query:
- get_posts()
- new WP_Query()
- That random recent posts widget your client installed without you knowing.
- Everything
— @nacin
除非你排除你的过滤器,否则使用条件:is_main_query()
,那么你的过滤器将触发你的新 WP_Query 。
如果你只想要定位你特定的新 WP_Query,那么没办法。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。