[wp-trac] [WordPress Trac] #44741: get_the_excerpt and wp_trim_excerpt ambiguity
WordPress Trac
noreply at wordpress.org
Mon Aug 6 13:02:24 UTC 2018
#44741: get_the_excerpt and wp_trim_excerpt ambiguity
-------------------------------+-----------------------------
Reporter: tofandel | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Posts, Post Types | Version: 4.9.8
Severity: minor | Keywords: has-patch
Focuses: |
-------------------------------+-----------------------------
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
<?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
--
Ticket URL: <https://core.trac.wordpress.org/ticket/44741>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list