WordPress: выводим список всех тегов (меток) в рубрике

В одном из заказов на разработку шаблона для WordPress понадобилось выполнить нестандартную задачу – в рубрике вывести список всех тегов из статей, которые в ней находятся.

Как обычно в таких случаях, поискал решение в Интернете. Нашлось несколько вариантов. Что-то не работало, что-то было затратно по ресурсам сервера (берутся все статьи рубрики и из них циклом вытягиваются теги с дальнейшим удалением дубликатов). Но следующий оказался оптимальным и с минимумом кода, благодаря имеющимся в WordPress функциям для работы с терминами, которыми и являются элементы в таксономиях “Рубрика” и “Метка (тег)”.

Итак, в шаблон рубрики (это может быть файл index.php, или archive.php, или category.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 } ?>

Если необходимо вывести этот список в любом месте шаблона, то замените get_query_var( 'cat' ) на ID рубрики (узнать его можно одним способов: так или так).

Стоит отметить, что данные берутся только для текущей рубрики, без учета подрубрик. Чтобы вывести теги с учетом подрубрик всех уровней вложенности, в вышеуказанном коде необходимо заменить вторую строку ($post_ids = ...) на этот код:


$cat = get_query_var( 'cat' );
$cat_ids = get_term_children( $cat, 'category' );
array_push( $cat_ids, $cat );
$post_ids = get_objects_in_term( $cat_ids, 'category' );

Комментарии (5)

  1. В моем случае подобный код вывалит фатальную ошибку базы данных, так как длина массива, переданного в констркцию IN() в недрах wp_get_object_terms() имеет ограничения. А записей на сайте более 2х миллионов.

    Меня спасал хитрый JOIN в кастомном запросе.

  2. Просто возникает вопрос: “Зачем?”. Зачем выводить теги в рубрике – это ведь и дополнительная нагрузка на сервер (хоть и небольшая, используя твой способ) и целесообразность этого вызывает сомнения.

  3. Ну если заказчику так хочется, то почему бы и нет. Тем более если задача не типовая, то готовое решение может сэкономить массу времени )

  4. Спасибо. Работает. Как раз искал готовое решение, чтоб быстро внедрить. А нужно это, когда занимаешься seo-оптимизацией тегов и они осмысленны на сайте, а не просто ради того, чтобы были.

Ваш комментарий