Multiple excerpt lengths in wordpress
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 »</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
Comments
-
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 over 11 yearsmake sure you also check this function wp_trim_words codex.wordpress.org/Function_Reference/wp_trim_words
-
maximus ツ over 10 yearsWelcome to SO. This need to be commented, not answered. Hold on to patience, you will get comment rights.
-
Doug Hucker over 10 yearsThanks Maximus, I apologize.
-
Michał Rybak over 10 yearsplease see my answer, which is more up-to-date and uses built-in wordpress functions.
-
Mayeenul Islam over 10 yearsI preferred this answer as it's a nice way to come up with code. Thanks Baylor.
-
Guerilla over 10 yearsnice 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 about 10 yearsBy far the best and simplest response. Excellent use of a built-in WP function. Thank you for not over-engineering a solution.
-
Pieter Goosen about 10 years@Michal, great piece of code, never thought that it could actually be so easy
-
Dan J about 10 yearsHmm... how come Michal's solution (use
wp_trim_words()
) doesn't work for you? Much nicer than hacking core... -
Dan J about 10 yearsSweet - this is the way to go. And in response to Tri Nguyen's concerns about data sanitization:
wp_trim_words()
callswp_strip_all_tags()
on the text, so no worries about breaking HTML in the post content. -
powerbuoy about 10 yearsHmm.. 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()
andget_the_content()
in my experience) -
Mike Grace about 10 yearsThere are simpler ways to do this now with more recent versions of WordPress.
-
Marko almost 10 yearsis there a way can we skip html code using example above? shortcode is visible in some of my pages
-
Javier Villanueva about 9 yearsExcellent approach, just set the maximum excerpt length you want to use int the
excerpt_length
filter and usewp_trim_words
everywhere else. -
evu almost 9 yearsIt'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 almost 9 yearsIt's times like this that I think Stackoverflow needs an 'archive answer and pick new one' type feature. Things change yo.
-
Slab about 7 yearsThis doesn't quite work if the text creating the excerpt is less than the
$limit
. The "Continue reading →" text fromget_the_excerpt()
appears on the end of the excerpt as plain text. I prefer @Olaf s solution below. -
Phill Healey over 6 yearsWhy not add an additional input to this, so that you can also alter the "Read More " text ?
-
Kolawole Emmanuel Izzy almost 5 yearsSimple and efficient, i was able to make it loop friendly which is awesome
-
Sagive almost 5 yearsisn't this what the get_the_excerpt func does automatically? your function doesnt really trim existing excerpt...