diff -r 7b1b88e27a20 -r 48c4eec2b7e6 wp/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php --- a/wp/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php Thu Sep 29 08:06:27 2022 +0200 +++ b/wp/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php Fri Sep 05 18:40:08 2025 +0200 @@ -120,7 +120,7 @@ * @since 5.9.0 * * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|bool True if the request has read access for the item, WP_Error object otherwise. + * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise. */ public function get_item_permissions_check( $request ) { if ( ! current_user_can( 'edit_theme_options' ) ) { @@ -168,7 +168,8 @@ */ public function prepare_item_for_response( $item, $request ) { // Restores the more descriptive, specific name for use within this method. - $location = $item; + $location = $item; + $locations = get_nav_menu_locations(); $menu = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0; @@ -193,7 +194,9 @@ $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $location ) ); + if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { + $response->add_links( $this->prepare_links( $location ) ); + } /** * Filters menu location data returned from the REST API. @@ -208,6 +211,44 @@ } /** + * Prepares links for the request. + * + * @since 5.9.0 + * + * @param stdClass $location Menu location. + * @return array Links for the given menu location. + */ + protected function prepare_links( $location ) { + $base = sprintf( '%s/%s', $this->namespace, $this->rest_base ); + + // Entity meta. + $links = array( + 'self' => array( + 'href' => rest_url( trailingslashit( $base ) . $location->name ), + ), + 'collection' => array( + 'href' => rest_url( $base ), + ), + ); + + $locations = get_nav_menu_locations(); + $menu = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0; + if ( $menu ) { + $path = rest_get_route_for_term( $menu ); + if ( $path ) { + $url = rest_url( $path ); + + $links['https://api.w.org/menu'][] = array( + 'href' => $url, + 'embeddable' => true, + ); + } + } + + return $links; + } + + /** * Retrieves the menu location's schema, conforming to JSON Schema. * * @since 5.9.0 @@ -260,42 +301,4 @@ 'context' => $this->get_context_param( array( 'default' => 'view' ) ), ); } - - /** - * Prepares links for the request. - * - * @since 5.9.0 - * - * @param stdClass $location Menu location. - * @return array Links for the given menu location. - */ - protected function prepare_links( $location ) { - $base = sprintf( '%s/%s', $this->namespace, $this->rest_base ); - - // Entity meta. - $links = array( - 'self' => array( - 'href' => rest_url( trailingslashit( $base ) . $location->name ), - ), - 'collection' => array( - 'href' => rest_url( $base ), - ), - ); - - $locations = get_nav_menu_locations(); - $menu = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0; - if ( $menu ) { - $path = rest_get_route_for_term( $menu ); - if ( $path ) { - $url = rest_url( $path ); - - $links['https://api.w.org/menu'][] = array( - 'href' => $url, - 'embeddable' => true, - ); - } - } - - return $links; - } }