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

时间:2012-02-22 作者:helgatheviking

我发现了这个问题:

Theres a way to use $query->set('tax_query' in pre_get_posts filter?

这似乎表明是的,您可以通过pre\\u get\\u 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\\u 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\');
设置是否应覆盖当前值?

5 个回复
最合适的回答,由SO网友:helgatheviking 整理而成

我无法将此与以下任何组合一起使用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\');
因此,除非有人给出更好的答案,否则这是我目前为止找到的唯一方法。

EDIT:

根据@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\' );

SO网友:Tanner Moushey

我知道这是一个老生常谈的问题,但它有点让人困惑,希望能帮助别人。“$查询->设置不起作用的原因是查询已经被解析,现在我们还需要更新tax\\u查询对象。我是这样做的:

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

SO网友:leepowers

从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\\u vars和tax\\u query的值。使用pre_get_posts 方法导致了重复的分类查询,至少对我来说是这样。

在3.7之前,您必须使用pre_get_posts 而应采取行动,详见其他答案。

SO网友:youkoal

对于那些像我一样被这个问题困扰的人,我发现了一些有用的东西。我使用了优先权系统

    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 );
我的查询没有包含在结果中,搜索被排除在外。希望这会有所帮助。

SO网友:tomyam

我无意中发现了以下线索WP Core 我正在使用它成功地排除特定分类法的子项:

function wpse_43181_parse_tax_query( $query ) {
  if ( ! empty( $query->tax_query->queries ) ) {
    foreach ( $query->tax_query->queries as &$tax_query ) {
      if ( $tax_query[\'taxonomy\'] === \'your_taxonomy\' ) {
        $tax_query[\'include_children\'] = false;
      }
    }
  }
}
add_action( \'parse_tax_query\', \'wpse_43181_parse_tax_query\' );
根据您的喜好对其进行调整,以从所有分类法页面中排除子项。

结束

相关推荐

修改分类页面以排除子分类中的项目 - 小码农CODE - 行之有效找到问题解决它

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

时间:2012-02-22 作者:helgatheviking

我发现了这个问题:

Theres a way to use $query->set('tax_query' in pre_get_posts filter?

这似乎表明是的,您可以通过pre\\u get\\u 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\\u 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\');
设置是否应覆盖当前值?

5 个回复
最合适的回答,由SO网友:helgatheviking 整理而成

我无法将此与以下任何组合一起使用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\');
因此,除非有人给出更好的答案,否则这是我目前为止找到的唯一方法。

EDIT:

根据@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\' );

SO网友:Tanner Moushey

我知道这是一个老生常谈的问题,但它有点让人困惑,希望能帮助别人。“$查询->设置不起作用的原因是查询已经被解析,现在我们还需要更新tax\\u查询对象。我是这样做的:

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

SO网友:leepowers

从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\\u vars和tax\\u query的值。使用pre_get_posts 方法导致了重复的分类查询,至少对我来说是这样。

在3.7之前,您必须使用pre_get_posts 而应采取行动,详见其他答案。

SO网友:youkoal

对于那些像我一样被这个问题困扰的人,我发现了一些有用的东西。我使用了优先权系统

    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 );
我的查询没有包含在结果中,搜索被排除在外。希望这会有所帮助。

SO网友:tomyam

我无意中发现了以下线索WP Core 我正在使用它成功地排除特定分类法的子项:

function wpse_43181_parse_tax_query( $query ) {
  if ( ! empty( $query->tax_query->queries ) ) {
    foreach ( $query->tax_query->queries as &$tax_query ) {
      if ( $tax_query[\'taxonomy\'] === \'your_taxonomy\' ) {
        $tax_query[\'include_children\'] = false;
      }
    }
  }
}
add_action( \'parse_tax_query\', \'wpse_43181_parse_tax_query\' );
根据您的喜好对其进行调整,以从所有分类法页面中排除子项。

相关推荐