我正在阅读斯蒂芬·哈里斯(Stephen Harris)关于WP_query()query_posts()pre_get_posts的用法的出色答案。

他说:“ pre_get_posts是一个过滤器,用于更改任何查询。它通常用于仅更改“主查询”。“

可以使用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();


任何帮助,不胜感激。

#1 楼

最简单的方法是在查询之前添加操作,然后在查询之后立即将其删除。

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();


EDIT


您可以使用的另一种技术是设置您自己的查询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 );


评论


非常感谢Milo。这确实非常有帮助。我一直想知道是否可以设置自己的查询var。

–本·皮尔逊
2012年5月18日下午5:52

如何将这个技巧用于存档页面?我不想为存档页面再次重写整个查询,但想使用此技术。

–罗希特·潘德(Rohit Pande)
13年7月2日在9:17



#2 楼



pre_get_posts会在每个帖子查询时触发:

get_posts()
新的WP_Query()
最近发布的随机帖子窗口小部件在您不知情的情况下安装了客户端。
一切

-@nacin

话虽如此,除非您排除过滤器,请使用条件:is_main_query(),然后您的过滤器将在新的WP_Query上触发。 br />如果您只想定位特定的新WP_Query,则没有办法。

评论


米洛的技术呢?我从未见过...

–brasofilo
2012年5月17日21:56

他的技术会奏效。香港专业教育学院从未使用过pre_get_posts,但有其他过滤器,如posts_where

– Chris_O
2012年5月17日22:02

太好了,今天有新知识!

–brasofilo
2012年5月17日22:05