首先是代码:
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)做了这个测试,它仍然存在。所以你可以很好地重现这个问题。
最合适的回答,由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
并且不返回任何内容,因为查询是作为引用传递的。