Verificar si una etiqueta se usa en publicaciones

24 oct 2011, 21:19:09
Vistas: 14.1K
Votos: 5

Estoy usando etiquetas del sitio para un glosario. Me gustaría mostrar un enlace a la página de la etiqueta si existe, de lo contrario solo mostrar el título de la etiqueta. ¿Existe alguna verificación que me permita determinar si la etiqueta ha sido asignada a publicaciones?

    $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( __( "Ver todas las publicaciones en %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
      }
    }

(Funcionando) Actualización según la recomendación de 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( __( "Ver todas las publicaciones en %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>';
        }
      }
    }

Ejemplo del resultado final https://i.sstatic.net/Ph751.png

2
Comentarios

Una cosa que no entiendo; dices: "Me gustaría mostrar un enlace a la página etiquetada si la etiqueta existe". Pregunta: ¿de dónde viene el nombre de la etiqueta, si no es de una etiqueta existente?

Chip Bennett Chip Bennett
24 oct 2011 22:18:05

Las etiquetas provienen de las etiquetas y descripciones que se generaron manualmente para crear un glosario. Si las etiquetas se usan en una publicación, entonces me gustaría que apunten a esa página de etiqueta.

Zach Shallbetter Zach Shallbetter
24 oct 2011 22:45:05
Todas las respuestas a la pregunta 2
7

Prueba utilizando la etiqueta condicional de plantilla has_tag(). Por ejemplo, para consultar la etiqueta "foobar":

<?php
if ( has_tag( 'foobar' ) ) {
    // El post actual tiene la etiqueta "foobar";
    // hacer algo
} else {
    // El post actual NO tiene la etiqueta "foobar";
    // hacer otra cosa
}
?>

Si estás dentro del Loop, simplemente llama <?php has_tag( $tag ); ?>; si estás fuera del Loop, necesitarás pasar el ID del post: <?php has_tag( $tag, $post ); ?>

Así, aproximando tu código:

$tags = get_tags( array( 'hide_empty' => false ) );
if ( $tags ) {
    foreach ( $tags as $tag ) {
        if ( has_tag( $tag->slug ) ) {
            // El post actual tiene $tag;
            // mostrar el enlace de la etiqueta
            echo '<dt style="display:inline; float:left; padding-right:5px;"><strong><a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Ver todos los posts en %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        } else {
            // El post actual NO tiene la etiqueta;
            // mostrar solo el nombre de la etiqueta
            echo $tag->name;
        }
    }
}

EDITADO

Otra idea: si estás extrayendo de una lista arbitraria de términos y quieres determinar si ese término se usa como etiqueta de post, puedes probar usando el condicional term_exists(); por ejemplo, si quieres saber si 'foobar' se usa como etiqueta de post:

<?php 
if ( term_exists( 'foobar', 'post_tag' ) ) {
    // El término 'foobar' se usa como etiqueta de post;
    // hacer algo
}
?>

Pero sigo confundido sobre tu fuente de "etiquetas" aquí.

EDITADO 2

Ahora consultaremos basándonos en que el contador de etiquetas sea mayor que cero (es decir, la etiqueta ha sido usada en al menos un post):

    $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( __( "Ver todos los posts en %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 oct 2011 21:27:39
Comentarios

Sí, esto está fuera del bucle. Probé ambas recomendaciones y no parecieron funcionar. Parece que simplemente está omitiendo el if ( has_tag( $tag->slug ) ) {. Actualicé mi publicación. Puedes verlo en acción aquí http://www.openeye.net/glossary

Zach Shallbetter Zach Shallbetter
24 oct 2011 22:03:50

Ver respuesta actualizada. ¿De dónde estás obteniendo tu array de términos del glosario?

Chip Bennett Chip Bennett
24 oct 2011 22:21:31

Creé manualmente muchas de las etiquetas y agregué la descripción. Usamos muchos de los términos actualmente en el sitio y planeamos usar todos eventualmente cuando agreguemos el Q&A.

Zach Shallbetter Zach Shallbetter
24 oct 2011 22:27:38

"Creé manualmente muchas de las etiquetas y agregué la descripción." - entonces, estas son etiquetas de publicaciones existentes, pero necesitas saber si el conteo es mayor que cero? ¡Eso es aún más fácil!

Chip Bennett Chip Bennett
24 oct 2011 22:35:13

Correcto, me gustaría mostrar un enlace si existe una publicación.

Zach Shallbetter Zach Shallbetter
24 oct 2011 22:38:42

¡Bueno, entonces mira la edición #2! :)

Chip Bennett Chip Bennett
24 oct 2011 22:39:01

Eso funcionó, sin embargo moví ( 0 < $tag->count ) desde debajo del foreach hasta donde estaba has_tag( $tag->slug ). Ahora si la publicación tiene una descripción, se mostrará en la lista y si la etiqueta está conectada a una publicación, mostrará un enlace. ¡Excelente trabajo Chip! Actualicé mi publicación con el código funcional.

Zach Shallbetter Zach Shallbetter
24 oct 2011 22:42:08
Mostrar los 2 comentarios restantes
0

Puedes utilizar el campo count devuelto por get_tags para verificar si tiene publicaciones o no, algo así:

$tags = get_tags( array( 'hide_empty' => false ) );
if ($tags) {
    foreach ($tags as $tag) {
        echo '<dt style="display:inline; float:left; padding-right:5px;"><strong>';
        //verificar el conteo de etiquetas
        if($tag->count > 0){
            //está siendo usado en publicaciones
            if ($tag->description) {
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Ver todas las publicaciones en %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( __( "Ver todas las publicaciones en %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt>';
            }
        }else{
            //no hay publicaciones
            echo $tag->name;
            if ($tag->description)
                echo '<dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
    }
}
24 oct 2011 22:34:15