WordPress.org

Make WordPress Core

Opened 2 years ago

Closed 2 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 ' [&hellip;]' 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 ' [&hellip;]' 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(']]>', ']]&gt;', $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', ' ' . '[&hellip;]' );
                $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

Change History (1)

#1 @swissspidy
2 years ago

  • Milestone Awaiting Review deleted
  • Resolution set to duplicate
  • Status changed from new to closed

Hi @tofandel and thanks for your report!

We're already tracking this in #36934.

Note: See TracTickets for help on using tickets.