Improve global variable setting in `setup_postdata()`.

`setup_postdata()` is responsible for setting a number of global variables
that are used for post pagination (`$pages`, `$page`, `$nextpage`) and the
generation of post excerpts (`$more`). These variables should be sensitive to
the currently running instance of `WP_Query` - rather than the main query -
so that these features work properly inside of secondary `WP_Query` loops.

This changeset moves the logic of `setup_postdata()` into a method on `WP_Query`,
and converts `setup_postdata()` to a wrapper.

Props boonebgorges, wonderboymusic.
See #25349.
Fixes #9256, #20904.
Built from https://develop.svn.wordpress.org/trunk@30085


git-svn-id: http://core.svn.wordpress.org/trunk@30085 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Boone Gorges 2014-10-29 02:32:24 +00:00
parent 3b90929c3e
commit d7a62c01c4
2 changed files with 68 additions and 42 deletions

View File

@ -3710,7 +3710,7 @@ class WP_Query {
do_action_ref_array( 'loop_start', array( &$this ) ); do_action_ref_array( 'loop_start', array( &$this ) );
$post = $this->next_post(); $post = $this->next_post();
setup_postdata($post); $this->setup_postdata( $post );
} }
/** /**
@ -4544,6 +4544,68 @@ class WP_Query {
return $wp_the_query === $this; return $wp_the_query === $this;
} }
/**
* Set up global post data.
*
* @since 4.1.0
*
* @param object $post Post data.
* @return bool True when finished.
*/
public function setup_postdata( $post ) {
global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;
$id = (int) $post->ID;
$authordata = get_userdata($post->post_author);
$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
$numpages = 1;
$multipage = 0;
$page = $this->get( 'page' );
if ( ! $page )
$page = 1;
// Force full post content when viewing the permalink for the $post, or
// when on an RSS feed. Otherwise respect the 'more' tag.
if ( $post->ID === get_queried_object_id() && ( $this->is_page() || $this->is_single() ) ) {
$more = 1;
} else if ( $this->is_feed() ) {
$more = 1;
} else {
$more = 0;
}
$content = $post->post_content;
if ( false !== strpos( $content, '<!--nextpage-->' ) ) {
if ( $page > 1 )
$more = 1;
$content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
$content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
$content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );
// Ignore nextpage at the beginning of the content.
if ( 0 === strpos( $content, '<!--nextpage-->' ) )
$content = substr( $content, 15 );
$pages = explode('<!--nextpage-->', $content);
$numpages = count($pages);
if ( $numpages > 1 )
$multipage = 1;
} else {
$pages = array( $post->post_content );
}
/**
* Fires once the post data has been setup.
*
* @since 2.8.0
*
* @param WP_Post &$post The Post object (passed by reference).
*/
do_action_ref_array( 'the_post', array( &$post ) );
return true;
}
/** /**
* After looping through a nested query, this function * After looping through a nested query, this function
* restores the $post global to the current post in this query. * restores the $post global to the current post in this query.
@ -4630,47 +4692,11 @@ function wp_old_slug_redirect() {
* @return bool True when finished. * @return bool True when finished.
*/ */
function setup_postdata( $post ) { function setup_postdata( $post ) {
global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; global $wp_query;
$id = (int) $post->ID; if ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) {
return $wp_query->setup_postdata( $post );
$authordata = get_userdata($post->post_author);
$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
$numpages = 1;
$multipage = 0;
$page = get_query_var('page');
if ( ! $page )
$page = 1;
if ( is_single() || is_page() || is_feed() )
$more = 1;
$content = $post->post_content;
if ( false !== strpos( $content, '<!--nextpage-->' ) ) {
if ( $page > 1 )
$more = 1;
$content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
$content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
$content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );
// Ignore nextpage at the beginning of the content.
if ( 0 === strpos( $content, '<!--nextpage-->' ) )
$content = substr( $content, 15 );
$pages = explode('<!--nextpage-->', $content);
$numpages = count($pages);
if ( $numpages > 1 )
$multipage = 1;
} else {
$pages = array( $post->post_content );
} }
/** return false;
* Fires once the post data has been setup.
*
* @since 2.8.0
*
* @param WP_Post &$post The Post object (passed by reference).
*/
do_action_ref_array( 'the_post', array( &$post ) );
return true;
} }

View File

@ -4,7 +4,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '4.1-alpha-30084'; $wp_version = '4.1-alpha-30085';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.