How to truncate titles in Recent Posts widget?

I read the thread here about this…

http://wordpress.org/support/topic/truncate-titles-in-recent-posts-widget?replies=8

Read More

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!

Related posts

Leave a Reply

1 comment

  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']];
                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="<?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.