Multiple excerpt lengths in wordpress

83,163

Solution 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(']]>', ']]>', $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/

Solution 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());
}

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

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

Solution 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

Share:
83,163
davebowker
Author by

davebowker

Designer. Developer.

Updated on December 13, 2020

Comments

  • davebowker
    davebowker over 3 years

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

    I understand you can do this in functions.php:

    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

  • Dipesh KC
    Dipesh KC over 11 years
    make sure you also check this function wp_trim_words codex.wordpress.org/Function_Reference/wp_trim_words
  • maximus ツ
    maximus ツ over 10 years
    Welcome to SO. This need to be commented, not answered. Hold on to patience, you will get comment rights.
  • Doug Hucker
    Doug Hucker over 10 years
    Thanks Maximus, I apologize.
  • Michał Rybak
    Michał Rybak over 10 years
    please see my answer, which is more up-to-date and uses built-in wordpress functions.
  • Mayeenul Islam
    Mayeenul Islam over 10 years
    I preferred this answer as it's a nice way to come up with code. Thanks Baylor.
  • Guerilla
    Guerilla over 10 years
    nice solution but it took me a while to get it working as it lacks the priority to be effective in current (2013) versions of Wordpress: use add_filter('excerpt_length', 'Excerpt::new_length', 999); instead (notice the last parameter)
  • Ryan Burney
    Ryan Burney about 10 years
    By far the best and simplest response. Excellent use of a built-in WP function. Thank you for not over-engineering a solution.
  • Pieter Goosen
    Pieter Goosen about 10 years
    @Michal, great piece of code, never thought that it could actually be so easy
  • Dan J
    Dan J about 10 years
    Hmm... how come Michal's solution (use wp_trim_words()) doesn't work for you? Much nicer than hacking core...
  • Dan J
    Dan J about 10 years
    Sweet - this is the way to go. And in response to Tri Nguyen's concerns about data sanitization: wp_trim_words() calls wp_strip_all_tags() on the text, so no worries about breaking HTML in the post content.
  • powerbuoy
    powerbuoy about 10 years
    Hmm.. must've missed it when I wrote this. Definitely gonna try it out on my current WP projects. I have had problems with WP before though when using get_the_* functions instead of the_* functions where they don't return the exact same thing (the_content() and get_the_content() in my experience)
  • Mike Grace
    Mike Grace about 10 years
    There are simpler ways to do this now with more recent versions of WordPress.
  • Marko
    Marko almost 10 years
    is there a way can we skip html code using example above? shortcode is visible in some of my pages
  • Javier Villanueva
    Javier Villanueva about 9 years
    Excellent approach, just set the maximum excerpt length you want to use int the excerpt_length filter and use wp_trim_words everywhere else.
  • evu
    evu almost 9 years
    It's probably worth noting that if you want a $limit to be more than 55 words, you'll have to adjust the default excerpt length too. function custom_excerpt_length( $length ) { return 135; } add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
  • Nathan Hornby
    Nathan Hornby almost 9 years
    It's times like this that I think Stackoverflow needs an 'archive answer and pick new one' type feature. Things change yo.
  • Slab
    Slab about 7 years
    This doesn't quite work if the text creating the excerpt is less than the $limit. The "Continue reading →" text from get_the_excerpt() appears on the end of the excerpt as plain text. I prefer @Olaf s solution below.
  • Phill Healey
    Phill Healey over 6 years
    Why not add an additional input to this, so that you can also alter the "Read More " text ?
  • Kolawole Emmanuel Izzy
    Kolawole Emmanuel Izzy almost 5 years
    Simple and efficient, i was able to make it loop friendly which is awesome
  • Sagive
    Sagive almost 5 years
    isn't this what the get_the_excerpt func does automatically? your function doesnt really trim existing excerpt...