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