Je souhaite utiliser la classe WP_Query()
pour filtrer certaines de mes publications. Le problème auquel je suis confronté maintenant est la gestion de la requête de taxonomie. Normalement, WP_Query()
ne gère qu'une relation pour tax_query()
(AND ou OR), mais ce dont j'ai besoin, c'est une utilisation mixte de ces relations sur tax_query()
, comment peut-on 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 le filtre WP_Query()
pour le faire? Une idée?
Cela peut être fait en utilisant term_taxonomy_id plutôt que le slug, qui ignorera effectivement la taxonomie spécifiée et se contentera de regarder le champ unique term_taxonomy_id. Cela vous permettra de créer efficacement une relation mixte. Vous voudriez utiliser une relation globale de AND et mettre tous les termes qui devraient être liés OR dans un élément en utilisant l'opérateur IN. Vous devrez d'abord mapper les termes souhaités sur leur 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 auriez également besoin de spécifier 'include_children' => false
. Voir ce billet Trac pour plus: https://core.trac.wordpress.org/ticket/21228
Je propose en utilisant tax_query
en tant que meta_query
pour plusieurs opérateurs et/ou, comme this