I read the thread here about this...


but the suggested solution didn't work, because I wasn't sure what to do with the code.

Can anyone give me the full code using the code from the pastebin link, and here: http://wordpress.org/support/topic/post-title-char-count?replies=5

Shortening the titles to 25 characters please? I'm really not good at PHP.

It may be easier to make a plugin since the code is already there, so anyone can choose how many characters to limit the titles to?

Thanks so much!

1 Answer 1


I wasn't sure if i would answer or simply vote to close this topic, i feel i sufficiently asnwered the original topic you're referring to, i'd only be repeating myself here.

That said, here's an upto date version you can use(only took me 2 mins), you only need implement your own code to truncate the titles in the widget, i've marked the area of code for you.

add_action( 'widgets_init', 'switch_recent_posts_widget' );

function switch_recent_posts_widget() {

    unregister_widget( 'WP_Widget_Recent_Posts' );
    register_widget( 'WP_Widget_Recent_Posts_Truncated' );


class WP_Widget_Recent_Posts_Truncated extends WP_Widget {

    function __construct() {
        $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your site") );
        parent::__construct('recent-posts', __('Recent Posts'), $widget_ops);
        $this->alt_option_name = 'widget_recent_entries';

        add_action( 'save_post', array(&$this, 'flush_widget_cache') );
        add_action( 'deleted_post', array(&$this, 'flush_widget_cache') );
        add_action( 'switch_theme', array(&$this, 'flush_widget_cache') );

    function widget($args, $instance) {
        $cache = wp_cache_get('widget_recent_posts', 'widget');

        if ( !is_array($cache) )
            $cache = array();

        if ( isset($cache[$args['widget_id']]) ) {
            echo $cache[$args['widget_id']];


        $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $instance, $this->id_base);
        if ( ! $number = absint( $instance['number'] ) )
            $number = 10;

        $r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true));
        if ($r->have_posts()) :
        <?php echo $before_widget; global $post ?>
        <?php if ( $title ) echo $before_title . $title . $after_title; ?>
        <?php  while ($r->have_posts()) : $r->the_post(); ?>
        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>">
            if( get_the_title() ) 
                the_title(); // DO YOUR STRING LENGTH RESTRICTION HERE!
        <?php endwhile; ?>
        <?php echo $after_widget; ?>
        // Reset the global $the_post as this query will have stomped on it


        $cache[$args['widget_id']] = ob_get_flush();
        wp_cache_set('widget_recent_posts', $cache, 'widget');

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['number'] = (int) $new_instance['number'];

        $alloptions = wp_cache_get( 'alloptions', 'options' );
        if ( isset($alloptions['widget_recent_entries']) )

        return $instance;

    function flush_widget_cache() {
        wp_cache_delete('widget_recent_posts', 'widget');

    function form( $instance ) {
        $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
        $number = isset($instance['number']) ? absint($instance['number']) : 5;
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
        <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>

You'll need to decide how you want to truncate the title, either by a set amount of words or as you said in your question, by number of characters, in any case each approach has some drawbacks, which is why i'm leaving you to decide which you want to implement and why..

The area you'll need to update has a comment next to it that looks as follows..


Small note, just make sure to use get_the_title() when you need to manipulate the title, because that will give you a return value instead of a printed one(which you'll get with the_title()).

Here's a link to a topic on StackOverflow with regard to truncating text, and also a google link with a mountain of links you can study to get ideas about which approach to take with truncating.


NOTE: This is a replacement for the existing recent posts widget, you'll not lose any you've setup already, it will inherit and take over the settings from the default recent posts widget.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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