web-dev-qa-db-fra.com

Relation multiple pour plusieurs tax_query dans WP_Query

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?

9
ron_dev

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

7
helenhousandi

Je propose en utilisant tax_query en tant que meta_query pour plusieurs opérateurs et/ou, comme this

0
Maxime Culea