WP_Queryの複数のtax_queryの複数の関係


10

WP_Query()クラスを使用して自分の投稿の一部をフィルタリングしたいのですが。私が今直面している問題は、分類クエリの処理です。通常は、WP_Query()1つの関係tax_query()(ANDまたはOR)のみを処理しますが、でこれらの関係を混合して使用する必要がありtax_query()ます。どうすればそれを実現できますか?
例えば

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

上記のコードが機能していないことはわかっていますが、WP_Query()フィルターを使用する必要がありますか?何か案が?

回答:


10

これは、スラッグではなくterm_taxonomy_idを使用して行うことができます。これにより、指定された分類を効果的に無視し、一意のterm_taxonomy_idフィールドを確認します。これにより、混合関係を効果的に行うことができます。ANDの全体的な関係を使用し、IN演算子を使用して、ORである必要のあるすべての用語を1つのアイテムに配置します。まず、目的の用語をterm_taxonomy_idsにマップする必要があります。

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

3.5より前では、も指定する必要があることに注意してください'include_children' => false。詳細については、このTracチケットを参照してください:https : //core.trac.wordpress.org/ticket/21228


6
ちなみに、失礼し、間違いや間違いがあったら私に知らせてください:)この片手ですべてを片手で赤ちゃんとタイプします。
helenhousandi

1
どこ$slugから来たのですか...?
バンコーダー2013

1
コード内の単なるプレースホルダー。元の質問では$ term1などだったと思います。
helenhousandi

あなたが正しいです!この方法はうまくいくようです。私はそれをテストし、それが機能している場合はこの回答に投票するために戻ってきます。ありがとう
ron_dev

'taxonomy' => 'taxonomy4', // gets ignored無視できないようです 。このフィールドにランダムなテキストを入力すると、結果が見つかりませんでした。実際の分類名を割り当てた場合のみ、結果が得られます。なぜか?
ron_dev 2013

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