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.