Вывести не больше 10 популярных меток?

Ссылка скопирована
PHP
1 ответ

Добрый день.
Есть код, который выводит все метки одной категории. Как сделать вывод самых популярных меток и ограничить их 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 } ?>

Дополнительно

Вывести не больше 10 популярных меток?

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 } ?>

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

В вашем варианте 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>';
    }
}

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

shuffle($tags); $tags = array_slice($tags, 0, 10);

Но для пользователя обычно понятнее именно популярные метки: они стабильные и не прыгают при каждом обновлении страницы. На крупном сайте get_objects_in_term может быть тяжелым, потому что сначала собирает ID всех записей рубрики. Тогда результат стоит кэшировать transient-ом по ID рубрики и очищать кэш при сохранении записей. Для небольшого блога такой код можно использовать прямо в шаблоне рубрики.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно