Includere tutti i termini nella tax_query di WordPress
Sono un po' confuso, perché non riesco a includere automaticamente tutti i termini nella tax_query?
Il mio codice:
'tax_query' => array(
array(
'taxonomy' => 'city',
'field' => 'slug',
'terms' => array( nyc, boston, london ),
)
)
Cosa succede se ho decine di città? Non è poco pratico aggiungerle tutte manualmente?

A meno che tu non abbia post che non hanno una città, in pratica non stai interrogando tutti i tuoi post? Comunque, Eric Holmes ha ragione nel suggerire di utilizzare WP_Query
invece di query_posts()
.
Detto questo, puoi ottenere una lista di tutti i termini in una tassonomia e poi utilizzare quei valori nella tua query tassonomica.
// ottieni tutti i termini nella tassonomia
$terms = get_terms( 'city' );
// converti l'array di oggetti termine in un array di ID termine
$term_ids = wp_list_pluck( $terms, 'term_id' );
// procedi con la query tassonomica
$args = array ('tax_query' => array(
array(
'taxonomy' => 'city',
'field' => 'term_id',
'terms' => $term_ids,
)
)
);
$city_posts = new WP_Query( $args );

Grazie, ho selezionato WP_Query
. Sembra meglio di query_posts(), perché dopo tutto query_posts()
è una funzione che ritorna a WP_Query
. E invece di term_ids ho usato 'taxonomy' => 'city
per includere tutto in esso.

Oltre alla risposta contrassegnata come 'migliore risposta', esiste un altro metodo che potrebbe essere ancora più veloce perché non dobbiamo prima recuperare i termini ed estrarre i nomi.
Questo si ottiene con un trucco utilizzando un operatore inesistente (nessuno tra 'IN', 'NOT IN', 'AND', 'EXISTS' e 'NOT EXISTS'). Ad esempio, la stringa 'XXX' fa al caso nostro e fa sì che WP non entri nei casi durante la generazione della query, saltando quindi anche la concatenazione 0=1.
(I casi si trovano nella funzione get_sql_for_clause()
del file class-wp-tax-query.php, dove gli operatori consentiti vengono verificati tramite condizioni e non c'è un 'else').
$args = array ('tax_query' =>
array(
array(
'taxonomy' => 'city',
//'field' => 'term_id', // <-- non necessario, default
//'terms' => $term_ids, // <-- non necessario
'operator' => 'XXX' // Usa un operatore inesistente
)
)
);

Innanzitutto, non utilizzare query_posts
. Crea invece un nuovo oggetto WP_Query
.
In secondo luogo, perché dovresti aggiungere tutte le categorie, se stai letteralmente aggiungendo TUTTE le categorie? Non sarebbe lo stesso che ottenere tutti i post? Puoi anche specificare quali escludere. Ad esempio "Tutto tranne Chicago".
