Проверить, используется ли метка в записях

24 окт. 2011 г., 21:19:09
Просмотры: 14.1K
Голосов: 5

Я использую метки сайта для глоссария. Я хотел бы отображать ссылку на страницу с меткой, если она существует, в противном случае просто показывать название метки. Есть ли проверка, которая позволит мне определить, используется ли метка в записях?

    $tags = get_tags( array( 'hide_empty' => false ) );
    if ($tags) {
      foreach ($tags as $tag) {
        if ($tag->description) {
          echo '<dt style="display:inline; float:left; padding-right:5px;"><strong><a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
      }
    }

(Рабочее) Обновление по рекомендации Chip'а

    $tags = get_tags( array( 'hide_empty' => false ) );
    if ($tags) {
      foreach ($tags as $tag) {
        if ($tag->description) {
          echo '<dt style="display:inline; float:left; padding-right:5px;"><strong>';
              if ( 0 < $tag->count ){
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a>';
              } else {
                echo $tag->name;
              }
          echo '</strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
      }
    }

Пример конечного результата https://i.sstatic.net/Ph751.png

2
Комментарии

Одного я не понимаю: вы говорите: "Я хотел бы отображать ссылку на страницу с тегом, если тег существует". Вопрос: откуда берется название тега, если не из существующего тега?

Chip Bennett Chip Bennett
24 окт. 2011 г. 22:18:05

Теги берутся из тегов и описаний, которые были созданы вручную для формирования глоссария. Если теги используются в записи, то я хочу, чтобы они вели на соответствующую страницу тега.

Zach Shallbetter Zach Shallbetter
24 окт. 2011 г. 22:45:05
Все ответы на вопрос 2
7

Попробуйте использовать условный тег шаблона has_tag(). Например, для проверки наличия тега "foobar":

<?php
if ( has_tag( 'foobar' ) ) {
    // Текущая запись имеет тег "foobar";
    // выполняем какие-то действия
} else {
    // Текущая запись НЕ имеет тега "foobar";
    // выполняем другие действия
}
?>

Если вы находитесь внутри цикла (Loop), просто вызовите <?php has_tag( $tag ); ?>; если вы снаружи цикла, вам нужно передать ID записи: <?php has_tag( $tag, $post ); ?>

Приблизительный вариант вашего кода:

$tags = get_tags( array( 'hide_empty' => false ) );
if ( $tags ) {
    foreach ( $tags as $tag ) {
        if ( has_tag( $tag->slug ) ) {
            // Текущая запись имеет тег $tag;
            // выводим ссылку на тег
            echo '<dt style="display:inline; float:left; padding-right:5px;"><strong><a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        } else {
            // Текущая запись НЕ имеет тега;
            // выводим только название тега
            echo $tag->name;
        }
    }
}

РЕДАКТИРОВАНИЕ

Другая мысль: если вы получаете список терминов произвольно и хотите определить, используется ли этот термин как тег записи, можно попробовать использовать условную функцию term_exists(); например, чтобы проверить, используется ли 'foobar' как тег записи:

<?php 
if ( term_exists( 'foobar', 'post_tag' ) ) {
    // Термин 'foobar' используется как тег записи;
    // выполняем какие-то действия
}
?>

Но я всё ещё не до конца понимаю источник ваших "тегов" в данном случае.

РЕДАКТИРОВАНИЕ 2

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

    $tags = get_tags( array( 'hide_empty' => false ) );
    if ($tags) {
      foreach ($tags as $tag) {
        if ( 0 < $tag->count ) {
          echo '<dt style="display:inline; float:left; padding-right:5px;"><strong>';
              if ( has_tag( $tag->slug ) ) {
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a>';
              } else {
                echo $tag->name;
              }
          echo '</strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
      }
    }
24 окт. 2011 г. 21:27:39
Комментарии

Да, это находится вне цикла. Я попробовал оба ваших предложения, но они, кажется, не сработали. Похоже, что условие просто пропускается if ( has_tag( $tag->slug ) ) {. Я обновил свою запись, вы можете увидеть это в действии здесь http://www.openeye.net/glossary

Zach Shallbetter Zach Shallbetter
24 окт. 2011 г. 22:03:50

Смотрите обновлённый ответ. Откуда вы получаете массив терминов глоссария?

Chip Bennett Chip Bennett
24 окт. 2011 г. 22:21:31

Я вручную создал многие из тегов и добавил описание. Мы уже используем многие термины на сайте и планируем использовать все, когда добавим раздел вопросов и ответов.

Zach Shallbetter Zach Shallbetter
24 окт. 2011 г. 22:27:38

"Я вручную создал многие теги и добавил описание." - значит, это существующие теги записей, но вам нужно узнать, больше ли количество нуля? Это ещё проще!

Chip Bennett Chip Bennett
24 окт. 2011 г. 22:35:13

Верно, я хочу отображать ссылку, если запись существует.

Zach Shallbetter Zach Shallbetter
24 окт. 2011 г. 22:38:42

Тогда смотрите правку #2! :)

Chip Bennett Chip Bennett
24 окт. 2011 г. 22:39:01

Это сработало, однако я переместил ( 0 < $tag->count ) из-под foreach туда, где был has_tag( $tag->slug ). Теперь, если у записи есть описание, оно будет отображаться в списке, а если метка связана с записью, будет показана ссылка. Отличная работа, Chip! Я обновил свою запись рабочим кодом.

Zach Shallbetter Zach Shallbetter
24 окт. 2011 г. 22:42:08
Показать остальные 2 комментариев
0

Вы можете использовать поле count, возвращаемое из get_tags, чтобы проверить, есть ли у тега записи или нет, например так:

$tags = get_tags( array( 'hide_empty' => false ) );
if ($tags) {
    foreach ($tags as $tag) {
        echo '<dt style="display:inline; float:left; padding-right:5px;"><strong>';
        //проверяем количество записей у тега
        if($tag->count > 0){
            //тег используется в записях
            if ($tag->description) {
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Посмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
            }else{
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Посмотреть все записи в %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt>';
            }
        }else{
            //нет записей
            echo $tag->name;
            if ($tag->description)
                echo '<dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
    }
}
24 окт. 2011 г. 22:34:15