web-dev-qa-db-fra.com

Exclure une balise spécifique de la liste get_the_tags

Je construis un thème enfant pour mon usage personnel. Pas très familier avec php, ne peut faire que des choses basiques basées sur la logique. Je dois exclure une balise de la liste de balises d'un message. De préférence, rien n’est affiché du tout lorsque cette balise est la seule balise affectée à la publication (je veux dire, pas de titre "Balises", rien).

Voici ce que j'ai du thème parent:

$tags = get_the_tags( $post->ID );
$separator = ' ';
$output = '';
if($tags){
echo '<div class="entry-tags">';
    echo "<p><span>" . __('Tags', 'tracks') . "</span>";
        foreach($tags as $tag) {
            $output .= '<a href="'.get_tag_link( $tag->term_id ).'" title="' . esc_attr( sprintf( __( "View all posts tagged %s", 'tracks' ), $tag->name ) ) . '">'.$tag->name.'</a>'.$separator;
            }
            echo trim($output, $separator);
        echo "</p>";
    echo "</div>";
}

J'ai essayé d'appliquer ceci solution, mais cela n'a pas fonctionné. Probablement parce que je ne comprends pas bien ce que je fais. :)

Quelqu'un pourrait-il m'aider avec ça?.

1
Jaaaarne
$tags = get_the_tags( $post->ID );
$separator = ' ';
$output = '';
if($tags){
echo '<div class="entry-tags">';
    echo "<p><span>" . __('Tags', 'tracks') . "</span>";
        foreach($tags as $tag) {
            // dpm($tag) here by uncomment you can check tag slug which you want to exclude
            if($tag->slug != "yourtag"){ // replace yourtag with you required tag name
               $output .= '<a href="'.get_tag_link( $tag->term_id ).'" title="' . esc_attr( sprintf( __( "View all posts tagged %s", 'tracks' ), $tag->name ) ) . '">'.$tag->name.'</a>'.$separator;
            }
          }
            echo trim($output, $separator);
        echo "</p>";
    echo "</div>";
}

Vous pouvez appliquer la condition que si le nom de la variable n’est pas égal à votre balise, seul celui-ci sera ajouté à out put.

Merci!

0
jas

get_the_tags() UTILISE get_the_terms() :

1265            return apply_filters( 'get_the_tags', get_the_terms( $id, 'post_tag' ) );

Qui à son tour applique un filtre :

1372            $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );

Vous pouvez utiliser ce filtre pour exclure le (s) terme (s) souhaité (s). La réponse est effectivement la même que pour cette question , bien que la séquence des appels de fonctions dans Core soit légèrement différente:

function exclude_my_term($terms, $post, $taxonomy) {
  remove_filter('get_the_terms','exclude_my_term',10,3);
  unset($terms[123]); // where 123 is the ID of the term to exclude
  return $terms;
}
add_filter('get_the_terms','exclude_my_term',10,3);
1
s_ha_dum

J'ai trouvé une réponse similaire sur Stack Overflow, ce qui, à mon avis, est plus clair. Pour exclure une balise de get_the_tag_list, appliquez un filtre à get_terms:

add_filter('get_the_terms', 'exclude_terms');
echo get_the_tag_list('<p class="text-muted"><i class="fa fa-tags">',', ','</i></p>');
remove_filter('get_the_terms', 'exclude_terms');

Ajoutez un filtre sur get_the_terms, puis supprimez-le immédiatement après l'écho.

La fonction de rappel supprime les termes par identifiants ou slugs:

function exclude_terms($terms) {
    $exclude_terms = array(9,11); //put term ids here to remove!
    if (!empty($terms) && is_array($terms)) {
        foreach ($terms as $key => $term) {
            if (in_array($term->term_id, $exclude_terms)) {
                unset($terms[$key]);
            }
        }
    }

    return $terms;
}

Vous pouvez faire exactement la même chose pour get_the_category_list - créez simplement une fonction de rappel en double avec un nom différent - par exemple, exclude-cats - puis ajoutez les identifiants que vous souhaitez exclure et appliquez le filtre:

add_filter('get_the_terms', 'exclude_cats');
echo get_the_category_list('<p class="text-muted"><i class="fa fa-tags">',', ','</i></p>');
remove_filter('get_the_terms', 'exclude_cats');

Je suppose que vous pouvez créer cette fonction et transmettre les identifiants ...

0
Bernard Meisler