问题描述

我发现这个问题:

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。