Come usare wp_get_object_terms() per ottenere tutti i termini associati ai post nella query corrente

26 apr 2012, 03:52:26
Visualizzazioni: 17.6K
Voti: 4

Come posso usare wp_get_object_terms() per ottenere un elenco di tutti i termini associati a tutti i post nella query corrente?

Ad esempio, per la query corrente voglio ottenere un array dei termini dalla tassonomia "Alfa" che sono contenuti in tutti i post interrogati.

wp_get_object_terms($wp_query, 'alfa');

Ma sembra che questo restituisca solo un elemento nell'array...

Sto facendo questo per costruire un array per verificare incroci tra una tassonomia e un'altra per un menu di navigazione, e attualmente lo sto facendo con il seguente codice ma penso che ci debba essere un modo migliore.

Per favore aiutatemi! Grazie!

$queried_terms = array();
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
    $postid = $post->ID; 

    if( has_term( '', 'alfa', $postid) ) {
        $terms = get_the_terms( $postid, 'alfa' );
        foreach($terms as $term) {
            $queried_terms[] = $term->slug;
        }
    }

endwhile; endif;
rewind_posts();
wp_reset_query();

$queried_terms = array_unique($queried_terms);
5
Commenti

Stai passando l'intero oggetto $wp_query alla funzione? Immagino che non sia corretto.

Rutwick Gangurde Rutwick Gangurde
26 apr 2012 08:10:27

Immagino che stia solo cercando di capire se il codice che ho postato è il modo più veloce per ottenere tutti i post dalla query

HandiworkNYC.com HandiworkNYC.com
26 apr 2012 19:15:36

Qualsiasi cosa più veloce richiederebbe un sacco di SQL personalizzato... Sei interessato a questo o il tuo metodo attuale va bene?

Rarst Rarst
26 apr 2012 19:57:36

Ho bisogno di velocità! Se sai come ottenere questo risultato con un SQL personalizzato, ti sarei eternamente grato.

HandiworkNYC.com HandiworkNYC.com
27 apr 2012 00:57:05

Penso che questo e alcune modifiche possano fare al caso nostro http://wordpress.stackexchange.com/a/50176/7314

Alexey Alexey
30 apr 2012 11:53:56
Tutte le risposte alla domanda 2
1

Penso che tu sia sulla strada giusta perché wp_get_object_terms() può accettare un array di ID come primo argomento, è solo che $wp_query non è l'array che desideri.

Non posso garantire che questo sia più efficiente (non è la mia area di competenza), ma credo che questo snippet [parzialmente testato] farebbe ciò che vuoi con almeno un ciclo in meno e senza array_unique():

// ottieni $wp_query
global $wp_query;
// ottieni array di oggetti post    
$my_posts = $wp_query -> posts;
// crea array per gli ID dei post
$my_post_ids = array();
// cicla attraverso l'array dei post per gli ID
foreach( $my_posts as $my_post ) {
    $my_post_ids[] = $my_post->ID;
}
// ottieni i termini
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

wp_get_object_terms() accetta un 3° parametro $args che potresti dover impostare per ottenere l'output desiderato, ma lascio a te questa scelta.

AGGIORNAMENTO: Questo può essere ancora più breve utilizzando la funzione per me nuova wp_list_pluck(). Anche questo è non testato ma sembra corretto:

// ottieni $wp_query
global $wp_query;
// ottieni array di oggetti post    
$my_posts = $wp_query -> posts;
// NUOVO: crea array degli ID dei post in un solo passaggio
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// ottieni i termini
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

Puoi vedere nel sorgente che esegue lo stesso codice dei cicli foreach, ma sembra un po' più pulito.

4 mag 2012 07:05:18
Commenti

@j-man86 se questo ha risolto il tuo problema, assicurati di accettarlo come risposta. Altrimenti, aggiorna la tua domanda e spiega perché non ha funzionato.

mrwweb mrwweb
8 mag 2012 22:23:43
1

Questa generalizzazione di quanto sopra ha funzionato per me:

$args = array( 'cat' = -1 ); // ad esempio per ottenere l'elenco dei post in qualsiasi categoria
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // il nome della tua tassonomia
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // nomi dei termini distinti

Restituisce un elenco univoco di termini nella tassonomia personalizzata 'mytax'. Grazie @mrwweb :-)

17 nov 2012 03:49:10
Commenti

qualche idea sul perché questo non funzionerebbe con woocommerce e pa_color?

Samyer Samyer
25 apr 2017 18:40:54