wp_get_object_terms() для получения списка всех терминов, прикрепленных ко всем записям в текущем запросе
Как я могу использовать wp_get_object_terms() для получения списка всех терминов, прикрепленных ко всем записям в текущем запросе?
Например, для текущего запроса я хочу получить массив терминов из таксономии "Alfa", которые содержатся во всех запрошенных записях.
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);

Я думаю, вы на правильном пути, потому что wp_get_object_terms()
может принимать массив ID в качестве первого аргумента, просто $wp_query — не тот массив, который вам нужен.
Я не могу гарантировать, что это более эффективно (не моя область экспертизы), но считаю, что этот [частично протестированный] сниппет сделает то, что вам нужно, с как минимум одним меньшим циклом и без array_unique()
:
// получаем $wp_query
global $wp_query;
// получаем массив объектов записей
$my_posts = $wp_query -> posts;
// создаем массив для ID записей
$my_post_ids = array();
// перебираем массив записей для получения ID
foreach( $my_posts as $my_post ) {
$my_post_ids[] = $my_post->ID;
}
// получаем термины
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );
wp_get_object_terms()
принимает третий параметр $args
, который вам может понадобиться установить для получения нужного результата, но это я оставлю на ваше усмотрение.
ОБНОВЛЕНИЕ:
Это можно сделать еще короче, используя новую для меня функцию wp_list_pluck()
. Опять же, это не тестировалось, но выглядит правильно:
// получаем $wp_query
global $wp_query;
// получаем массив объектов записей
$my_posts = $wp_query -> posts;
// НОВОЕ: создаем массив ID записей в один шаг
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// получаем термины
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );
Вы можете увидеть в исходном коде, что это выполняет те же циклы foreach
, но выглядит немного аккуратнее.

Это обобщение вышеприведенного кода сработало для меня:
$args = array( 'cat' = -1 ); // например, чтобы получить список записей из любой категории
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // название вашей таксономии
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // уникальные названия терминов
Код выводит уникальный список терминов в пользовательской таксономии 'mytax'. Спасибо @mrwweb :-)
