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:
parent
3b90929c3e
commit
d7a62c01c4
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue