问题描述
我发现这个问题:
Theres a way to use $query->set(‘tax_query’ in pre_get_posts filter?
这似乎表明是的,您可以通过 pre_get_posts() 更改分类归档的分类法查询。所以我想出了
add_action('pre_get_posts', 'kia_no_child_terms' );
function kia_no_child_terms( $wp_query ) {
if( is_tax() ) {
$wp_query->tax_query->queries[0]['include_children'] = 0;
}
}
以及
add_action('pre_get_posts', 'kia_no_child_terms' );
function kia_no_child_terms( $wp_query ) {
if( is_tax() ) {
$tax_query = $wp_query->get( 'tax_query' );
$tax_query->queries[0]['include_children'] = 0;
$wp_query->set( 'tax_query', $tax_query );
}
}
尝试将 include_children 参数设置为 false … 以及我可以想到的两个组合。然而,到目前为止,分类归档仍然显示小孩期限中的项目
并且以下测试似乎添加了额外的税务查询,而不是覆盖他们… 这只是困惑我。
function dummy_test( $wp_query){
$tax_query = array(
'relation' => 'OR',
array(
'taxonomy' => 'tax1',
'terms' => array( 'term1', 'term2' ),
'field' => 'slug',
),
array(
'taxonomy' => 'tax2',
'terms' => array( 'term-a', 'term-b' ),
'field' => 'slug',
),
);
$wp_query->set( 'tax_query', $tax_query );
);
add_action('pre_get_posts','dummy_test');
不应该设置覆盖当前值吗?
最佳解决方案
我知道这是一个老问题,但有点混乱,希望能帮助某人。 `$ query-> 集不起作用的原因是因为查询已被解析,现在我们还需要更新 tax_query 对象。这是我如何做到的:
function my_tax_query( $query ) {
$package_id = 12345;
$tax_query = array(
'taxonomy' => 'package_id',
'terms' => array( $package_id ),
'field' => 'slug',
'operator' => 'IN',
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );
次佳解决方案
从 Wordpress 3.7 开始,正是为此目的添加了一个名为 parse_tax_query
的新动作。
function kia_no_child_terms($wp_query) {
$wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');
该挂钩修改 query_vars 和 tax_query 的值。使用 pre_get_posts
方法会产生重复的分类查询,至少对我来说。
在 3.7 之前,您必须使用 pre_get_posts
操作,如其他答案中所述。
第三种解决方案
我无法得到这个工作与任何组合的 pre_get_posts 或 parse_query 。我可以通过擦除查询对象后,相对容易地做到这一点。我不喜欢它 b /c 然后我运行查询两次,但我在我的机智的最后,试图成为’efficient’
function kia_no_child_taxonomies(){
if(is_tax()){
$args = array(
'tax_query' => array(
array(
'taxonomy' => get_query_var('taxonomy'),
'field' => 'slug',
'terms' => get_query_var('term'),
'include_children' => FALSE
)
)
);
query_posts($args);
}
}
add_action('wp','kia_no_child_taxonomies');
所以直到有人来了一个更好的答案,这是迄今为止我发现的唯一方法。
编辑:
为了适应 @Tanner Moushey 的答案,我终于可以使这项工作从 pre_get_posts
挂钩中的分类归档中排除所有的子条款,而没有效率低下的 double-query 。
function kia_no_child_taxonomies( $query ) {
if( is_tax() ):
$tax_obj = $query->get_queried_object();
$tax_query = array(
'taxonomy' => $tax_obj->taxonomy,
'field' => 'slug',
'terms' => $tax_obj->slug,
'include_children' => FALSE
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
endif;
}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。