Posts: Avoid the use of globals in get_the_content() and related functions.
This changeset introduces `$post` parameters to `get_the_content()` and `wp_trim_excerpt()`. When a `$post` object is passed to one of these functions, the functions will operate on the data from that object, rather than from the post globals (`$authordata`, `$page`, etc). This ensures that the functions work in a predictable manner when used outside of the regular post loop. The global-mismatch problem is surfaced in cases where `get_the_excerpt()` is called outside of the post loop, on posts that don't have a defined excerpt. In these cases, the post globals - used to generate a fallback excerpt - may refer to the incorrect object, resulting in PHP notices or other unpredictable behavior. See #36934 for a related issue. Props spacedmonkey, kraftbj, Shital Patel. Fixes #42814. Built from https://develop.svn.wordpress.org/trunk@44941 git-svn-id: http://core.svn.wordpress.org/trunk@44772 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
@@ -4155,6 +4155,42 @@ class WP_Query {
|
||||
return;
|
||||
}
|
||||
|
||||
$elements = $this->generate_postdata( $post );
|
||||
if ( false === $elements ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$id = $elements['id'];
|
||||
$authordata = $elements['authordata'];
|
||||
$currentday = $elements['currentday'];
|
||||
$currentmonth = $elements['currentmonth'];
|
||||
$page = $elements['page'];
|
||||
$pages = $elements['pages'];
|
||||
$multipage = $elements['multipage'];
|
||||
$more = $elements['more'];
|
||||
$numpages = $elements['numpages'];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate post data.
|
||||
*
|
||||
* @since 5.2.0
|
||||
*
|
||||
* @param WP_Post|object|int $post WP_Post instance or Post ID/object.
|
||||
* @return array|bool $elements Elements of post or false on failure.
|
||||
*/
|
||||
public function generate_postdata( $post ) {
|
||||
|
||||
if ( ! ( $post instanceof WP_Post ) ) {
|
||||
$post = get_post( $post );
|
||||
}
|
||||
|
||||
if ( ! $post ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$id = (int) $post->ID;
|
||||
|
||||
$authordata = get_userdata( $post->post_author );
|
||||
@@ -4235,7 +4271,9 @@ class WP_Query {
|
||||
*/
|
||||
do_action_ref_array( 'the_post', array( &$post, &$this ) );
|
||||
|
||||
return true;
|
||||
$elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' );
|
||||
|
||||
return $elements;
|
||||
}
|
||||
/**
|
||||
* After looping through a nested query, this function
|
||||
|
||||
Reference in New Issue
Block a user