在WP_Query中使用pre_get_posts


24

我读斯蒂芬·哈里斯的出色回答这个问题,关于使用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();

任何帮助,不胜感激。

Answers:


23

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

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

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

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

4

pre_get_posts 为每个帖子查询触发:

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

-@nacin

话虽这么说,除非您排除过滤器,否则请使用条件:is_main_query()过滤器将在新的WP_Query上触发。

如果只想定位特定的新WP_Query,则没有办法。


米洛的技术呢?我从未见过……
brasofilo 2012年

他的技术会奏效。香港专业教育学院从未将其用于pre_get_posts,但已将其用于其他过滤器,例如posts_where
Chris_O 2012年

1
太酷了,今天有新知识!
brasofilo 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.