何时/为什么‘$Query->Get(’TAX_QUERY‘);’返回空?

时间:2013-11-22 作者:its_me

首先是代码:

function itsme_better_editions( $query ) {
    if ( $query->is_category() && $query->is_main_query() ) {
        $query->set( \'post_type\', array( \'post\' ) );

        // Get current tax query
        $tax_query = $query->get( \'tax_query\' );

        $tax_query[\'relation\'] = \'OR\';

        $tax_query[] = array(
            \'taxonomy\' => \'category\',
            \'field\' => \'slug\',
            \'terms\' => \'intl\',
            \'operator\' => \'IN\'
        );

        $query->set( \'tax_query\', $tax_query );
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'itsme_better_editions\' );
我觉得一切都很好,除了$query->get( \'tax_query\' ); 似乎返回空或不是数组,即返回以下条件true:

if( !empty($tax_query) || is_array($tax_query) ) {
   // whatever
}
This is breaking stuff, I later realized.

档案中显示了正确的帖子,即列出了属于当前类别或“国际(intl)”类别的帖子。这就是我想要的。

但术语对象指向“intl”类别(标签存档中也会发生同样的情况;它指向的不是当前标签的术语对象,而是“intl”类别)。例如,如果我访问“UK(UK)”类别档案,则会显示“International”而不是“UK”。

这只是我迄今为止注意到的问题之一;我不知道还有什么坏了。

功能有什么问题?

<小时>PS: 因为$query->get( \'tax_query\' ); 如果返回的是空数组或不是数组,我必须手动填充它,如下所示:

/*
 * Show posts assigned to \'International (intl)\' Edition
 * in all editions.
 */
function itsme_better_editions( $query ) {
    if( $query->is_category() && $query->is_main_query() ) {

        $query->set( \'post_type\', array( \'post\' ) );

        // NOT WORKING!!!
        //$tax_query = $query->get( \'tax_query\' );

        // Equivalent of original `$tax_query` START.
        $get_original_category = get_query_var( \'category_name\' );
        $original_category = get_term_by( \'slug\', $get_original_category, \'category\' );
        if( $original_category && !is_wp_error( $original_category ) ) {
            $itsme_original_category = $get_original_category;
        }

        $tax_query[] = array(
            \'taxonomy\' => \'category\',
            \'field\' => \'slug\',
            \'terms\' => $original_category,
            \'operator\' => \'IN\'
        );
        // Equivalent of original `$tax_query` END.

        $tax_query[\'relation\'] = \'OR\';

        $tax_query[] = array(
            \'taxonomy\' => \'category\',
            \'field\' => \'slug\',
            \'terms\' => \'intl\',
            \'operator\' => \'IN\'
        );

        $query->set( \'tax_query\', $tax_query );
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'itsme_better_editions\' );
或者简单地替换查询,如下所示:

/*
 * Show posts assigned to \'International (intl)\' Edition
 * in all editions.
 */
function itsme_better_editions( $query ) {
    if( $query->is_category() && $query->is_main_query() ) {

        // Get original/actual category of the category archive
        $get_original_category = get_query_var( \'category_name\' );
        $original_category = get_term_by( \'slug\', $get_original_category, \'category\' );
        if( $original_category && !is_wp_error( $original_category ) ) {
            $itsme_original_category = $get_original_category;
        }

        if( isset($itsme_original_category) ) {

            $query->set( \'post_type\', array( \'post\' ) );

            $query->set( "category_name", "{$itsme_original_category}, intl" );

        }

    }
}
add_action( \'pre_get_posts\', \'itsme_better_editions\' );
这是可行的,但我为什么要这样做呢?不是的$tax_query = $query->get( \'tax_query\' ); 应该归还原件tax_query?

如何重现问题。创建两个类别:英国(UK)和国际(intl)。创建2个帖子,并仅将其分配给“英国”;1仅在“国际”项下。

现在example.com/category/uk/ 显示2个帖子;和example.com/category/intl/ 显示1。

现在在主题函数中添加第一个函数(第一个代码块)。php,并访问example.com/category/uk/. 您将看到页面的类别名称(<?php single_cat_title(); ?>) 显示为“国际”。Why? 如果我没有错,因为$query->get(\'tax\\u query\');似乎返回空,而不是数组。

3、替换函数中的函数。具有上述第二个或第三个函数的php。现在,一切都应该按预期进行。

PS: 是的,我自己用默认主题(213)做了这个测试,它仍然存在。所以你可以很好地重现这个问题。

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

就我所知$query->get for main query仅适用于公共查询变量,即可以通过url触发的变量,但不阻止直接访问tax_query 属性,但请注意,它是一个对象WP_Tax_Query 当前查询的分类参数位于queries 该对象的属性。

访问您避免运行另一个查询的属性get_term_by 在您的功能内部。作为副作用,single_cat_title 将打印正确的标题:

function itsme_better_editions( $query ) {

  if ( $query->is_category() && $query->is_main_query() ) {

    $query->set( \'post_type\', array( \'post\' ) );

    $tax_query_obj = clone $query->tax_query;

    $tax_query_obj->queries[] = array(
      \'taxonomy\' => \'category\',
      \'field\' => \'slug\',
      \'terms\' => \'intl\',
      \'operator\' => \'IN\'
    );

    $tax_query = array(\'relation\' => \'OR\');

    foreach ( $tax_query_obj->queries as $q ) {
      $tax_query[] = $q;
    }

    $query->set(\'tax_query\', $tax_query);
  }

}

add_action( \'pre_get_posts\', \'itsme_better_editions\' );
请注意,实际上您也在管理查询上运行过滤器,如果不是您想要添加的内容&& ! is_admin() 内部优先if 函数中的条件。

提示:使用时\'pre_get_posts\' 您可以使用add_action 而不是add_filter 并且不返回任何内容,因为查询是作为引用传递的。

SO网友:s_ha_dum

$tax_query = $query->get( \'tax_query\' ); 将返回原件tax_query 如果将一个传递到查询中。例如:

function itsme_better_editions( $query ) {
  $query->set( \'post_type\', array( \'post\' ) );

  // Get current tax query
  $tax_query = $query->get( \'tax_query\' );
  var_dump($tax_query); die;
}
add_action( \'pre_get_posts\', \'itsme_better_editions\' );

$t = new WP_Query(
  array(
    \'post_type\' => \'post\',
    \'tax_query\' => array(
      array(
        \'taxonomy\' => \'category\',
        \'field\' => \'slug\',
        \'terms\' => \'intl\',
        \'operator\' => \'IN\'
      )
    )
  )
);
但是,如果您转储$wp_query 在类别存档上,或在主查询上运行类似的测试,没有tax_query 正如你已经发现的那样。这是因为对于某些默认查询WP_Query 对象constructs that tax_query 来自其他查询参数long after pre_get_posts runs. 这就是为什么$tax_query = $query->get( \'tax_query\' ); 为空。

结束

相关推荐

Redirect loop in /wp-admin/

今天,我管理的一个网站管理员无法访问。我刚刚在服务器上更新了apache,以启用mod\\u deflate,并将PHP从5.3升级到5.4。因为每次我尝试访问/wp admin/I时都会收到重定向循环错误。我尝试了所有常见的嫌疑犯,即:清除了Cookie和缓存,尝试了不同的浏览器,禁用了主题,删除了禁用的Cookie。htaccess检查了wp\\U选项中的site\\u url等,但运气不佳。我可以访问wp登录。php很好,但不是/wp管理员/任何帮助都将不胜感激,因为我完全被难住了。