When is an excerpt not an excerpt?
If you call get_the_excerpt()
WordPress returns a string that looks like an excerpt – but it might not be. If your post doesn’t have a handcrafted excerpt, WordPress returns an automatically generated word-counted trimmed-down version of the full post content (see codex).
TL/DR: WordPress returns a string for get_the_excerpt()
even when has_excerpt()
is FALSE
.
I’d used this bit of code to automatically add a ‘read more’ link at the end of every excerpt on a search page.
function ds_excerpt_read_more( $output ) { $read_more_link = ' (Read more)'; if ( has_excerpt() && ! is_attachment() & is_search() ) { $output .= " " . $read_more_link; } return $output; } add_filter( 'get_the_excerpt', 'ds_excerpt_read_more' );
Problem was, it wasn’t working everywhere – some posts didn’t have the modified excerpt.
has_excerpt()
was the problem – it only returns TRUE
if there is a manual excerpt.
So this works better:
function ds_excerpt_read_more( $output ) { $read_more_link = ' (Read more)'; if ( has_excerpt() && ! is_attachment() & is_search() ) { $output .= " " . $read_more_link; } elseif (is_search() && ! has_excerpt() ) { $excerpt_length = apply_filters('excerpt_length', 55); $output = wp_trim_words( $output, $excerpt_length, '' ); $output .= " " . $read_more_link; } return $output; } add_filter( 'get_the_excerpt', 'ds_excerpt_read_more' );
but this is best:
function ds_excerpt_read_more( $output ) { if ( is_search() && ! is_attachment() ) { $read_more_link = ' (Read more)'; if ( ! has_excerpt() ) { $excerpt_length = apply_filters('excerpt_length', 55); $output = wp_trim_words( $output, $excerpt_length, '' ); /* Finds the last full stop in the excerpt, removes everything after it. */ if ( ( $pos = mb_strrpos( $output, '.' ) ) !== false ) { $output = substr( $output, 0, $pos + 2 ); } } /* Appends a 'read more' link at the end of the excerpt - if it's a search */ $output .= " " . $read_more_link; } return $output; } add_filter( 'get_the_excerpt', 'ds_excerpt_read_more' );