In `WP::parse_request()` and `url_to_postid()`, if a post slug clashes with a trashed page, return the post instead of the page.

Props kovshenin, SergeyBiryukov, igmoweb.
Fixes #21970.

git-svn-id: https://develop.svn.wordpress.org/trunk@35195 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2015-10-15 06:48:22 +00:00
parent 0cf7a91d3a
commit 65390cd9cf
3 changed files with 48 additions and 2 deletions

View File

@ -209,8 +209,15 @@ class WP {
if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {
// This is a verbose page match, let's check to be sure about it.
if ( ! get_page_by_path( $matches[ $varmatch[1] ] ) )
$page = get_page_by_path( $matches[ $varmatch[1] ] );
if ( ! $page ) {
continue;
}
$post_status_obj = get_post_status_object( $page->post_status );
if ( ! $post_status_obj->public && ! $post_status_obj->protected && ! $post_status_obj->private ) {
continue;
}
}
// Got a match.

View File

@ -397,8 +397,15 @@ function url_to_postid( $url ) {
if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {
// This is a verbose page match, let's check to be sure about it.
if ( ! get_page_by_path( $matches[ $varmatch[1] ] ) )
$page = get_page_by_path( $matches[ $varmatch[1] ] );
if ( ! $page ) {
continue;
}
$post_status_obj = get_post_status_object( $page->post_status );
if ( ! $post_status_obj->public && ! $post_status_obj->protected && ! $post_status_obj->private ) {
continue;
}
}
// Got a match.

View File

@ -306,4 +306,36 @@ class Tests_Rewrite extends WP_UnitTestCase {
$this->assertQueryTrue( 'is_front_page', 'is_page', 'is_singular' );
$this->assertFalse( is_home() );
}
/**
* @ticket 21970
*/
function test_url_to_postid_with_post_slug_that_clashes_with_a_trashed_page() {
$this->set_permalink_structure( '/%postname%/' );
$page_id = $this->factory->post->create( array( 'post_type' => 'page', 'post_status' => 'trash' ) );
$post_id = $this->factory->post->create( array( 'post_title' => get_post( $page_id )->post_title ) );
$this->assertEquals( $post_id, url_to_postid( get_permalink( $post_id ) ) );
$this->set_permalink_structure();
}
/**
* @ticket 21970
*/
function test_parse_request_with_post_slug_that_clashes_with_a_trashed_page() {
$this->set_permalink_structure( '/%postname%/' );
$page_id = $this->factory->post->create( array( 'post_type' => 'page', 'post_status' => 'trash' ) );
$post_id = $this->factory->post->create( array( 'post_title' => get_post( $page_id )->post_title ) );
$this->go_to( get_permalink( $post_id ) );
$this->assertTrue( is_single() );
$this->assertFalse( is_404() );
$this->set_permalink_structure();
}
}