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

26 апр. 2012 г., 03:52:26
Просмотры: 17.6K
Голосов: 4

Как я могу использовать 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);
5
Комментарии

Вы передаете весь объект $wp_query в функцию? Думаю, это не правильно.

Rutwick Gangurde Rutwick Gangurde
26 апр. 2012 г. 08:10:27

Пожалуй, я просто хочу понять, является ли код, который я опубликовал, самым быстрым способом получить все записи из запроса

HandiworkNYC.com HandiworkNYC.com
26 апр. 2012 г. 19:15:36

Все, что будет быстрее, потребует написания кучи кастомного SQL... Вам это интересно или текущий способ подойдет?

Rarst Rarst
26 апр. 2012 г. 19:57:36

Мне нужна скорость! Если вы знаете, как этого добиться с помощью кастомного SQL, я буду бесконечно благодарен.

HandiworkNYC.com HandiworkNYC.com
27 апр. 2012 г. 00:57:05

Думаю, это и некоторые модификации могут сработать http://wordpress.stackexchange.com/a/50176/7314

Alexey Alexey
30 апр. 2012 г. 11:53:56
Все ответы на вопрос 2
1

Я думаю, вы на правильном пути, потому что 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, но выглядит немного аккуратнее.

4 мая 2012 г. 07:05:18
Комментарии

@j-man86 если это решило вашу проблему, не забудьте отметить ответ как принятый. В противном случае обновите свой вопрос и объясните, почему это не сработало.

mrwweb mrwweb
8 мая 2012 г. 22:23:43
1

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

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

17 нояб. 2012 г. 03:49:10
Комментарии

есть идеи, почему это может не работать для woocommerce и pa_color?

Samyer Samyer
25 апр. 2017 г. 18:40:54