Skip to main content
deleted 3 characters in body
Source Link
Pieter Goosen
  • 55.4k
  • 23
  • 115
  • 209
$links = [];
$tags_to_include = [ 1[1, 2, 3]; // using ID's
foreach (get_the_tags() as $this_tag) {
    // If the tag is not in our include list, skip it 
    if ( !in_array( $this_tag->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
        continue;

    // If we are here, our tag is in the list
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>'; 
} 
echo implode(' • ', $links);
function remove_some_tags( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1[1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}
add_filter( 'get_the_terms', function ( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1[1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}, 10, 3 );
$links = [];
$tags_to_include = [ 1, 2, 3]; // using ID's
foreach (get_the_tags() as $this_tag) {
    // If the tag is not in our include list, skip it 
    if ( !in_array( $this_tag->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
        continue;

    // If we are here, our tag is in the list
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>'; 
} 
echo implode(' • ', $links);
function remove_some_tags( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}
add_filter( 'get_the_terms', function ( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}, 10, 3 );
$links = [];
$tags_to_include = [1, 2, 3]; // using ID's
foreach (get_the_tags() as $this_tag) {
    // If the tag is not in our include list, skip it 
    if ( !in_array( $this_tag->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
        continue;

    // If we are here, our tag is in the list
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>'; 
} 
echo implode(' • ', $links);
function remove_some_tags( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}
add_filter( 'get_the_terms', function ( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}, 10, 3 );
added 2387 characters in body
Source Link
Pieter Goosen
  • 55.4k
  • 23
  • 115
  • 209

EDIT

From your comment to your own question, you have two choices if you do not need to apply the filter globally to all instances of get_the_terms)

OPTION 1

Use the same logic as in my ORIGINAL ANSWER

$links = [];
$tags_to_include = [ 1, 2, 3]; // using ID's
foreach (get_the_tags() as $this_tag) {
    // If the tag is not in our include list, skip it 
    if ( !in_array( $this_tag->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
        continue;

    // If we are here, our tag is in the list
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>'; 
} 
echo implode(' • ', $links);

OPTION 2

Still use the filter, but remove it when done

First define our call back function

function remove_some_tags( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}

Now you can do:

// Add our filter
add_filter( 'get_the_terms', 'remove_some_tags' );

$links = []; 
foreach (get_the_tags() as $this_tag) {  
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>';  
} 
echo implode(' • ', $links);

// Remove the filter       
remove_filter( 'get_the_terms', 'remove_some_tags' );

ORIGINAL ANSWER

EDIT

From your comment to your own question, you have two choices if you do not need to apply the filter globally to all instances of get_the_terms)

OPTION 1

Use the same logic as in my ORIGINAL ANSWER

$links = [];
$tags_to_include = [ 1, 2, 3]; // using ID's
foreach (get_the_tags() as $this_tag) {
    // If the tag is not in our include list, skip it 
    if ( !in_array( $this_tag->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
        continue;

    // If we are here, our tag is in the list
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>'; 
} 
echo implode(' • ', $links);

OPTION 2

Still use the filter, but remove it when done

First define our call back function

function remove_some_tags( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}

Now you can do:

// Add our filter
add_filter( 'get_the_terms', 'remove_some_tags' );

$links = []; 
foreach (get_the_tags() as $this_tag) {  
    $links[] = '<a href="'.get_tag_link( $this_tag ).'" title="'.$this_tag->name.'">'.$this_tag->name.'</a>';  
} 
echo implode(' • ', $links);

// Remove the filter       
remove_filter( 'get_the_terms', 'remove_some_tags' );

ORIGINAL ANSWER

Source Link
Pieter Goosen
  • 55.4k
  • 23
  • 115
  • 209

I'm not sure why do you add tags to posts that you just want to remove again in get_the_tags, but anyway, the best to option to exclude tags is to catch the array early and to remove the unneseccary before the array is returned. get_the_tags() uses get_the_terms() which is filterable through the get_the_terms.

So we can try the following:

add_filter( 'get_the_terms', function ( $terms, $post_id, $taxonomy )
{
    // Make sure we target only the post_tag taxonomy
    if ( 'post_tag' !== $taxonomy )
        return $terms;

    // Create an array of tags you want to INCLUDE, use tag id's, or slugs or names
    $tags_to_include = [ 1, 2, 3]; // using ID's
    //$tags_to_include = ['slug-1', 'slug-2', 'slug-3']; // using slugs
    //$tags_to_include = ['Name 1', 'Name 2', 'Name 3']; // using names

    // Now we can loop through our tags and exclude the one not in our included array
    foreach ( $terms as $key=>$term ) {
        // Skip tags that appear in the included list
        if ( in_array( $term->term_id, $tags_to_include ) ) // Change term_id to name or slug to match $tags_to_include
            continue;

        // Now we simply unset the tag if we reach this point
        unset( $terms[$key] );
    } // endforeach

    // return the array of tags
    return $terms;
}, 10, 3 );

Just note, this needs a bit of overheads to run, so I would still exclude the tags or not assign them when I create the posts

A final note, always, where possible, pass the complete tag object to get_tag_link(). It saves a lot on db calls and time. If you only pass the tag ID, get_tag_link() queries the db to get the complete tag object, which you already have, so

get_tag_link($this_tag->term_id)

should become

get_tag_link($this_tag)