diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php index 3be89b99cc..cb0756b96b 100644 --- a/src/wp-includes/rest-api/class-wp-rest-server.php +++ b/src/wp-includes/rest-api/class-wp-rest-server.php @@ -532,40 +532,24 @@ class WP_REST_Server { foreach ( $links as $item ) { // Determine if the link is embeddable. - if ( empty( $item['embeddable'] ) || strpos( $item['href'], $api_root ) !== 0 ) { + if ( empty( $item['embeddable'] ) ) { // Ensure we keep the same order. $embeds[] = array(); continue; } // Run through our internal routing and serve. - $route = substr( $item['href'], strlen( untrailingslashit( $api_root ) ) ); - $query_params = array(); - - // Parse out URL query parameters. - $parsed = parse_url( $route ); - if ( empty( $parsed['path'] ) ) { + $request = WP_REST_Request::from_url( $item['href'] ); + if ( ! $request ) { $embeds[] = array(); continue; } - if ( ! empty( $parsed['query'] ) ) { - parse_str( $parsed['query'], $query_params ); - - // Ensure magic quotes are stripped. - if ( get_magic_quotes_gpc() ) { - $query_params = stripslashes_deep( $query_params ); - } - } - // Embedded resources get passed context=embed. - if ( empty( $query_params['context'] ) ) { - $query_params['context'] = 'embed'; + if ( empty( $request['context'] ) ) { + $request['context'] = 'embed'; } - $request = new WP_REST_Request( 'GET', $parsed['path'] ); - - $request->set_query_params( $query_params ); $response = $this->dispatch( $request ); /** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */ diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php index 52b3ba6ca3..7d5cf68041 100644 --- a/tests/phpunit/tests/rest-api/rest-server.php +++ b/tests/phpunit/tests/rest-api/rest-server.php @@ -492,7 +492,9 @@ class Tests_REST_Server extends WP_Test_REST_TestCase { ) ); $response = new WP_REST_Response(); - $response->add_link( 'alternate', rest_url( '/test/embeddable?parsed_params=yes' ), array( 'embeddable' => true ) ); + $url = rest_url( '/test/embeddable' ); + $url = add_query_arg( 'parsed_params', 'yes', $url ); + $response->add_link( 'alternate', $url, array( 'embeddable' => true ) ); $data = $this->server->response_to_data( $response, true ); @@ -514,7 +516,9 @@ class Tests_REST_Server extends WP_Test_REST_TestCase { ) ); $response = new WP_REST_Response(); - $response->add_link( 'up', rest_url( '/test/embeddable?error=1' ), array( 'embeddable' => true ) ); + $url = rest_url( '/test/embeddable' ); + $url = add_query_arg( 'error', '1', $url ); + $response->add_link( 'up', $url, array( 'embeddable' => true ) ); $data = $this->server->response_to_data( $response, true );