How can I use wp_get_object_terms() to get a list of all the terms attached to all posts in the current query?
For example, for the current query I want to get an array of the terms from the “Alfa” taxonomy that are contained in all the queried posts.
wp_get_object_terms($wp_query, 'alfa');
But that only seems to be returning one item in the array…
I am doing this to build an array to cross check one taxonomy with another for a navigation menu, and am currently doing this with the following code but I think there must be a better way.
Please help! Thanks!
$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);
I think you’re on the right track because
wp_get_object_terms()
can take an array of IDs for its first argument, it’s just that $wp_query is not the array you want.I can’t guarantee that this is more efficient (not my area of expertise), but I believe this [partially-tested] snippet would do what you want with at least one fewer loop and no
array_unique()
:wp_get_object_terms()
takes a 3rd$args
parameter which you may need to set to get the ouput you want, but I’ll leave that to you.UPDATE:
This can be even shorter using the new-to-me function
wp_list_pluck()
. Again this is untested but looks right:You can see in the source that this runs the same
foreach
loops code, but it looks a little nicer.This generalisation of above worked for me:
It outputs a unique list of terms in the ‘mytax’ custom taxonomy. Thanks @mrwweb 🙂