web-dev-qa-db-ja.com

子分類法の項目を除するように分類法ページを変更する

私はこの質問を見つけました:

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は現在の値を上書きしませんか?

17
helgatheviking

これをpre_get_postsやparse_queryのどのような組み合わせでもうまく動作させることはできませんでした。私はそれが作られた後にクエリオブジェクトを一掃することによって比較的簡単にそれを行うことができます。私はそれが好きではありませんb/cそれから私は2回クエリを実行していますが、私は私のウィットの終わりに「効率的」になろうとしています

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

だから誰かがw /より良い答えが来るまで、これが私がこれまでに見つけた唯一の方法です。

編集:

@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' );
4
helgatheviking

私はこれが古い質問であることを知っています、しかしそれは少し紛らわしくてそしてうまくいけば誰かを助けるでしょう。 `$ 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' );
18
Tanner Moushey

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アクションを使用する必要があります。

14
leepowers

私のような人たちがこの問題に立ち往生していた人にとって、私は何か便利なことがわかった。優先システムを使用しました

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

私の質問は結果に含まれておらず、検索は私の除外で壊れていました。これが役立つことを願っています

2
youkoal