wp получить термины объекта(), чтобы получить список всех терминов, прикрепленных ко всем записям в текущем запросе


Как я могу использовать wp_get_object_terms(), чтобы получить список всех терминов, прикрепленных ко всем записям в текущем запросе?

Например, для текущего запроса я хочу получить массив терминов из таксономии "Альфа", которые содержатся во всех запрошенных сообщениях.

wp_get_object_terms($wp_query, 'alfa');

Но это, похоже, возвращает только один элемент в массиве...

Я делаю это, чтобы создать массив для перекрестной проверки одной таксономии с другой для меню навигации, и в настоящее время я делаем это с помощью следующего кода, но я думаю, что должен быть лучший способ.

Пожалуйста, помогите! Спасибо!

$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);
Author: HandiworkNYC.com, 2012-04-26

2 answers

Я думаю, что вы на правильном пути, потому что wp_get_object_terms() может использовать массив идентификаторов в качестве своего первого аргумента, просто $wp_query - это не тот массив, который вам нужен.

Я не могу гарантировать, что это более эффективно (не моя область знаний), но я считаю, что этот [частично протестированный] фрагмент будет делать то, что вы хотите, по крайней мере, на один цикл меньше, и нет array_unique():

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// make array for the post IDs
$my_post_ids = array();
// loop through posts array for IDs
foreach( $my_posts as $my_post ) {
    $my_post_ids[] = $my_post->ID;
}
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

wp_get_object_terms() принимает 3-й параметр $args, который вам может потребоваться установить, чтобы получить желаемый результат, но я оставлю это на ты.

ОБНОВЛЕНИЕ: Это может быть еще короче с помощью функции "Новое для меня" wp_list_pluck(). Опять же, это непроверено, но выглядит правильно:

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// NEW: make array of the post IDs in one step
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

Вы можете видеть в исходном коде , что он выполняет тот же код foreach циклов, но выглядит немного приятнее.

 5
Author: mrwweb, 2012-05-25 15:15:53

Это обобщение вышесказанного сработало для меня:

$args = array( 'cat' = -1 ); // e.g. to get list of posts in any category
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // your taxonomy name
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // distinct term names

Он выводит уникальный список терминов в пользовательской таксономии "mytax". Спасибо @mrwweb:-)

 3
Author: Jon, 2014-02-12 00:49:48