Fix `setup_postdata()` to set the (inside the loop) globals before `the_post` action is fired. Follow-up from #42814 and [44941].

Props david.binda, spacedmonkey, boonebgorges, birgire, jorbin, azaozz.
Fixes #47114 for trunk.

git-svn-id: https://develop.svn.wordpress.org/trunk@45285 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Andrew Ozz 2019-05-04 20:59:11 +00:00
parent e1bb084bfc
commit 96649a5ad1
2 changed files with 33 additions and 11 deletions

View File

@ -4208,6 +4208,17 @@ class WP_Query {
$more = $elements['more'];
$numpages = $elements['numpages'];
/**
* Fires once the post data has been setup.
*
* @since 2.8.0
* @since 4.1.0 Introduced `$this` parameter.
*
* @param WP_Post $post The Post object (passed by reference).
* @param WP_Query $this The current Query object (passed by reference).
*/
do_action_ref_array( 'the_post', array( &$post, &$this ) );
return true;
}
@ -4298,17 +4309,6 @@ class WP_Query {
$multipage = 0;
}
/**
* Fires once the post data has been setup.
*
* @since 2.8.0
* @since 4.1.0 Introduced `$this` parameter.
*
* @param WP_Post $post The Post object (passed by reference).
* @param WP_Query $this The current Query object (passed by reference).
*/
do_action_ref_array( 'the_post', array( &$post, &$this ) );
$elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' );
return $elements;

View File

@ -9,6 +9,8 @@ class Tests_Query_SetupPostdata extends WP_UnitTestCase {
protected $global_data = array();
protected $pages_global;
public function setUp() {
parent::setUp();
return;
@ -416,4 +418,24 @@ class Tests_Query_SetupPostdata extends WP_UnitTestCase {
}
}
/**
* @ticket 47114
*
* setup_postdata() should set the globals before `the_post` action is fired.
*/
public function test_the_post_action() {
$post = self::factory()->post->create_and_get();
add_action( 'the_post', array( $this, 'the_post_action_callback' ) );
setup_postdata( $post );
$this->assertEquals( $GLOBALS['pages'], $this->pages_global );
}
/**
* Helpers
*/
public function the_post_action_callback() {
$this->pages_global = $GLOBALS['pages'];
}
}