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);
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
циклов, но выглядит немного приятнее.
Это обобщение вышесказанного сработало для меня:
$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:-)