mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-08-11 12:20:22 +00:00
Sitemaps: Prevent incorrect redirection of paged sitemap requests.
Update `redirect_canonical()` to account for custom pagination and URL format used by sitemaps in order to follow standard practices. Introduce the function `get_sitemap_url()` to simplify getting the index and provider URLs as needed. Props jonathanstegall, pbiron, GamerZ, salvoaranzulla, peterwilsoncc. Fixes #50910. git-svn-id: https://develop.svn.wordpress.org/trunk@48872 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -40,4 +40,75 @@ class Tests_Canonical_Sitemaps extends WP_Canonical_UnitTestCase {
|
||||
$this->assertCanonical( '/wp-sitemap.xsl/', '/wp-sitemap.xsl' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure sitemaps redirects work as expected with pretty permalinks.
|
||||
*
|
||||
* @dataProvider data_sitemaps_canonical_pretty_redirects
|
||||
* @ticket 50910
|
||||
*/
|
||||
public function test_sitemaps_canonical_pretty_redirects( $test_url, $expected ) {
|
||||
$this->set_permalink_structure( '/%postname%/' );
|
||||
$this->assertCanonical( $test_url, $expected, 50910 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_sitemaps_canonical_pretty_redirects.
|
||||
*
|
||||
* @return array[] {
|
||||
* Data to test with.
|
||||
*
|
||||
* @type string $0 The test URL.
|
||||
* @type string $1 The expected canonical URL.
|
||||
* }
|
||||
*/
|
||||
public function data_sitemaps_canonical_pretty_redirects() {
|
||||
return array(
|
||||
// Ugly/incorrect versions redirect correctly.
|
||||
array( '/?sitemap=index', '/wp-sitemap.xml' ),
|
||||
array( '/wp-sitemap.xml/', '/wp-sitemap.xml' ),
|
||||
array( '/?sitemap=posts&sitemap-subtype=post', '/wp-sitemap-posts-post-1.xml' ),
|
||||
array( '/?sitemap=posts&sitemap-subtype=post&paged=2', '/wp-sitemap-posts-post-2.xml' ),
|
||||
array( '/?sitemap=taxonomies&sitemap-subtype=category', '/wp-sitemap-taxonomies-category-1.xml' ),
|
||||
array( '/?sitemap=taxonomies&sitemap-subtype=category&paged=2', '/wp-sitemap-taxonomies-category-2.xml' ),
|
||||
|
||||
// Pretty versions don't redirect incorrectly.
|
||||
array( '/wp-sitemap.xml', '/wp-sitemap.xml' ),
|
||||
array( '/wp-sitemap-posts-post-1.xml', '/wp-sitemap-posts-post-1.xml' ),
|
||||
array( '/wp-sitemap-posts-post-2.xml', '/wp-sitemap-posts-post-2.xml' ),
|
||||
array( '/wp-sitemap-taxonomies-category-1.xml', '/wp-sitemap-taxonomies-category-1.xml' ),
|
||||
array( '/wp-sitemap-taxonomies-category-2.xml', '/wp-sitemap-taxonomies-category-2.xml' ),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure sitemaps redirects work as expected with ugly permalinks.
|
||||
*
|
||||
* @dataProvider data_sitemaps_canonical_ugly_redirects
|
||||
* @ticket 50910
|
||||
*/
|
||||
public function test_sitemaps_canonical_ugly_redirects( $test_url, $expected ) {
|
||||
$this->set_permalink_structure( '' );
|
||||
$this->assertCanonical( $test_url, $expected, 50910 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_sitemaps_canonical_ugly_redirects.
|
||||
*
|
||||
* @return array[] {
|
||||
* Data to test with.
|
||||
*
|
||||
* @type string $0 The test URL.
|
||||
* @type string $1 The expected canonical URL.
|
||||
* }
|
||||
*/
|
||||
public function data_sitemaps_canonical_ugly_redirects() {
|
||||
return array(
|
||||
// Ugly permalinks remain ugly.
|
||||
array( '/?sitemap=index', '/?sitemap=index' ),
|
||||
array( '/?sitemap=posts&sitemap-subtype=post', '/?sitemap=posts&sitemap-subtype=post' ),
|
||||
array( '/?sitemap=posts&sitemap-subtype=post&paged=2', '/?sitemap=posts&sitemap-subtype=post&paged=2' ),
|
||||
array( '/?sitemap=taxonomies&sitemap-subtype=category', '/?sitemap=taxonomies&sitemap-subtype=category' ),
|
||||
array( '/?sitemap=taxonomies&sitemap-subtype=category&paged=2', '/?sitemap=taxonomies&sitemap-subtype=category&paged=2' ),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,4 +58,92 @@ class Test_Sitemaps_Functions extends WP_UnitTestCase {
|
||||
$this->assertTrue( is_a( $sitemaps[ $name ], $provider ), "Default $name sitemap is not a $provider object." );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get_sitemap_url() with ugly permalinks.
|
||||
*
|
||||
* @dataProvider ugly_permalinks_provider
|
||||
*/
|
||||
public function test_get_sitemap_url_ugly_permalinks( $name, $subtype_name, $page, $expected ) {
|
||||
$actual = get_sitemap_url( $name, $subtype_name, $page );
|
||||
|
||||
$this->assertSame( $expected, $actual );
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get_sitemap_url() with pretty permalinks.
|
||||
*
|
||||
* @dataProvider pretty_permalinks_provider
|
||||
*/
|
||||
public function test_get_sitemap_url_pretty_permalinks( $name, $subtype_name, $page, $expected ) {
|
||||
$this->set_permalink_structure( '/%postname%/' );
|
||||
|
||||
$actual = get_sitemap_url( $name, $subtype_name, $page );
|
||||
|
||||
$this->assertSame( $expected, $actual );
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_get_sitemap_url_ugly_permalinks.
|
||||
*
|
||||
* @return array[] {
|
||||
* Data to test with.
|
||||
*
|
||||
* @type string $0 Sitemap name.
|
||||
* @type string $1 Sitemap subtype name.
|
||||
* @type int $3 Sitemap page.
|
||||
* @type string|false $4 Sitemap URL.
|
||||
* }
|
||||
*/
|
||||
function ugly_permalinks_provider() {
|
||||
return array(
|
||||
array( 'posts', 'post', 1, home_url( '/?sitemap=posts&sitemap-subtype=post&paged=1' ) ),
|
||||
array( 'posts', 'post', 0, home_url( '/?sitemap=posts&sitemap-subtype=post&paged=1' ) ),
|
||||
array( 'posts', 'page', 1, home_url( '/?sitemap=posts&sitemap-subtype=page&paged=1' ) ),
|
||||
array( 'posts', 'page', 5, home_url( '/?sitemap=posts&sitemap-subtype=page&paged=5' ) ),
|
||||
// post_type doesn't exist.
|
||||
array( 'posts', 'foo', 5, false ),
|
||||
array( 'taxonomies', 'category', 1, home_url( '/?sitemap=taxonomies&sitemap-subtype=category&paged=1' ) ),
|
||||
array( 'taxonomies', 'post_tag', 1, home_url( '/?sitemap=taxonomies&sitemap-subtype=post_tag&paged=1' ) ),
|
||||
array( 'taxonomies', 'post_tag', -1, home_url( '/?sitemap=taxonomies&sitemap-subtype=post_tag&paged=1' ) ),
|
||||
// negative paged, gets converted to it's absolute value.
|
||||
array( 'users', '', 4, home_url( '/?sitemap=users&paged=4' ) ),
|
||||
// users provider doesn't allow subtypes.
|
||||
array( 'users', 'foo', 4, false ),
|
||||
// provider doesn't exist.
|
||||
array( 'foo', '', 4, false ),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_get_sitemap_url_pretty_permalinks
|
||||
*
|
||||
* @return array[] {
|
||||
* Data to test with.
|
||||
*
|
||||
* @type string $0 Sitemap name.
|
||||
* @type string $1 Sitemap subtype name.
|
||||
* @type int $3 Sitemap page.
|
||||
* @type string|false $4 Sitemap URL.
|
||||
* }
|
||||
*/
|
||||
function pretty_permalinks_provider() {
|
||||
return array(
|
||||
array( 'posts', 'post', 1, home_url( '/wp-sitemap-posts-post-1.xml' ) ),
|
||||
array( 'posts', 'post', 0, home_url( '/wp-sitemap-posts-post-1.xml' ) ),
|
||||
array( 'posts', 'page', 1, home_url( '/wp-sitemap-posts-page-1.xml' ) ),
|
||||
array( 'posts', 'page', 5, home_url( '/wp-sitemap-posts-page-5.xml' ) ),
|
||||
// post_type doesn't exist.
|
||||
array( 'posts', 'foo', 5, false ),
|
||||
array( 'taxonomies', 'category', 1, home_url( '/wp-sitemap-taxonomies-category-1.xml' ) ),
|
||||
array( 'taxonomies', 'post_tag', 1, home_url( '/wp-sitemap-taxonomies-post_tag-1.xml' ) ),
|
||||
// negative paged, gets converted to it's absolute value.
|
||||
array( 'taxonomies', 'post_tag', -1, home_url( '/wp-sitemap-taxonomies-post_tag-1.xml' ) ),
|
||||
array( 'users', '', 4, home_url( '/wp-sitemap-users-4.xml' ) ),
|
||||
// users provider doesn't allow subtypes.
|
||||
array( 'users', 'foo', 4, false ),
|
||||
// provider doesn't exist.
|
||||
array( 'foo', '', 4, false ),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user