Вывести не больше 10 популярных меток?
Добрый день.
Есть код, который выводит все метки одной категории. Как сделать вывод самых популярных меток и ограничить их 10 метками. Впринципе можно и 10 меток рандомно.
Код
<?php $post_ids = get_objects_in_term( get_query_var( 'cat' ), 'category' ); if ( ! empty( $post_ids ) && ! is_wp_error( $post_ids ) ) { $tags = wp_get_object_terms( $post_ids, 'post_tag' ); if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) { ?> <ul> <?php foreach( $tags as $tag ) { ?> <li><a href="<?php echo get_term_link( $tag, 'post_tag' ); ?>"><?php echo $tag->name; ?></a></li> <?php } ?> </ul> <?php } ?> <?php } ?> |
<?php $post_ids = get_objects_in_term( get_query_var( 'cat' ), 'category' ); if ( ! empty( $post_ids ) && ! is_wp_error( $post_ids ) ) { $tags = wp_get_object_terms( $post_ids, 'post_tag' ); if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) { ?> <ul> <?php foreach( $tags as $tag ) { ?> <li><a href="<?php echo get_term_link( $tag, 'post_tag' ); ?>"><?php echo $tag->name; ?></a></li> <?php } ?> </ul> <?php } ?> <?php } ?>
Дополнительно
Taulan Khatuaev @i229194964 Веб разработчик
<?php $post_ids = get_objects_in_term( get_query_var( 'cat' ), 'category' ); if ( ! empty( $post_ids ) && ! is_wp_error( $post_ids ) ) { $tags = get_terms( array( 'taxonomy' => 'post_tag', 'object_ids' => $post_ids, 'orderby' => 'count', 'order' => 'DESC', 'number' => 10 ) ); if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) { shuffle($tags); ?> <ul> <?php foreach( $tags as $tag ) { ?> <li><a href="<?php echo get_term_link( $tag, 'post_tag' ); ?>"><?php echo $tag->name; ?></a></li> <?php } ?> </ul> <?php } ?> <?php } ?> |
<?php $post_ids = get_objects_in_term( get_query_var( 'cat' ), 'category' ); if ( ! empty( $post_ids ) && ! is_wp_error( $post_ids ) ) { $tags = get_terms( array( 'taxonomy' => 'post_tag', 'object_ids' => $post_ids, 'orderby' => 'count', 'order' => 'DESC', 'number' => 10 ) ); if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) { shuffle($tags); ?> <ul> <?php foreach( $tags as $tag ) { ?> <li><a href="<?php echo get_term_link( $tag, 'post_tag' ); ?>"><?php echo $tag->name; ?></a></li> <?php } ?> </ul> <?php } ?> <?php } ?>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В вашем варианте wp_get_object_terms возвращает все метки, которые привязаны к записям текущей рубрики. Ограничения и сортировки по популярности там нет, поэтому список может быть длинным. Для задачи лучше взять ID записей рубрики, затем запросить термины post_tag только для этих объектов через get_terms, отсортировать по count и поставить number 10.
$cat_id = get_queried_object_id(); $post_ids = get_objects_in_term($cat_id, 'category'); if (! empty($post_ids) && ! is_wp_error($post_ids)) { $tags = get_terms([ 'taxonomy' => 'post_tag', 'object_ids' => $post_ids, 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hide_empty' => true, ]); if (! empty($tags) && ! is_wp_error($tags)) { echo '<ul class="popular-tags">'; foreach ($tags as $tag) { $link = get_term_link($tag, 'post_tag'); if (is_wp_error($link)) { continue; } echo '<li><a href="' . esc_url($link) . '">' . esc_html($tag->name) . '</a></li>'; } echo '</ul>'; } }
Если нужны не самые популярные, а случайные 10 меток, не смешивайте это с orderby count. Получите подходящие метки, перемешайте массив и обрежьте его:
shuffle($tags); $tags = array_slice($tags, 0, 10);
Но для пользователя обычно понятнее именно популярные метки: они стабильные и не прыгают при каждом обновлении страницы. На крупном сайте get_objects_in_term может быть тяжелым, потому что сначала собирает ID всех записей рубрики. Тогда результат стоит кэшировать transient-ом по ID рубрики и очищать кэш при сохранении записей. Для небольшого блога такой код можно использовать прямо в шаблоне рубрики.