Better default values in WP_Query::get_queried_object().

Setting the default value of the `queried_object_id` property to `0` meant
that, when called early enough in the WP bootstrap, `get_queried_object()`
could short-circuit the normal query by fooling it into thinking that the
request was for a page with id 0. Setting the default value to `null` instead
avoids this problem.

Props gradyetc, jazbek.
Fixes #31355.

git-svn-id: https://develop.svn.wordpress.org/trunk@34073 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Boone Gorges 2015-09-12 03:36:12 +00:00
parent 3cbec930bb
commit b7c8dbf4a2
2 changed files with 43 additions and 1 deletions

View File

@ -3926,7 +3926,7 @@ class WP_Query {
return $this->queried_object; return $this->queried_object;
$this->queried_object = null; $this->queried_object = null;
$this->queried_object_id = 0; $this->queried_object_id = null;
if ( $this->is_category || $this->is_tag || $this->is_tax ) { if ( $this->is_category || $this->is_tag || $this->is_tax ) {
if ( $this->is_category ) { if ( $this->is_category ) {

View File

@ -417,4 +417,46 @@ class Tests_Query extends WP_UnitTestCase {
$this->assertEqualSets( array( $p1, $p2, $p3 ), wp_list_pluck( $GLOBALS['wp_query']->posts, 'ID' ) ); $this->assertEqualSets( array( $p1, $p2, $p3 ), wp_list_pluck( $GLOBALS['wp_query']->posts, 'ID' ) );
} }
/**
* @ticket 31355
*/
public function test_pages_dont_404_when_queried_post_id_is_modified() {
$post_id = $this->factory->post->create( array( 'post_title' => 'A Test Page', 'post_type' => 'page' ) );
add_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
$url = get_permalink( $post_id );
$this->go_to( $url );
remove_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
$this->assertFalse( $GLOBALS['wp_query']->is_404() );
$this->assertEquals( $post_id, $GLOBALS['wp_query']->post->ID );
}
/**
* @ticket 31355
*/
public function test_custom_hierarchical_post_types_404_when_queried_post_id_is_modified() {
global $wp_rewrite;
register_post_type( 'guide', array( 'name' => 'Guide', 'public' => true, 'hierarchical' => true ) );
$wp_rewrite->flush_rules();
$post_id = $this->factory->post->create( array( 'post_title' => 'A Test Guide', 'post_type' => 'guide' ) );
add_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
$url = get_permalink( $post_id );
$this->go_to( $url );
remove_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
$this->assertFalse( $GLOBALS['wp_query']->is_404() );
$this->assertEquals( $post_id, $GLOBALS['wp_query']->post->ID );
}
public function filter_parse_query_to_modify_queried_post_id( $query ) {
$post = get_queried_object();
}
} }