在这种情况下,修改wp_Query后该如何操作

时间:2017-02-05 作者:ironfish

有许多第三方wp。org repository插件,1)向页面添加类别和标记,2)允许页面与帖子一起显示在归档页面中。

他们在第2部分中使用的代码始终使用:

$wp_query->set
例如:

   if ( ! is_admin() ) {
      add_action( \'pre_get_posts\', \'category_and_tag_archives\' );
   }

// Add Page as a post_type in the archive.php and tag.php 

function category_and_tag_archives( $wp_query ) {

    $my_post_array = array(\'post\',\'page\');

    if ( $wp_query->get( \'category_name\' ) || $wp_query->get( \'cat\' ) )
      $wp_query->set( \'post_type\', $my_post_array );

    if ( $wp_query->get( \'tag\' ) )
      $wp_query->set( \'post_type\', $my_post_array );

  }
因此,插件都在修改wp\\u查询设置,然后保留这些设置——也就是说,它们不会取消更改或重置更改。

我猜他们无法重置wp\\u查询,因为修改后wp\\u查询不会立即执行-wp\\u查询将在稍后调用存档页时执行。由于他们没有在代码中执行wp\\u查询,因此无法立即重置它。

然后,当我在另一个插件中使用此代码时,例如:

$the_query = new WP_Query( array( \'cat\' => $categoryid, \'post_type\' => \'page\' ) );
它同时返回帖子和页面,而它应该只返回页面。

这是因为wp\\U查询已被修改且未重置。

在这种情况下,我不知道如何让wp\\u查询为第二段代码工作。

最明显的是在我的代码行之前重置wp\\u查询,但我不确定这是否会对其他插件或核心中的其他代码产生负面影响。

非常感谢您的帮助。

2 个回复
SO网友:Ignacio Jose Canó Cabral

如果上面显示的代码是插件正在使用的代码,它将影响每个查询,因为它没有检查is\\u main\\u query()(https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts)

您可以做的是删除该操作,执行查询,然后再次添加该操作(如果需要)

remove_action( \'pre_get_posts\', \'category_and_tag_archives\' );
$myQuery = new WP_Query($queryArgs);
add_action( \'pre_get_posts\', \'category_and_tag_archives\' );
如果插件中的优先级不同(默认值为10),请确保指定它。

以下是删除操作参考https://codex.wordpress.org/Function_Reference/remove_action

希望这有帮助,

SO网友:gmazzap

插件修改时WP_Query 它不是“永久”修改的,而是正在修改的单个对象。

当您这样做时:

$the_query = new WP_Query( array( \'cat\' => $categoryid, \'post_type\' => \'page\' ) );

你可以同时获得页面和帖子,但是not 因为查询已修改且未重置(实际上您正在使用另一个对象)。真正的原因是,过滤器再次为这个新对象运行,并对其进行修改。

发生这种情况是因为pre_get_posts 钩子用于所有查询,因此它也用于原始查询和您的查询。

如果修改查询的插件更明智一些,那么它已经检查了is_main_query() 在修改查询之前,这样,任何不是主查询的查询都不会受到影响。

例如,如果插件执行以下操作:

function category_and_tag_archives( $wp_query ) {

    // Only act on main query
    if ( ! $wp_query->is_main_query() ) {
       return;
    }

    $my_post_array = array(\'post\',\'page\');

    if ( $wp_query->get( \'category_name\' ) || $wp_query->get( \'cat\' ) )
      $wp_query->set( \'post_type\', $my_post_array );

    if ( $wp_query->get( \'tag\' ) )
      $wp_query->set( \'post_type\', $my_post_array );

}
之后,您可以:

$the_query = new WP_Query( array( \'cat\' => $categoryid, \'post_type\' => \'page\' ) );

作为一个次要的查询,它不会受到影响,并且您只会得到预期的帖子。

相关推荐

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

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