Relazione multipla per tax_query multiple in WP_Query

18 apr 2013, 19:44:01
Visualizzazioni: 46K
Voti: 14

Voglio utilizzare la classe WP_Query() per filtrare alcuni dei miei post. Il problema che sto affrontando ora è la gestione della query tassonomica. Normalmente, WP_Query() gestisce una sola relazione per tax_query() (o AND o OR), ma ho bisogno di utilizzare una combinazione di queste relazioni su tax_query(), come posso ottenerlo?
es

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term )
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => array( $term3 ),
            'operator' => 'IN',
        )
       // qui sotto voglio usare la relazione OR
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4 )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( $term2 ),
            'operator' => 'IN',
        )
    )  

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

0
Tutte le risposte alla domanda 2
10
17

Questo può essere fatto utilizzando il term_taxonomy_id invece dello slug, il quale ignorerà efficacemente qualsiasi tassonomia specificata e guarderà solo al campo unico term_taxonomy_id. Questo ti permetterà di creare efficacemente una relazione mista. Dovresti usare una relazione generale di AND e inserire tutti i termini che dovrebbero essere correlati OR in un unico elemento utilizzando l'operatore IN. Sarà necessario mappare prima i termini desiderati ai 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', // viene ignorato
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

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

19 apr 2013 02:16:32
Commenti

A proposito, per favore scusami e avvisami di eventuali errori/imprecisioni :) Scrivo tutto questo con una mano sola mentre con l'altra tengo un bambino.

helenhousandi helenhousandi
19 apr 2013 02:19:09

Da dove viene $slug...?

vancoder vancoder
19 apr 2013 02:45:25

È solo un segnaposto nel codice. Immagino fosse $term1 ecc. nella domanda originale.

helenhousandi helenhousandi
19 apr 2013 02:47:20

Hai ragione! Questo metodo sembra funzionare. Lo testerò e tornerò a votare questa risposta se funziona. Grazie

ron_dev ron_dev
19 apr 2013 06:22:11

Sembra che 'taxonomy' => 'taxonomy4', // viene ignorato non possa essere ignorato. Se inserisco un testo casuale in questo campo, non viene trovato alcun risultato. Solo quando ho assegnato un nome di tassonomia reale, mi ha dato il risultato. Hai qualche idea sul perché?

ron_dev ron_dev
19 apr 2013 12:39:50

Probabilmente verifica se la tassonomia esiste da qualche parte lungo la linea.

helenhousandi helenhousandi
19 apr 2013 17:39:55

Ma da quello che ho visto in https://core.trac.wordpress.org/ticket/21228 e https://core.trac.wordpress.org/changeset/21552, non dovrebbe controllare la tassonomia quando esiste 'term_taxonomy_id', giusto?

ron_dev ron_dev
20 apr 2013 10:49:34

Dopo aver provato molte volte, ancora non funziona, penso che questo metodo non stia funzionando... dopo aver controllato la classe WP_TAX_QUERY su https://core.trac.wordpress.org/browser/trunk/wp-includes/taxonomy.php?rev=21552, ho scoperto che è ancora necessario verificare il nome della tassonomia prima di poter usare term_taxonomy_id per questo scopo (correggetemi se sbaglio), quindi il nome della tassonomia deve esistere nell'array tax_query. Pertanto, questo metodo non può risolvere il problema. Qualche altro suggerimento per risolverlo?

ron_dev ron_dev
23 apr 2013 07:43:41

Ok, alla fine ho scritto e pubblicato questo articolo: http://10up.com/blog/wordpress-mixed-relationship-taxonomy-queries/ - in sostanza, sì, devi usare un nome di tassonomia valido, ma il resto rimane valido.

helenhousandi helenhousandi
17 dic 2013 01:02:17

Cristo, è ridicolo che una cosa del genere non sia documentata in WP. Grazie per averlo scritto, se la stessa query non funziona per altri campi come fa per term_taxonomy_id, perché diavolo supportano anche il primo.

jmcgrory jmcgrory
5 mar 2022 23:28:55
Mostra i restanti 5 commenti
2

Suggerisco di utilizzare tax_query al posto di meta_query per gestire operatori multipli or/and come in questo esempio

5 nov 2015 13:00:22
Commenti

Suggerimento molto migliore. È stato rilasciato qualche tempo dopo la risposta precedente.

FooBar FooBar
12 feb 2020 13:04:22

Meta_query permette di filtrare per tassonomia? Non vedo dove specificare il tipo di tassonomia

LTroya LTroya
9 ago 2022 05:56:56