How to truncate titles in Recent Posts widget?

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']];
            return;
        }

        ob_start();
        extract($args);

        $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; ?>
        <ul>
        <?php  while ($r->have_posts()) : $r->the_post(); ?>
        <li><a href="https://wordpress.stackexchange.com/questions/24316/<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>">
            <?php 
            if( get_the_title() ) 
                the_title(); // DO YOUR STRING LENGTH RESTRICTION HERE!
            else 
                the_ID(); 
            ?>
        </a></li>
        <?php endwhile; ?>
        </ul>
        <?php echo $after_widget; ?>
<?php
        // Reset the global $the_post as this query will have stomped on it
        wp_reset_postdata();

        endif;

        $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'];
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( 'alloptions', 'options' );
        if ( isset($alloptions['widget_recent_entries']) )
            delete_option('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>
<?php
    }
}

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..

// DO YOUR STRING LENGTH RESTRICTION HERE!

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.

https://stackoverflow.com/questions/965235/how-can-i-truncate-a-string-in-php
http://www.google.comk/search?q=php+truncate+string+to+length

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.