Relazione multipla per tax_query multiple in WP_Query
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?
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

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.

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

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

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é?

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

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?

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?

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.

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