Make WordPress Core

Ticket #31355: 31355.patch

File 31355.patch, 3.0 KB (added by gradyetc, 10 years ago)

Unit tests demonstrating the issue with a potential patch

  • src/wp-includes/query.php

     
    39393939                        $this->queried_object = get_userdata( $this->queried_object_id );
    39403940                }
    39413941
     3942                // Setting `queried_object_id` before the query has run causes singular
     3943                // queries for hierarchical custom post types to fail.
     3944                if ( $this->is_singular && is_null( $this->queried_object ) ) {
     3945                        // _doing_it_wrong()?
     3946                        unset( $this->queried_object_id );
     3947                }
     3948
    39423949                return $this->queried_object;
    39433950        }
    39443951
     
    40774084
    40784085                $post_obj = $this->get_queried_object();
    40794086
     4087                if ( ! $post_obj ) {
     4088                        return false;
     4089                }
     4090
    40804091                if ( in_array( (string) $post_obj->ID, $attachment ) ) {
    40814092                        return true;
    40824093                } elseif ( in_array( $post_obj->post_title, $attachment ) ) {
     
    44614472
    44624473                $post_obj = $this->get_queried_object();
    44634474
     4475                if ( ! $post_obj ) {
     4476                        return false;
     4477                }
     4478
    44644479                $post = (array) $post;
    44654480
    44664481                if ( in_array( (string) $post_obj->ID, $post ) ) {
     
    45044519
    45054520                $post_obj = $this->get_queried_object();
    45064521
     4522                if ( ! $post_obj ) {
     4523                        return false;
     4524                }
     4525
    45074526                return in_array( $post_obj->post_type, (array) $post_types );
    45084527        }
    45094528
  • tests/phpunit/tests/query.php

     
    122122        public function filter_parse_query_to_remove_tax( $q ) {
    123123                unset( $q->query_vars['wptests_tax'] );
    124124        }
     125
     126        /**
     127         * @ticket 31355
     128         */
     129        public function test_pages_dont_404_when_queried_post_id_is_modified() {
     130                $post_id = $this->factory->post->create( array( 'post_title' => 'A Test Page', 'post_type' => 'page' ) );
     131
     132                add_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
     133
     134                $url = get_permalink( $post_id );
     135                $this->go_to( $url );
     136
     137                remove_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
     138
     139                $this->assertFalse( $GLOBALS['wp_query']->is_404() );
     140                $this->assertEquals( $post_id, $GLOBALS['wp_query']->post->ID );
     141        }
     142
     143        /**
     144         * @ticket 31355
     145         */
     146        public function test_custom_hierarchical_post_types_404_when_queried_post_id_is_modified() {
     147                global $wp_rewrite;
     148
     149                register_post_type( 'guide', array( 'name' => 'Guide', 'public' => true, 'hierarchical' => true ) );
     150                $wp_rewrite->flush_rules();
     151                $post_id = $this->factory->post->create( array( 'post_title' => 'A Test Guide', 'post_type' => 'guide' ) );
     152
     153                add_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
     154
     155                $url = get_permalink( $post_id );
     156                $this->go_to( $url );
     157
     158                remove_action( 'parse_query', array( $this, 'filter_parse_query_to_modify_queried_post_id' ) );
     159
     160                $this->assertFalse( $GLOBALS['wp_query']->is_404() );
     161                $this->assertEquals( $post_id, $GLOBALS['wp_query']->post->ID );
     162        }
     163
     164        public function filter_parse_query_to_modify_queried_post_id( $query ) {
     165                $post = get_queried_object();
     166        }
    125167}