我发现了这个问题:

有一种方法可以在pre_get_posts过滤器中使用$ query-> set('tax_query'吗?

这似乎表明可以,您可以更改通过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 ...以及我能想到的几乎所有这两种组合,但是到目前为止,分类档案仍在子术语中显示这些项目

以下测试似乎只是添加了其他税收查询,而不是覆盖它们……这使我感到困惑。 ?

评论

请看看这个答案。那应该带您进一步。

谢谢,但这几乎是我尝试过的。 $ wp_query全局变量的var_dumps / print_rs至少在我的分类页面上显示了除现有查询之外的新税收查询,而不是...。

是的,该代码旨在添加到查询中。

所以没有办法调整/覆盖现有查询吗? b / c我想要的是更改include_children参数

#1 楼

我知道这是一个老问题,但这有点令人困惑,希望能对某人有所帮助。 $ query-> set不起作用的原因是查询已被解析,现在我们还需要更新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' );


评论


甜!!我检查了一下,并能够使您的代码适用于所有分类法,这是原始问题。 +1(如果可以的话,我会给你更多的赞成票)

–helgatheviking
13年5月3日,3:07

令我惊讶和欣慰的是,这种方法也适用于日期查询。

–大卫
2014年9月9日18:13

嗯-这对我来说不起作用。它可以在主查询和/或is_search中工作吗?

– v3nt
20年7月3日,9:29

#2 楼

从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操作,如其他答案所述。

评论


就我而言,这似乎有点太深了,而且有意想不到的副作用……它阻止了我的导航子菜单出现。

– Manu
15年5月29日在20:14

@Manu-您完全正确。提供的示例非常简化,仅显示了相关变量。在实际场景中,您将检查$ wp_query,使用模板标记或同时使用这两个标记或某些其他逻辑来确定是否应首先修改查询。

–力宝
2015年5月29日在20:21

#3 楼

我无法将其与pre_get_postsparse_query的任何组合一起使用。我可以通过在完成查询后清除查询对象来相对容易地做到这一点。我不喜欢它,因为那之后我要运行两次查询,但是我尽力做到“高效”。

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');


所以直到有人提出更好的答案,这是我到目前为止发现的唯一方法。

编辑:为了使这项工作能够从pre_get_posts钩子的分类分类档案中排除所有子项,而无需进行无效的重复查询。

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' );


评论


错了您不应使用query_posts,pre_get_posts或request。

–kovshenin
2012年8月9日,0:21

这没有帮助。为什么不发布答案呢?如果您知道如何使pre_get_posts在这种情况下起作用?我显然在我的问题中发布了我尝试过的方法,但得出的结论是您无法通过该过滤器修改tax_Query对象

–helgatheviking
2012年8月10日在12:11

抱歉,应该会有所帮助。因此,在触发pre_get_posts之后,并在实际的WP_Tax_Query中构建了真正的税查询(使用parse_tax_query),该WP_Tax_Query包含与查询变量(包括tax_query查询var)组合的所有税查询,因此在您的情况下,它将解析tax_query查询var,然后附加通过查询var可用的任何其他内容,例如category,tag__in等。您可以在添加自己的查询之前使用pre_get_posts删除现有的查询变量。

–kovshenin
2012年10月10日在9:15

感谢您的更好的解释。显然这很老了,所以我继续使用已有的解决方案。我以前无法通过pre_get_posts挂钩修改include_children参数。呃,好吧。

–helgatheviking
2012年10月10日13:16

是的,我想,已经很久没来了;)

–kovshenin
2012年10月10日14:09

#4 楼

对于那些喜欢我的人,我发现了一些有用的信息。
我使用了优先级系统

    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;
return $query;
endif;

}
 add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );


我的查询未包含在结果和搜索因我的排除而被破坏。
希望这会有所帮助。

#5 楼

我偶然发现了WP Core上的以下线程,并成功地使用它来将子级排除在特定分类之外:

页。