Includere tutti i termini nella tax_query di WordPress

17 mar 2014, 20:33:01
Visualizzazioni: 25K
Voti: 6

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?

3
Commenti

Stai interrogando i post? O un custom post type? Voglio dire, ogni post avrà una città assegnata?

helgatheviking helgatheviking
17 mar 2014 20:49:58

Sì, sto interrogando i post usando "query_posts".

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

Non è per niente cool, forse non ti serve un Tax Query ma semplicemente un parametro - 'taxonomy' => 'city'

Howdy_McGee Howdy_McGee
17 mar 2014 20:59:05
Tutte le risposte alla domanda 3
2
14

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

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.

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

No, mi sbagliavo con solo 'taxonomy' => 'city'. Perché include tutti i post. Dovrò includere term_ids. Grazie per la soluzione.

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

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
         )
     )
);
17 gen 2018 14:27:08
Commenti

Questo è particolarmente utile se vuoi recuperare post che non appartengono a nessun termine tassonomico. Questa soluzione mi ha effettivamente salvato da una query eccessivamente complicata - puoi usare un ID termine specifico o permettere tutti i post. Grazie mille!

physalis physalis
5 lug 2023 14:03:13
0

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

17 mar 2014 21:00:38