Thomas
Thomas

Reputation: 589

limit characters from <?php the_tags ?>

I have a layout that have to show the tags horizontally. I want to be able to limit the amount of characters outputted.

Example - if I set the limit to 14 the following should happen.

Original: Cats, Dogs, Rain
New output: Cats, Dogs, Ra..

Please note that <?php the_tags ?> returns an array. It is everything returned I want limited to 14 characters.

UPDATE In order to remove any confusion I have updated the post with a screenshot displaying why I want to set this limit. This should make it more clear what kind of solution I am searching for alt text http://img686.imageshack.us/img686/2253/linit.png

Upvotes: 0

Views: 1689

Answers (5)

joemaller
joemaller

Reputation: 20596

This should really rebuild the whole chain of the_tags, get_the_tag_list and get_the_term_list, but here's a solution in a single function.

It's based on WordPress' get_the_term_list function in wp-includes/category-template.php.

If no trim_length is specified, it hands off to the_tags. HTML entities were decoded so string counts would be accurate, then re-encoded into the output string.

I wasn't completely clear about the need for $before, $sep and $after in the last the_tags filter, so I deferred to what WordPress was already doing there.

function the_tags_trimmed( $before = null, $sep = ', ', $after = '', $trim_length = -1, $trim_characters = '...' ) {
    if ( $trim_length < 1 )
        return the_tags( $before, $sep, $after );

    if ( null === $before )
        $before = __('Tags: ');

    $tags = get_the_terms( 0, 'post_tag' );

    if ( empty( $tags ) )
        return false;

    $html_length = 0;
    $x = 0;

    foreach ( $tags as $tag ) {
        $link = get_term_link( $tag, 'post_tag' );
        if ( is_wp_error( $link ) )
            return $link;
        $tag->name = html_entity_decode( $tag->name );
        if ( strlen($tag->name) + $html_length > $trim_length )
            $tag->name = substr( $tag->name, 0, $trim_length - $html_length) . $trim_characters;
        $tag_links[] = '<a href="' . $link . '" rel="tag">' . htmlentities($tag->name) . '</a>';
        $html_length += strlen($tag->name);
        if ( $x++ < count( $tags ) - 1 )
            $html_length += strlen( $sep );

        if ( $html_length >= $trim_length )
            break;
    }

    $tag_links = apply_filters( "term_links-post_tag", $tag_links );
    $tag_list = $before . join( $sep, $tag_links ) . $after;
    echo apply_filters( 'the_tags', $tag_list, $before, $sep, $after );
}

This was lightly tested and should accomplish the @Thomas was asking for.

Upvotes: 0

TheDeadMedic
TheDeadMedic

Reputation: 9997

The trouble with all these answers is that it has not been made clear that the_tags() returns an array of HTML links!

Running substr(implode(', ', get_the_tags(), X) might return something like;

<a href="/tag1/">Tag 1</a>, <a href="/tag2/">Tag 2</a>, <a href="/tag3

You'd be much better off opting for a CSS / front-end solution (as @Gumbo mentioned in the original comments).

That way, you'll still have your link juice and accessibility marked up, without ending up with something like;

<a href="/keyword-tag/">Keyword Tag</a>, <a href="/awesome-keyword/">Awes...</a>

Upvotes: 0

Jason McCreary
Jason McCreary

Reputation: 73011

substr

Check it out http://www.php.net/manual/en/function.substr.php

Something like this should work for you:

$tags = implode(', ', $the_tags)
echo substr($tags, 0, 14) . (strlen($tags) > 14) ? '..' : '';

substr will handle just showing 14 characters, then the last part appends the .. when needed.

Upvotes: 4

GOsha
GOsha

Reputation: 689

This is not very beautiful to cut the words in the middle.
This function will cut your phrase afrer the end of word, but not longer cpecified length.

function short($txt,$length)
{
    $txt = trim(strip_tags($txt));
    if(strlen($txt) > $length)
    {
        $txt = substr($txt,0,$length);
        $pos = strrpos($txt, " ");
        $txt = substr($txt,0,$pos);
        $txt .= "...";
    }
    return $txt;
}

But all answers before are right too.

Upvotes: 0

Sarfraz
Sarfraz

Reputation: 382806

How about using the substr function:

$string_new = substr($string, 0, 14);
echo $string_new;

You might want to also use the strip_tags function if you there are html tags coming in between your text.

Upvotes: 1

Related Questions