Relazione multipla per più tax_query in WP_Query


10

Voglio usare la WP_Query()classe per filtrare alcuni dei miei post. Il problema che sto affrontando ora è la gestione della query di tassonomia. Normalmente, l' WP_Query()unica gestire una relazione per tax_query()(o AND o OR), ma ciò di cui ho bisogno è l'uso misto di queste relazioni sul tax_query(), come può raggiungerlo?
per esempio

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

So che il codice sopra non funziona, devo usare il WP_Query()filtro per farlo? Qualche idea?

Risposte:


10

Questo può essere fatto usando term_taxonomy_id anziché lo slug, che ignorerà efficacemente qualunque tassonomia sia specificata e guarderà semplicemente il campo term_taxonomy_id unico. Ciò ti consentirà di essere in grado di fare una relazione mista in modo efficace. Si desidera utilizzare una relazione generale di AND e inserire tutti i termini che devono essere correlati OPPURE in un elemento utilizzando l'operatore IN. Dovrai prima mappare i termini desiderati sui loro 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',
    ),
);

Nota che prima della 3.5, dovresti anche specificare 'include_children' => false. Vedi questo biglietto Trac per ulteriori informazioni: https://core.trac.wordpress.org/ticket/21228


6
A proposito, ti prego di scusarmi e avvisarmi di eventuali errori / imprecisioni :) Digitando tutto questo con una mano con un bambino nell'altro.
helenhousandi,

1
Da dove $slugviene ...?
vancoder,

1
Solo un segnaposto nel codice. Immagino fosse $ term1 ecc. Nella domanda originale.
helenhousandi,

Hai ragione! Questo metodo sembra funzionare. Proverò il test e tornerò a votare questa risposta se funziona. Grazie
ron_dev il

Sembra che 'taxonomy' => 'taxonomy4', // gets ignorednon possa essere ignorato. Se inserisco un testo casuale in questo campo, non viene trovato alcun risultato. Solo quando ho assegnato il nome della tassonomia reale, mi dà il risultato. Qualche idea sul perché?
ron_dev,

1

Mi consiglio di utilizzare tax_querycome meta_queryper più o / e operatori come questo


Suggerimento molto migliore. Come è stato rilasciato qualche tempo dopo la risposta sopra.
FooBar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.