Cómo usar wp_get_object_terms() para obtener una lista de todos los términos vinculados a las publicaciones en la consulta actual
¿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);

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.

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 :-)
