Relation multiple pour plusieurs tax_query dans WP_Query


10

Je veux utiliser la WP_Query()classe pour filtrer certains de mes messages. Le problème auquel je suis confronté maintenant est de gérer la requête de taxonomie. Normalement, la WP_Query()seule relation à gérer pour tax_query()(soit ET ou OU), mais ce dont j'ai besoin est une utilisation mixte de ces relations sur le tax_query(), comment y parvenir?
par exemple

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

Je sais que le code ci-dessus ne fonctionne pas, dois-je utiliser un WP_Query()filtre pour le faire? Une idée?

Réponses:


10

Cela peut être fait en utilisant le term_taxonomy_id plutôt que le slug, qui ignorera effectivement la taxonomie spécifiée et regardera simplement le champ unique term_taxonomy_id. Cela vous permettra d'être en mesure de faire efficacement une relation mixte. Vous voudriez utiliser une relation globale de ET et mettre tous les termes qui devraient être liés OU dans un élément en utilisant l'opérateur IN. Vous devrez d'abord mapper les termes souhaités à leurs 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',
    ),
);

Notez qu'avant la version 3.5, vous devrez également spécifier 'include_children' => false. Voir ce billet Trac pour plus: https://core.trac.wordpress.org/ticket/21228


6
Soit dit en passant, veuillez m'excuser et m'avertir de toute erreur ou inexactitude :) Taper tout cela d'une seule main avec un bébé dans l'autre.
helenhousandi

1
D'où $slugvient ...?
vancoder

1
Juste un espace réservé dans le code. Je suppose que c'était $ term1 etc. dans la question d'origine.
helenhousandi

Tu as raison! Cette méthode semble fonctionner. Je vais le tester et je reviendrai voter pour cette réponse si elle fonctionne. Merci
ron_dev

Il semble que le 'taxonomy' => 'taxonomy4', // gets ignoredne peut être ignoré. Si je mets du texte aléatoire dans ce champ, aucun résultat n'a été trouvé. Ce n'est que lorsque j'ai attribué un vrai nom de taxonomie que cela me donne le résultat. Une idée pourquoi?
ron_dev

1

Je suggère d'utiliser tax_querycomme meta_queryopérateur multiple ou / et comme celui-ci


Meilleure suggestion. Comme il a été publié quelque temps après la réponse ci-dessus.
FooBar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.