Verificare se un tag è utilizzato nei post

24 ott 2011, 21:19:09
Visualizzazioni: 14.1K
Voti: 5

Sto usando i tag del sito per un glossario. Vorrei mostrare un link alla pagina con tag se il tag esiste, altrimenti mostrare solo il titolo del tag. C'è un controllo che mi permetterebbe di determinare se il tag è stato utilizzato nei post?

    $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( __( "Visualizza tutti i post in %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
      }
    }

(Funzionante) Aggiornamento dalla raccomandazione di 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( __( "Visualizza tutti i post in %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>';
        }
      }
    }

Esempio del risultato finale https://i.sstatic.net/Ph751.png

2
Commenti

Una cosa che non capisco; dici: "Vorrei mostrare un link alla pagina del tag se il tag esiste". Domanda: da dove viene il nome del tag, se non da un tag esistente?

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

I tag provengono dai tag e dalle descrizioni che sono state generate manualmente per creare un glossario. Se i tag vengono utilizzati in un articolo, vorrei che puntassero a quella pagina del tag.

Zach Shallbetter Zach Shallbetter
24 ott 2011 22:45:05
Tutte le risposte alla domanda 2
7

Prova a utilizzare il tag condizionale del template has_tag(). Ad esempio, per verificare la presenza del tag "foobar":

<?php
if ( has_tag( 'foobar' ) ) {
    // Il post corrente ha il tag "foobar";
    // fai qualcosa
} else {
    // Il post corrente NON ha il tag "foobar";
    // fai qualcos'altro
}
?>

Se sei all'interno del Loop, chiama semplicemente <?php has_tag( $tag ); ?>; se sei all'esterno del Loop, dovrai passare l'ID del post: <?php has_tag( $tag, $post ); ?>

Quindi, approssimando il tuo codice:

$tags = get_tags( array( 'hide_empty' => false ) );
if ( $tags ) {
    foreach ( $tags as $tag ) {
        if ( has_tag( $tag->slug ) ) {
            // Il post corrente ha $tag;
            // mostra il link al tag
            echo '<dt style="display:inline; float:left; padding-right:5px;"><strong><a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Vedi tutti i post in %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt><dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        } else {
            // Il post corrente NON ha il tag;
            // mostra solo il nome del tag
            echo $tag->name;
        }
    }
}

MODIFICA

Quindi, un'altra idea: se stai recuperando da una lista arbitraria di termini e vuoi determinare se quel termine è usato come tag del post, puoi provare a usare il condizionale term_exists(); ad esempio, se vuoi sapere se 'foobar' è usato come tag del post:

<?php 
if ( term_exists( 'foobar', 'post_tag' ) ) {
    // Il termine 'foobar' è usato come tag del post;
    // fai qualcosa
}
?>

Ma sono ancora confuso riguardo alla tua fonte di "tag" qui.

MODIFICA 2

Quindi, ora interrogheremo basandoci sul conteggio dei tag maggiore di zero (cioè, il tag è stato usato almeno in 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( __( "Vedi tutti i post in %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 ott 2011 21:27:39
Commenti

Sì, questo è al di fuori del loop. Ho provato entrambe le tue raccomandazioni ma non sembrano funzionare. Sembra che stia semplicemente saltando il if ( has_tag( $tag->slug ) ) {. Ho aggiornato il mio post. Puoi vederlo in azione qui http://www.openeye.net/glossary

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

Vedi la risposta aggiornata. Dove stai ottenendo il tuo array di termini del glossario?

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

Ho creato manualmente molti dei tag e aggiunto la descrizione. Usiamo già molti dei termini sul sito attualmente e pianifichiamo di utilizzarli tutti quando aggiungeremo la sezione Domande e Risposte.

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

"Ho creato manualmente molti dei tag e ho aggiunto la descrizione." - quindi questi sono tag di articoli esistenti, ma hai bisogno di sapere se il conteggio è maggiore di zero? È ancora più semplice!

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

Esatto, vorrei mostrare un link se esiste un articolo.

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

Bene allora, guarda la modifica #2! :)

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

Ha funzionato, tuttavia ho spostato ( 0 < $tag->count ) da sotto il foreach a dove si trovava has_tag( $tag->slug ). Ora se il post ha una descrizione verrà mostrata nella lista, poi se il tag è collegato a un post mostrerà un link. Ottimo lavoro Chip! Ho aggiornato il mio post con il codice funzionante.

Zach Shallbetter Zach Shallbetter
24 ott 2011 22:42:08
Mostra i restanti 2 commenti
0

Puoi utilizzare il campo count restituito da get_tags per verificare se ha post o meno, in questo modo:

$tags = get_tags( array( 'hide_empty' => false ) );
if ($tags) {
    foreach ($tags as $tag) {
        echo '<dt style="display:inline; float:left; padding-right:5px;"><strong>';
        //verifica il conteggio del tag
        if($tag->count > 0){
            //è utilizzato nei post
            if ($tag->description) {
                echo '<a href="' . get_tag_link( $tag->term_id ) . '" title="' . sprintf( __( "Visualizza tutti i post in %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( __( "Visualizza tutti i post in %s" ), $tag->name ) . '" ' . ' style="text-decoration:none;">' . $tag->name.'</a></strong></dt>';
            }
        }else{
            //nessun post
            echo $tag->name;
            if ($tag->description)
                echo '<dd style="margin-bottom:20px;">' . $tag->description . '</dd>';
        }
    }
}
24 ott 2011 22:34:15