Opened 6 years ago
Closed 6 years ago
#44741 closed defect (bug) (duplicate)
get_the_excerpt and wp_trim_excerpt ambiguity
Reported by: | tofandel | Owned by: | |
---|---|---|---|
Milestone: | Priority: | normal | |
Severity: | minor | Version: | 4.9.8 |
Component: | Posts, Post Types | Keywords: | has-patch |
Focuses: | Cc: |
Description
Hello, I found a little ambiguity with the get_the_excerpt function when a $post is provided as a parameter to the function, the text from a wrong post can be taken.
The issue comes from the fact that get_the_excerpt applies the wp_trim_excerpt filter.
But, this filter only accounts for one parameter which is the text when it should take a second one that is the $post parameter passed to it.
Actuallly it gets the default content with
get_the_content('');
when it should take the content from the $post parameter passed to the filter with $post->post_content
So the new function should be in wp-includes/formatting.php
<?php /** * Generates an excerpt from the content, if needed. * * The excerpt word amount will be 55 words and if the amount is greater than * that, then the string ' […]' will be appended to the excerpt. If the string * is less than 55 words, then the content will be returned as is. * * The 55 word limit can be modified by plugins/themes using the {@see 'excerpt_length'} filter * The ' […]' string can be modified by plugins/themes using the {@see 'excerpt_more'} filter * * @since 1.5.0 * * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated. * @param WP_Post|int|null $post * @return string The excerpt. */ function wp_trim_excerpt( $text = '', $post = null ) { $raw_excerpt = $text; if ( '' == $text ) { $post = get_post( $post ); if ( empty( $post ) ) { $text = ''; } else { $text = $post->post_content; } $text = strip_shortcodes( $text ); /** This filter is documented in wp-includes/post-template.php */ $text = apply_filters( 'the_content', $text ); $text = str_replace(']]>', ']]>', $text); /** * Filters the number of words in an excerpt. * * @since 2.7.0 * * @param int $number The number of words. Default 55. */ $excerpt_length = apply_filters( 'excerpt_length', 55 ); /** * Filters the string in the "more" link displayed after a trimmed excerpt. * * @since 2.9.0 * * @param string $more_string The string shown within the more link. */ $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[…]' ); $text = wp_trim_words( $text, $excerpt_length, $excerpt_more ); } /** * Filters the trimmed excerpt string. * * @since 2.8.0 * * @param string $text The trimmed text. * @param string $raw_excerpt The text prior to trimming. */ return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt ); }
And in wp-includes/default-filters.php the new filter should be:
add_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10, 2 );
The $post parameter is already passed as a parameter to the 'get_the_excerpt' filter so nothing to do there.
Thanks
Hi @tofandel and thanks for your report!
We're already tracking this in #36934.