diff --git a/src/wp-includes/navigation-fallback.php b/src/wp-includes/navigation-fallback.php index e5bcc168019d7..6c109f6504cb4 100644 --- a/src/wp-includes/navigation-fallback.php +++ b/src/wp-includes/navigation-fallback.php @@ -22,20 +22,35 @@ * @param array $schema the schema for the `wp_navigation` post. * @return array the modified schema. */ -function wp_add_fields_to_navigation_fallback_embeded_links( $schema ) { +function wp_add_fields_to_navigation_fallback_embedded_links( $schema ) { // Expose top level fields. $schema['properties']['status']['context'] = array_merge( $schema['properties']['status']['context'], array( 'embed' ) ); $schema['properties']['content']['context'] = array_merge( $schema['properties']['content']['context'], array( 'embed' ) ); - // Expose sub properties of content field. + /* + * Exposes sub properties of content field. + * These sub properties aren't exposed by the posts controller by default, + * only when the post type attribute is `'editor'`. + * + * @see WP_REST_Posts_Controller::get_item_schema() + */ $schema['properties']['content']['properties']['raw']['context'] = array_merge( $schema['properties']['content']['properties']['raw']['context'], array( 'embed' ) ); $schema['properties']['content']['properties']['rendered']['context'] = array_merge( $schema['properties']['content']['properties']['rendered']['context'], array( 'embed' ) ); $schema['properties']['content']['properties']['block_version']['context'] = array_merge( $schema['properties']['content']['properties']['block_version']['context'], array( 'embed' ) ); + /* + * Exposes sub properties of title field. + * These sub properties aren't exposed by the posts controller by default, + * only when the post type attribute is `'editor'`. + * + * @see WP_REST_Posts_Controller::get_item_schema() + */ + $schema['properties']['title']['properties']['raw']['context'] = array_merge( $schema['properties']['title']['properties']['raw']['context'], array( 'embed' ) ); + return $schema; } add_filter( 'rest_wp_navigation_item_schema', - 'wp_add_fields_to_navigation_fallback_embeded_links' + 'wp_add_fields_to_navigation_fallback_embedded_links' ); diff --git a/tests/phpunit/tests/rest-api/rest-navigation-fallback-controller.php b/tests/phpunit/tests/rest-api/rest-navigation-fallback-controller.php index 263547da5d09d..877f1f402587b 100644 --- a/tests/phpunit/tests/rest-api/rest-navigation-fallback-controller.php +++ b/tests/phpunit/tests/rest-api/rest-navigation-fallback-controller.php @@ -143,6 +143,49 @@ public function test_adds_links() { $this->assertTrue( $links['self'][0]['attributes']['embeddable'], 'Self link should be embeddable.' ); } + /** + * Tests that the correct filters are applied to the context parameter. + * + * By default, the REST response for the Posts Controller will not return all fields + * when the context is set to 'embed'. Assert that correct additional fields are added + * to the embedded Navigation Post, when the navigation fallback endpoint + * is called with the `_embed` param. + * + * @ticket 58557 + * @covers wp_add_fields_to_navigation_fallback_embeded_links + * + * @since 6.3.0 Added Navigation Fallbacks endpoint. + */ + public function test_embedded_navigation_post_contains_required_fields() { + // First we'll use the navigation fallback to get a link to the navigation endpoint. + $request = new WP_REST_Request( 'GET', '/wp-block-editor/v1/navigation-fallback' ); + $response = rest_get_server()->dispatch( $request ); + $links = $response->get_links(); + + // Extract the navigation endpoint URL from the response. + $embedded_navigation_href = $links['self'][0]['href']; + preg_match( '/\?rest_route=(.*)/', $embedded_navigation_href, $matches ); + $navigation_endpoint = $matches[1]; + + // Fetch the "linked" navigation post from the endpoint, with the context parameter set to 'embed' to simulate fetching embedded links. + $request = new WP_REST_Request( 'GET', $navigation_endpoint ); + $request->set_param( 'context', 'embed' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + + // Verify that the additional status field is present. + $this->assertArrayHasKey( 'status', $data, 'Response title should contain a "status" field.' ); + + // Verify that the additional content fields are present. + $this->assertArrayHasKey( 'content', $data, 'Response should contain a "content" field.' ); + $this->assertArrayHasKey( 'raw', $data['content'], 'Response content should contain a "raw" field.' ); + $this->assertArrayHasKey( 'rendered', $data['content'], 'Response content should contain a "rendered" field.' ); + $this->assertArrayHasKey( 'block_version', $data['content'], 'Response should contain a "block_version" field.' ); + + // Verify that the additional title.raw field is present. + $this->assertArrayHasKey( 'raw', $data['title'], 'Response title should contain a "raw" key.' ); + } + private function get_navigations_in_database() { $navs_in_db = new WP_Query( array(