Relație multiplă pentru tax_query multiple în WP_Query
Vreau să folosesc clasa WP_Query()
pentru a filtra unele dintre postările mele. Problema cu care mă confrunt acum este gestionarea interogării taxonomiei. În mod normal, WP_Query()
gestionează doar o singură relație pentru tax_query()
(fie AND sau OR), dar ceea ce am nevoie este utilizarea mixtă a acestor relații în tax_query()
, cum pot realiza acest lucru?
exemplu
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( $term )
),
array(
'taxonomy' => 'taxonomy3',
'field' => 'slug',
'terms' => array( $term3 ),
'operator' => 'IN',
)
// mai jos vreau să folosesc relația OR
'relation' => 'OR',
array(
'taxonomy' => 'taxonomy4',
'field' => 'slug',
'terms' => array( $term4 )
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => array( $term2 ),
'operator' => 'IN',
)
)
Știu că codul de mai sus nu funcționează, trebuie să folosesc filtrul WP_Query()
pentru a face asta? Aveți vreo idee?
Aceasta poate fi realizată prin utilizarea term_taxonomy_id în loc de slug, ceea ce va ignora efectiv orice taxonomie este specificată și se va uita doar la câmpul unic term_taxonomy_id. Acest lucru vă va permite să efectuați efectiv o relație mixtă. Ați dori să utilizați o relație generală de AND și să puneți toți termenii care ar trebui să fie relaționați OR într-un singur element folosind operatorul IN. Va trebui să mapați mai întâi termenii doriti la term_taxonomy_id-urile lor.
$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', // este ignorat
'field' => 'term_taxonomy_id',
'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
'operator' => 'IN',
),
);
Rețineți că pentru versiunile anterioare 3.5, va trebui să specificați și 'include_children' => false
. Pentru mai multe detalii, consultați acest ticket Trac: https://core.trac.wordpress.org/ticket/21228

Apropo, vă rog să mă scuzați și să mă anunțați dacă observați greșeli/inexactități :) Scriu toate astea cu o singură mână, ținând un bebeluș în cealaltă.

Doar un placeholder în cod. Presupun că în întrebarea originală era $term1 etc.

Ai dreptate! Această metodă pare să funcționeze. O voi testa și voi reveni să votez acest răspuns dacă funcționează. Mulțumesc

Se pare că 'taxonomy' => 'taxonomy4', // este ignorat
nu poate fi ignorat. Dacă pun text aleatoriu în acest câmp, nu s-a găsit niciun rezultat. Doar când am atribuit un nume real de taxonomie, mi-a dat rezultatul. Ai vreo idee de ce?

Probabil verifică dacă taxa există undeva de-a lungul procesului.

Dar din ce am văzut în https://core.trac.wordpress.org/ticket/21228 și https://core.trac.wordpress.org/changeset/21552, nu ar trebui să verifice taxonomia când există 'term_taxonomy_id', corect?

După ce am încercat de multe ori, încă nu funcționează, cred că această metodă nu merge... după ce am verificat clasa WP_TAX_QUERY la https://core.trac.wordpress.org/browser/trunk/wp-includes/taxonomy.php?rev=21552, am descoperit că este încă necesar să verifici numele taxonomiei înainte de a putea folosi term_taxonomy_id
în acest scop (corectați-mă dacă greșesc), așadar numele taxonomiei trebuie să existe în array-ul tax_query. Prin urmare, această metodă nu poate rezolva problema. Aveți alte sugestii pentru a rezolva această problemă?

Bine, în sfârșit am scris asta (și am publicat): http://10up.com/blog/wordpress-mixed-relationship-taxonomy-queries/ - practic, da, trebuie să folosești un nume de taxonomie valid, dar restul rămâne valabil.

Recomand să folosești tax_query
în loc de meta_query
pentru operatori multipli or/and precum aici
