Redirects: Prevent redirects if a queried object exists.

After [34659], it became possible to cause an incorrect redirect, by changing the slug of a post, then creating a new post with the old slug. The correct behaviour is to prevent redirecting to the old post.

Props dd32, pento.

Fixes #35031 for trunk.



git-svn-id: https://develop.svn.wordpress.org/trunk@36128 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Gary Pendergast 2015-12-31 03:00:33 +00:00
parent cf82d2ef2b
commit a9dcce7060
2 changed files with 29 additions and 0 deletions

View File

@ -4956,6 +4956,10 @@ class WP_Query {
function wp_old_slug_redirect() { function wp_old_slug_redirect() {
global $wp_query, $wp_rewrite; global $wp_query, $wp_rewrite;
if ( get_queried_object() ) {
return;
}
if ( '' !== $wp_query->query_vars['name'] ) : if ( '' !== $wp_query->query_vars['name'] ) :
global $wpdb; global $wpdb;

View File

@ -150,6 +150,31 @@ class Tests_Rewrite_OldSlugRedirect extends WP_UnitTestCase {
$this->assertEquals( $permalink, $this->old_slug_redirect_url ); $this->assertEquals( $permalink, $this->old_slug_redirect_url );
} }
/**
* @ticket 35031
*/
public function test_old_slug_doesnt_redirect_when_reused() {
$old_permalink = user_trailingslashit( get_permalink( $this->post_id ) );
wp_update_post( array(
'ID' => $this->post_id,
'post_name' => 'bar-baz',
) );
$new_post_id = self::factory()->post->create( array(
'post_title' => 'Foo Bar',
'post_name' => 'foo-bar',
) );
$permalink = user_trailingslashit( get_permalink( $new_post_id ) );
$this->assertEquals( $old_permalink, $permalink );
$this->go_to( $old_permalink );
wp_old_slug_redirect();
$this->assertNull( $this->old_slug_redirect_url );
}
public function filter_old_slug_redirect_url( $url ) { public function filter_old_slug_redirect_url( $url ) {
$this->old_slug_redirect_url = $url; $this->old_slug_redirect_url = $url;
return false; return false;