Multiple excerpt lengths in wordpress

As it says in the title, I’m looking for multiple excerpt lengths in WordPress.

I understand you can do this in functions.php:

Read More
function twentyten_excerpt_length( $length ) {
    return 15;
}
add_filter( 'excerpt_length', 'twentyten_excerpt_length' );

What I want to know is how you can have multiple of these each returning different numerical values so I can get short excerpts for sidebar loops, longer excerpts for featured loops, and the longest excerpt for the main article.

Something like using these in the templates:

<?php the_excerpt('length-short') ?>
<?php the_excerpt('length-medium') ?>
<?php the_excerpt('length-long') ?>

Cheers,
Dave

Related posts

Leave a Reply

8 comments

  1. How about…

    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(']]>', ']]&gt;', $content);
    
        return $content;
    }
    

    then in your template code you just use..

    <?php echo excerpt(25); ?>
    

    from: http://bavotasan.com/tutorials/limiting-the-number-of-words-in-your-excerpt-or-content-in-wordpress/

  2. As for now, you can upgrade Marty’s reply:

    function excerpt($limit) {
        return wp_trim_words(get_the_excerpt(), $limit);
    }
    

    You can also define custom ‘read more’ link this way:

    function custom_read_more() {
        return '... <a class="read-more" href="'.get_permalink(get_the_ID()).'">more&nbsp;&raquo;</a>';
    }
    function excerpt($limit) {
        return wp_trim_words(get_the_excerpt(), $limit, custom_read_more());
    }
    
  3. This is what I came up with.

    Add this to your functions.php

    class Excerpt {
    
      // Default length (by WordPress)
      public static $length = 55;
    
      // So you can call: my_excerpt('short');
      public static $types = array(
          'short' => 25,
          'regular' => 55,
          'long' => 100
        );
    
      /**
       * Sets the length for the excerpt,
       * then it adds the WP filter
       * And automatically calls the_excerpt();
       *
       * @param string $new_length 
       * @return void
       * @author Baylor Rae'
       */
      public static function length($new_length = 55) {
        Excerpt::$length = $new_length;
    
        add_filter('excerpt_length', 'Excerpt::new_length');
    
        Excerpt::output();
      }
    
      // Tells WP the new length
      public static function new_length() {
        if( isset(Excerpt::$types[Excerpt::$length]) )
          return Excerpt::$types[Excerpt::$length];
        else
          return Excerpt::$length;
      }
    
      // Echoes out the excerpt
      public static function output() {
        the_excerpt();
      }
    
    }
    
    // An alias to the class
    function my_excerpt($length = 55) {
      Excerpt::length($length);
    }
    

    It can be used like this.

    my_excerpt('short'); // calls the defined short excerpt length
    
    my_excerpt(40); // 40 chars
    

    This is the easiest way that I know of to add filters, that are callable from one function.

  4. I was looking for this feature as well and most of the functions here are good and flexible.
    For my own case I was looking for a solution that shows a different excerpt length only on specific pages. I’m using this:

    function custom_excerpt_length( $length ) {
        return (is_front_page()) ? 15 : 25;
    }
    add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
    

    Paste this code inside the themes functions.php file.

  5. You can add to your functions.php file this function

    function custom_length_excerpt($word_count_limit) {
        $content = wp_strip_all_tags(get_the_content() , true );
        echo wp_trim_words($content, $word_count_limit);
    }
    

    Then call it in your template like this

    <p><?php custom_length_excerpt(50); ?>
    

    The wp_strip_all_tags should prevent stray html tags from breaking the page.


    Documentation on functions

  6. Going back to Marty’s reply:

    I know it’s been well over a year since this reply got published, but it’s better late than never. For this to work with limits of over the WordPress default of 55, you need to replace this line:

         $excerpt = explode(' ', get_the_excerpt(), $limit);
    

    with this line:

         $excerpt = explode(' ', get_the_content(), $limit);
    

    Otherwise, the function only works with an already trimmed-down piece of text.

  7. Here an easy way to limit the content or the excerpt

    $content = get_the_excerpt();
    $content = strip_tags($content);    
    echo substr($content, 0, 255);
    

    change get_the_excerpt() by get_the_content() if you want the contents.

    Regards