修改分类法页面以排除子分类法中的项目


18

我发现了这个问题:

有没有一种方法可以在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 ...以及我能想到的几乎两者的每种组合。但是到目前为止,分类档案仍在子项中显示项目

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

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

SET不应该覆盖当前值吗?


看看这个答案。那应该带您进一步。
kaiser 2012年

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

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

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

Answers:


22

我知道这是一个老问题,但这有点令人困惑,希望能对某人有所帮助。$ 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

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

14

从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 2015年

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

5

我无法将此与pre_get_posts或的任何组合一起使用parse_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');

因此,除非有人提出更好的答案,否则这是我到目前为止发现的唯一方法。

编辑:

适应了@Tanner Moushey的答案,我终于能够完成这项工作,以从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年

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

抱歉,应该会有所帮助。因此,在触发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年

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

是的,我想,没来这里很长时间了;)
kovshenin 2012年

2

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

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

我的查询未包含在结果中,并且搜索被我的排除项破坏了。希望这会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.