If you don’t use the Excerpt field in your posts and rely on WordPress to grab the first few dozen words of your post content what you usually find is the excerpt when displayed on the front end (usually in some sort of archive or post grid display) will have most of the html tags removed leaving you with a single block of plain text.
If I go to the bother of formatting my post content to make it more interesting and easier to read and understand I’d like that formatting to be preserved even in that post’s excerpt.
This bit of php code, put in your functions.php file does the trick. It's well commented so you know what it's doing and is pretty easy to tweak. This gives you nicely formatted content in your post excerpts and RSS feeds too.
The html tags I've chosen to include in excerpts are:
<strong><b><em><i><a><code><kbd><p><br><ul><ol><li><img><blockquote>
The following is an updated version that appears to work better with WordPress 6.x and Full Site Editing Block themes:
function filter_post_excerpt_attrs( $metadata ) { if ( 'core/post-excerpt' === $metadata['name'] ) { $metadata["attributes"]["excerptLength"] = false; } return $metadata; }; add_filter( 'block_type_metadata', 'filter_post_excerpt_attrs', 10 );
Below is the original code that doesn't seem to work with current WordPress and FSE Block themes - try the above code instead.
/**
* allow formatted text in excerpts
**/
function better_trim_excerpt($text)
{
$raw_excerpt = $text;
if ( '' == $text ) {
$text = get_the_content('');
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
// Removes any JavaScript in posts (between <script> and </script> tags)
$text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
// Enable formatting in excerpts - Add HTML tags that you want to be parsed in excerpts, default is 55
$text = strip_tags($text, '<strong><b><em><i><a><code><kbd><p><br><ul><ol><li><img>');
// Set custom excerpt length - number of words to be shown in excerpts
$excerpt_length = apply_filters('excerpt_length', 60);
// Modify excerpt more string at the end from [...] to ...
// $excerpt_more = apply_filters('excerpt_more', ' ' . '...');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
// IMPORTANT! Prevents tags cutoff by excerpt (i.e. unclosed tags) from breaking formatting
$text = force_balance_tags( $text );
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
// Remove the native excerpt function, and replace it with our improved function
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'better_trim_excerpt');
I found this code at the bottom of this page: wordpress.stackexchange.com
Limit search for phrases by using " " around the phrase
You will get an email the morning after we post a new Code Snippet
“I never tried to prove nothing, just wanted to give a good show. My life has always been my music, it’s always come first, but the music ain’t worth nothing if you can’t lay it on the public. The main thing is to live for that audience, ’cause what you’re […]
Read MoreWordPress, how do I love thee? Let me count the ways (in 140 characters or less).
Read MoreThe WordPress Theme Review Team Website
Read MoreOnly one thing is impossible for God: To find any sense in any copyright law on the planet. Mark Twain
Read MoreAbbott: Strange as it may seem, they give ball players nowadays very peculiar names. Costello: Funny names? Abbott: Nicknames, nicknames. Now, on the St. Louis team we have Who’s on first, What’s on second, I Don’t Know is on third– Costello: That’s what I want to find out. I want […]
Read More
Julie Lawrence says
Thanks for that, very useful! I notice, though, that it no longer has the “Read more” link at the end. Any ideas about adding that back in?
Pieter Hartsook says
I think that depends on where the Read More link is supposed to appear, and what underlying framework you’re using to display the excerpt. I use Beaver Builder for most of my projects and using this code snippet I still see the Read More link on post archive (query loop) pages.