分類ページを変更して、子分類のアイテムを除外する


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に設定しようとしています...そして、考えられる2つの組み合わせのほぼすべてです。ただし、これまでのところ、分類アーカイブにはまだ子用語のアイテムが表示されています

次のテストでは、上書きするのではなく追加の税クエリを追加しているように見えますが、混乱させられます。

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


この答えを見てください。それはあなたをさらに連れてくるはずです。
カイザー

感謝しますが、それは私が試したものです。$ wp_queryグローバルのvar_dumps / print_rsは、少なくとも私の分類法ページではなく、既存のクエリに加えて、新しい税クエリを...の代わりに示しています。
ヘルガサビキング

ええ、そのコードはクエリに追加するためのものです。
カイザー

したがって、既存のクエリを調整/オーバーライドする方法はありませんか?b / c私が欲しいのはinclude_childrenパラメータを変更することです
12

回答:


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では、他の回答で詳述されているように、代わりにアクションを使用する必要があります。


私の場合、これは少し範囲を超えているようで、意図しない副作用があります...ナビゲーションのサブメニューが表示されないようにします。
マヌ

2
@Manu-あなたは完全に正しいです。提供されている例は非常に単純化されており、関連する変数のみを示しています。実際のシナリオ$wp_queryでは、最初にクエリを変更する必要があるかどうかを判断するために、検査、テンプレートタグ、またはその両方、またはその他のロジックを使用します。
リーパワーズ

5

pre_get_postsまたはの任意の組み合わせでこれを動作させることはできませんでしたparse_query。クエリオブジェクトを作成した後、それを消去することで比較的簡単に実行できます。クエリを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');

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

編集:

@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を代わりに使用してください。
コブシェニン

それは役に立たない。このインスタンスでpre_get_postsを機能させる方法を知っているなら、なぜ答えを投稿しないのですか?私はそれを試したことを明らかに質問に投稿しましたが、そのフィルターを介してtax_Queryオブジェクトを変更できないという結論に達しました
helgatheviking

申し訳ありませんが、もっと役立つはずです。したがって、実際の税クエリは、(parse_tax_queryを使用して)pre_get_postsが実行された後、クエリ変数(tax_queryクエリ変数を含む)から結合されたすべての税クエリを含む実際のWP_Tax_Queryで構築されるため、tax_queryクエリ変数を解析し、次に、category、tag__inなど、クエリ変数を介して利用できるものを追加します。pre_get_postsを使用して、独自のクエリ変数を追加する前に既存のクエリ変数を削除できます。
コブシェニン

より良い説明をありがとう。明らかにこれは古いので、私が持っていた解決策に進みました。フックをinclude_children介してパラメーターを変更することはできませんでしたpre_get_posts。まぁ。
ヘルガサビキング

うん、私は長い間ここにいなかったと思った;)
コヴシェニン

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

クエリは結果に含まれず、検索は除外されたために壊れました。これが役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.