Includerea tuturor termenilor în tax_query WordPress
Sunt puțin confuz, de ce nu pot include automat toți termenii în tax_query?
Codul meu:
'tax_query' => array(
array(
'taxonomy' => 'city',
'field' => 'slug',
'terms' => array( nyc, boston, london ),
)
)
Ce se întâmplă dacă am zeci de orașe? Nu este ineficient să le adaug pe toate manual?

Dacă nu aveți articole care nu au un oraș asociat, nu interogați practic toate articolele? În orice caz, Eric Holmes are dreptate că ar trebui să folosiți WP_Query
în loc de query_posts()
.
Cu toate acestea, puteți obține o listă cu toți termenii dintr-o taxonomie și apoi să utilizați acele valori în interogarea dvs. de taxonomie.
// obține toți termenii din taxonomie
$terms = get_terms( 'city' );
// convertește array-ul de obiecte termen în array de ID-uri de termeni
$term_ids = wp_list_pluck( $terms, 'term_id' );
// continuă cu interogarea de taxonomie
$args = array ('tax_query' => array(
array(
'taxonomy' => 'city',
'field' => 'term_id',
'terms' => $term_ids,
)
)
);
$city_posts = new WP_Query( $args );

Mulțumesc, am ales WP_Query
. Sună mai bine decât query_posts(), pentru că la urma urmei query_posts()
este o funcție care returnează la WP_Query
. Și în loc de term_ids am folosit 'taxonomy' => 'city
pentru a include totul în ea.

Pe lângă răspunsul marcat ca 'cel mai bun', există o altă metodă care ar putea fi chiar mai rapidă, deoarece nu este nevoie să extragem termenii și să obținem numele mai întâi.
Aceasta se realizează printr-un truc folosind un operator inexistent (niciunul dintre 'IN', 'NOT IN', 'AND', 'EXISTS' și 'NOT EXISTS'). De exemplu, șirul 'XXX' îndeplinește această sarcină și determină WP să nu intre în cazurile respective în timpul generării interogării, astfel încât și concatenarea 0=1 este omisă.
(Cazurile se află în funcția get_sql_for_clause()
din fișierul class-wp-tax-query.php, unde operatorii permisi sunt verificați prin condiții și nu există o ramură 'else'.)
.
$args = array ('tax_query' =>
array(
array(
'taxonomy' => 'city',
//'field' => 'term_id', // <-- nu este necesar, valoare implicită
//'terms' => $term_ids, // <-- nu este necesar
'operator' => 'XXX' // Folosește un operator inexistent
)
)
);

În primul rând, nu utilizați query_posts
. Creați în schimb un obiect WP_Query
nou.
În al doilea rând, de ce ar fi nevoie să adăugați toate categoriile, dacă literalmente adăugați TOATE categoriile? Nu ar fi același lucru cu obținerea tuturor postărilor? Puteți de asemenea specifica care categorii să NU fie incluse. De exemplu: "Totul în afară de Chicago".
