Cómo usar wp_get_object_terms() para obtener una lista de todos los términos vinculados a las publicaciones en la consulta actual

26 abr 2012, 03:52:26
Vistas: 17.6K
Votos: 4

¿Cómo puedo usar wp_get_object_terms() para obtener una lista de todos los términos vinculados a todas las publicaciones en la consulta actual?

Por ejemplo, para la consulta actual quiero obtener un array de los términos de la taxonomía "Alfa" que están contenidos en todas las publicaciones consultadas.

wp_get_object_terms($wp_query, 'alfa');

Pero eso solo parece devolver un elemento en el array...

Estoy haciendo esto para construir un array para comparar una taxonomía con otra para un menú de navegación, y actualmente lo estoy haciendo con el siguiente código pero creo que debe haber una mejor manera.

¡Por favor ayuda! ¡Gracias!

$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
Comentarios

¿Estás pasando el objeto completo $wp_query a la función? Supongo que eso no es correcto.

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

Supongo que solo estoy buscando ver si el código que publiqué es la forma más rápida de obtener todas las publicaciones de la consulta

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

Cualquier cosa más rápida requeriría un montón de SQL personalizado... ¿Te interesa eso o tu forma actual será suficiente?

Rarst Rarst
26 abr 2012 19:57:36

¡Necesito velocidad! Si sabes cómo lograrlo con un SQL personalizado, te estaré eternamente agradecido.

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

Creo que esto y algunas modificaciones podrían hacer el truco http://wordpress.stackexchange.com/a/50176/7314

Alexey Alexey
30 abr 2012 11:53:56
Todas las respuestas a la pregunta 2
1

Creo que vas por el buen camino porque wp_get_object_terms() puede aceptar un array de IDs como primer argumento, simplemente $wp_query no es el array que necesitas.

No puedo garantizar que esto sea más eficiente (no es mi área de especialización), pero creo que este fragmento [parcialmente probado] haría lo que deseas con al menos un bucle menos y sin array_unique():

// obtener $wp_query
global $wp_query;
// obtener array de objetos de post    
$my_posts = $wp_query -> posts;
// crear array para los IDs de posts
$my_post_ids = array();
// recorrer array de posts para obtener IDs
foreach( $my_posts as $my_post ) {
    $my_post_ids[] = $my_post->ID;
}
// obtener los términos
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

wp_get_object_terms() acepta un tercer parámetro $args que quizás necesites configurar para obtener el resultado deseado, pero eso lo dejo a tu criterio.

ACTUALIZACIÓN: Esto puede ser aún más corto usando la función nueva para mí wp_list_pluck(). De nuevo, esto no está probado pero parece correcto:

// obtener $wp_query
global $wp_query;
// obtener array de objetos de post    
$my_posts = $wp_query -> posts;
// NUEVO: crear array de IDs de posts en un solo paso
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// obtener los términos
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

Puedes ver en el código fuente que esto ejecuta el mismo bucle foreach, pero se ve un poco más limpio.

4 may 2012 07:05:18
Comentarios

@j-man86 si esto resolvió tu problema, asegúrate de aceptarlo como la respuesta. De lo contrario, actualiza tu pregunta y explica por qué esto no funcionó.

mrwweb mrwweb
8 may 2012 22:23:43
1

Esta generalización del código anterior funcionó para mí:

$args = array( 'cat' = -1 ); // por ejemplo, para obtener lista de posts en cualquier categoría
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // nombre de tu taxonomía personalizada
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // nombres de términos únicos

Genera una lista única de términos en la taxonomía personalizada 'mytax'. Gracias @mrwweb :-)

17 nov 2012 03:49:10
Comentarios

¿alguna idea de por qué esto no funcionaría para woocommerce y pa_color?

Samyer Samyer
25 abr 2017 18:40:54