web-dev-qa-db-ja.com

WP_Queryの複数のtax_queryに対する複数の関係

私は私の投稿のいくつかをフィルタするためにWP_Query()クラスを使いたいです。私が今直面している問題は分類法の問い合わせを扱うことです。通常、WP_Query()tax_query()に対して1つの関係(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() filterを使う必要がありますか?何か案が?

9
ron_dev

これは、スラグではなくterm_taxonomy_idを使用することで実行できます。これは、指定された分類法を実質的に無視し、一意のterm_taxonomy_idフィールドを調べるだけです。これにより、混合関係を効果的に行えるようになります。全体的なANDの関係を使い、IN演算子を使って1つの項目に関連しているはずのすべての用語ORを入れます。最初に、希望の用語をそれらの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

7
helenhousandi

複数の/または/および this のような演算子のtax_queryとしてmeta_queryを使用することをお勧めします。

0
Maxime Culea