Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I've been searching for a code snippet that lets me limit the title length similar to what you can to with the_excerpt and then just display "(...)" if the title is too long. I'd like to use that in loops outside of single.php, e.g. in my sidebar where an extremely long title would harm the layout.

All I could find was this code snippet, but that does obviously not what I want.

function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_word_count($title) >= 10 ) //set this to the maximum number of words
wp_die( __('Error: your post title is over the maximum word count.') );
}
add_action('publish_post', 'maxWord');

Is it possible at all?

I'm looking for something similar like this, just not for the excerpt, but the title:

function excerpt($limit) {
      $excerpt = explode(' ', get_the_excerpt(), $limit);
      if (count($excerpt)>=$limit) {
        array_pop($excerpt);
        $excerpt = implode(" ",$excerpt).' (...)';
      } else {
        $excerpt = implode(" ",$excerpt);
      } 
      $excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
      return $excerpt;
    }

    function content($limit) {
      $content = explode(' ', get_the_content(), $limit);
      if (count($content)>=$limit) {
        array_pop($content);
        $content = implode(" ",$content).' (...)';
      } else {
        $content = implode(" ",$content);
      } 
      $content = preg_replace('/\[.+\]/','', $content);
      $content = apply_filters('the_content', $content); 
      $content = str_replace(']]>', ']]>', $content);
      return $content;
    }
share|improve this question
add comment

1 Answer 1

up vote 1 down vote accepted

This depends 100% on how you're getting the title. If you're using a global object (i.e. $post->post_title then you're not passing it through any filters and you'll have to use some fancy post-processing to pare the title down.

However, if you're inside a post loop, use either the_title() to echo the current post's title or get_the_title() to return it programatically.

If you use one of those two functions, WordPress will automatically pass the post title through a filter before giving it back to you.

Then you can add the following to the top of your sidebar.php file:

function japanworm_shorten_title( $title ) {
    $newTitle = substr( $title, 0, 20 ); // Only take the first 20 characters

    return $newTitle . " …" // Append the elipsis to the text (...) 
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );

Now, every time you reference the_title() or get_the_title() in your sidebar, they will return the automatically-shortened version instead of the full version.

Just remember to remove this filter at the end of your sidebar.php file or it will apply elsewhere in your theme as well:

remove_filter( 'the_title', 'japanworm_shorten_title' );

Update 10/3/2011

If you want a function you can use anywhere, I recommend making your own versions of get_the_title() and the_title() and using them in your code. For example:

function japanworm_get_the_title( $length = null, $id = 0 ) {
    $post = &get_post($id);

    $title = isset($post->post_title) ? $post->post_title : '';
    $id = isset($post->ID) ? $post->ID : (int) $id;

    if ( !is_admin() ) {
        if ( !empty($post->post_password) ) {
            $protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
            $title = sprintf($protected_title_format, $title);
        } else if ( isset($post->post_status) && 'private' == $post->post_status ) {
            $private_title_format = apply_filters('private_title_format', __('Private: %s'));
            $title = sprintf($private_title_format, $title);
        }
    }

    // Shorten the title
    if ( null != $length ) {
        $length = (int) $length;

        $title = substr( $title, 0, $length ); // Only take the first 20 characters

        $title .= " …";
    }

    return apply_filters( 'the_title', $title, $id );
}

function japanworm_the_title($before = '', $after = '', $echo = true, $length = null) {
    $title = get_the_title($length);

    if ( strlen($title) == 0 )
        return;

    $title = $before . $title . $after;

    if ( $echo )
        echo $title;
    else
        return $title;
}

These are copied from the original the_title() and get_the_title() functions, so they should work in the loop the same way. I haven't tested this, though.

share|improve this answer
    
Hello. Thank you very much. Actually I'm looking for something I can use more "freely" anywhere I like (see my updated question). I don't want to use it only in my sidebar, that was only an example. I have a similar code in my function.php for a custom excerpt where I can adjust the lenght by putting a number into "(30)" it. Is that also possible for the title? –  japanworm Oct 3 '11 at 1:30
    
See my edit for another option. –  EAMann Oct 3 '11 at 14:09
    
Hello. Sorry for the late reply. I've been off for a few days. I tried the code and put it into my function.php but got a syntax error, so it doesn't seem to work unfortunately. –  japanworm Oct 12 '11 at 13:32
1  
Should be an extra semi-colon at the end of that line (making it $title .= " …";). Editing my answer ... –  EAMann Oct 12 '11 at 15:52
1  
Look at the function signature: function japanworm_get_the_title( $length = null, $id = 0 ) ... so you need to specify both the length and the id. Try japanworm_get_the_title(20, 12) to return a 20-character title for post ID 12. –  EAMann Oct 13 '11 at 15:54
show 6 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.