将PRE_GET_POST与WP_QUERY配合使用

时间:2012-05-17 作者:Ben Pearson

我在看书Stephen Harris\'这是一个很好的答案this question 关于使用WP_query(), query_posts()pre_get_posts.

他说:“pre\\u get\\u posts是一个过滤器,用于修改any 查询它通常仅用于更改“主查询”。“”

可以使用pre_get_posts 要筛选only 使用创建的特定辅助查询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();
非常感谢您的帮助。

2 个回复
最合适的回答,由SO网友:Milo 整理而成

最简单的方法是在查询和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();

EDIT

您可以使用的另一种技术是设置自己的查询变量,并在挂钩中检查该变量:

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

SO网友:Chris_O

pre_get_posts 为每个帖子查询激发:

  • 获取帖子()
  • 新建WP\\U查询()
  • 客户端在不知情的情况下安装的随机最近帖子小部件

    因此,除非排除过滤器,否则请使用条件:is_main_query() 然后,过滤器将在新的WP\\U查询中启动。

    如果您只想针对特定的新WP\\U查询,那么没有办法做到这一点。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post