diff --git a/wp-includes/blocks.php b/wp-includes/blocks.php index e68eb36b4b..fdd9de9aff 100644 --- a/wp-includes/blocks.php +++ b/wp-includes/blocks.php @@ -1135,6 +1135,47 @@ function insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata( &$parsed_a return $markup; } +/** + * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks. + * + * @since 6.6.0 + * + * @param WP_REST_Response $response The response object. + * @param WP_Post $post Post object. + * @return WP_REST_Response The response object. + */ +function insert_hooked_blocks_into_rest_response( $response, $post ) { + if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) { + return $response; + } + + $attributes = array(); + $ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true ); + if ( ! empty( $ignored_hooked_blocks ) ) { + $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true ); + $attributes['metadata'] = array( + 'ignoredHookedBlocks' => $ignored_hooked_blocks, + ); + } + $content = get_comment_delimited_block_content( + 'core/navigation', + $attributes, + $response->data['content']['raw'] + ); + + $content = apply_block_hooks_to_content( $content, $post ); + + // Remove mock Navigation block wrapper. + $content = remove_serialized_parent_block( $content ); + + $response->data['content']['raw'] = $content; + + /** This filter is documented in wp-includes/post-template.php */ + $response->data['content']['rendered'] = apply_filters( 'the_content', $content ); + + return $response; +} + /** * Returns a function that injects the theme attribute into, and hooked blocks before, a given block. * diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index f0f1df4f74..b653d3a9af 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -760,4 +760,7 @@ add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_me // Update ignoredHookedBlocks postmeta for wp_navigation post type. add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); +// Inject hooked blocks into the wp_navigation post type REST response. +add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); + unset( $filter, $action ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 3bf39b1e06..3ade8f33e9 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.6-alpha-58291'; +$wp_version = '6.6-alpha-58292'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.