From 49852ed54ffaf91a2c1e00b478c74d7d317517d6 Mon Sep 17 00:00:00 2001 From: Ryan McCue Date: Tue, 28 Nov 2017 07:09:43 +0000 Subject: [PATCH] REST API: Ensure rest_url() consistently has leading slash. `rest_url()` inconsistent addes slashes to the passed path depending on whether the site has pretty permalinks enabled. Apart from being inconsistent, this also caused the unit tests to fail when pretty permalinks are enabled. Props frank-klein. Fixes #42452. See #41451. git-svn-id: https://develop.svn.wordpress.org/trunk@42250 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/rest-api.php | 6 +++--- tests/phpunit/tests/rest-api.php | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php index 82d856a063..cba8182af4 100644 --- a/src/wp-includes/rest-api.php +++ b/src/wp-includes/rest-api.php @@ -307,6 +307,8 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) { $path = '/'; } + $path = '/' . ltrim( $path, '/' ); + if ( is_multisite() && get_blog_option( $blog_id, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) { global $wp_rewrite; @@ -316,7 +318,7 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) { $url = get_home_url( $blog_id, rest_get_url_prefix(), $scheme ); } - $url .= '/' . ltrim( $path, '/' ); + $url .= $path; } else { $url = trailingslashit( get_home_url( $blog_id, '', $scheme ) ); // nginx only allows HTTP/1.0 methods when redirecting from / to /index.php @@ -325,8 +327,6 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) { $url .= 'index.php'; } - $path = '/' . ltrim( $path, '/' ); - $url = add_query_arg( 'rest_route', $path, $url ); } diff --git a/tests/phpunit/tests/rest-api.php b/tests/phpunit/tests/rest-api.php index 45c1ccef71..68a07c8899 100644 --- a/tests/phpunit/tests/rest-api.php +++ b/tests/phpunit/tests/rest-api.php @@ -488,6 +488,33 @@ class Tests_REST_API extends WP_UnitTestCase { } + /** + * @ticket 42452 + */ + public function test_always_prepend_path_with_slash_in_rest_url_filter() { + $filter = new MockAction(); + add_filter( 'rest_url', array( $filter, 'filter' ), 10, 2 ); + + // Passing no path should return a slash. + get_rest_url(); + $args = $filter->get_args(); + $this->assertEquals( '/', $args[0][1] ); + $filter->reset(); + + // Paths without a prepended slash should have one added. + get_rest_url( null, 'wp/media/' ); + $args = $filter->get_args(); + $this->assertEquals( '/wp/media/', $args[0][1] ); + $filter->reset(); + + // Do not modify paths with a prepended slash. + get_rest_url( null, '/wp/media/' ); + $args = $filter->get_args(); + $this->assertEquals( '/wp/media/', $args[0][1] ); + + unset( $filter ); + } + public function jsonp_callback_provider() { return array( // Standard names