Includerea tuturor termenilor în tax_query WordPress

17 mar. 2014, 20:33:01
Vizualizări: 25K
Voturi: 6

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?

3
Comentarii

Interoghezi postări? Sau un tip personalizat de postare? Adică, fiecare postare va avea un oraș atribuit?

helgatheviking helgatheviking
17 mar. 2014 20:49:58

Da, interoghez postări folosind "query_posts".

wp student wp student
17 mar. 2014 20:51:11

Asta nu e deloc ok, poate nu ai nevoie de o interogare de taxonomie ci doar de un parametru - 'taxonomy' => 'city'

Howdy_McGee Howdy_McGee
17 mar. 2014 20:59:05
Toate răspunsurile la întrebare 3
2
14

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 );
17 mar. 2014 21:08:29
Comentarii

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.

wp student wp student
17 mar. 2014 23:19:57

Nu, am greșit cu 'taxonomy' => 'city' doar. Pentru că include toate articolele. Va trebui să includ term_ids. Mulțumesc pentru soluție.

wp student wp student
17 mar. 2014 23:39:39
1

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
         )
     )
);
17 ian. 2018 14:27:08
Comentarii

Acest lucru este deosebit de util dacă dorești să obții postări care nu se află în nicio taxonomie. Această soluție m-a scutit de a complica inutil o interogare - fie folosești un ID de termen dat, fie permiteri toate postările. Mulțumesc mult!

physalis physalis
5 iul. 2023 14:03:13
0

Î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".

17 mar. 2014 21:00:38