diff --git a/wp-includes/class-wp-block.php b/wp-includes/class-wp-block.php index 4885b99219..3d395255fe 100644 --- a/wp-includes/class-wp-block.php +++ b/wp-includes/class-wp-block.php @@ -408,6 +408,29 @@ class WP_Block { */ public function render( $options = array() ) { global $post; + + /* + * There can be only one root interactive block at a time because the rendered HTML of that block contains + * the rendered HTML of all its inner blocks, including any interactive block. + */ + static $root_interactive_block = null; + /** + * Filters whether Interactivity API should process directives. + * + * @since 6.6.0 + * + * @param bool $enabled Whether the directives processing is enabled. + */ + $interactivity_process_directives_enabled = apply_filters( 'interactivity_process_directives', true ); + if ( + $interactivity_process_directives_enabled && null === $root_interactive_block && ( + ( isset( $this->block_type->supports['interactivity'] ) && true === $this->block_type->supports['interactivity'] ) || + ! empty( $this->block_type->supports['interactivity']['interactive'] ) + ) + ) { + $root_interactive_block = $this; + } + $options = wp_parse_args( $options, array( @@ -533,6 +556,12 @@ class WP_Block { */ $block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block, $this ); + if ( $root_interactive_block === $this ) { + // The root interactive block has finished rendering. Time to process directives. + $block_content = wp_interactivity_process_directives( $block_content ); + $root_interactive_block = null; + } + return $block_content; } } diff --git a/wp-includes/deprecated.php b/wp-includes/deprecated.php index c490fe06ef..6e26606fd0 100644 --- a/wp-includes/deprecated.php +++ b/wp-includes/deprecated.php @@ -6318,3 +6318,22 @@ function wp_render_elements_support( $block_content, $block ) { _deprecated_function( __FUNCTION__, '6.6.0', 'wp_render_elements_class_name' ); return $block_content; } + +/** + * Processes the directives on the rendered HTML of the interactive blocks. + * + * This processes only one root interactive block at a time because the + * rendered HTML of that block contains the rendered HTML of all its inner + * blocks, including any interactive block. It does so by ignoring all the + * interactive inner blocks until the root interactive block is processed. + * + * @since 6.5.0 + * @deprecated 6.6.0 + * + * @param array $parsed_block The parsed block. + * @return array The same parsed block. + */ +function wp_interactivity_process_directives_of_interactive_blocks( array $parsed_block ): array { + _deprecated_function( __FUNCTION__, '6.6.0' ); + return $parsed_block; +} diff --git a/wp-includes/interactivity-api/interactivity-api.php b/wp-includes/interactivity-api/interactivity-api.php index b8f3e508d0..763440e1e3 100644 --- a/wp-includes/interactivity-api/interactivity-api.php +++ b/wp-includes/interactivity-api/interactivity-api.php @@ -7,71 +7,6 @@ * @since 6.5.0 */ -/** - * Processes the directives on the rendered HTML of the interactive blocks. - * - * This processes only one root interactive block at a time because the - * rendered HTML of that block contains the rendered HTML of all its inner - * blocks, including any interactive block. It does so by ignoring all the - * interactive inner blocks until the root interactive block is processed. - * - * @since 6.5.0 - * - * @param array $parsed_block The parsed block. - * @return array The same parsed block. - */ -function wp_interactivity_process_directives_of_interactive_blocks( array $parsed_block ): array { - static $root_interactive_block = null; - - /* - * Checks whether a root interactive block is already annotated for - * processing, and if it is, it ignores the subsequent ones. - */ - if ( null === $root_interactive_block ) { - $block_name = $parsed_block['blockName']; - $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_name ); - - if ( - isset( $block_name ) && - ( ( isset( $block_type->supports['interactivity'] ) && true === $block_type->supports['interactivity'] ) || - ( isset( $block_type->supports['interactivity']['interactive'] ) && true === $block_type->supports['interactivity']['interactive'] ) ) - ) { - // Annotates the root interactive block for processing. - $root_interactive_block = array( $block_name, $parsed_block ); - - /* - * Adds a filter to process the root interactive block once it has - * finished rendering. - */ - $process_interactive_blocks = static function ( string $content, array $parsed_block ) use ( &$root_interactive_block, &$process_interactive_blocks ): string { - // Checks whether the current block is the root interactive block. - list($root_block_name, $root_parsed_block) = $root_interactive_block; - if ( $root_block_name === $parsed_block['blockName'] && $parsed_block === $root_parsed_block ) { - // The root interactive blocks has finished rendering, process it. - $content = wp_interactivity_process_directives( $content ); - // Removes the filter and reset the root interactive block. - remove_filter( 'render_block_' . $parsed_block['blockName'], $process_interactive_blocks ); - $root_interactive_block = null; - } - return $content; - }; - - /* - * Uses a priority of 100 to ensure that other filters can add additional - * directives before the processing starts. - */ - add_filter( 'render_block_' . $block_name, $process_interactive_blocks, 100, 2 ); - } - } - - return $parsed_block; -} -/* - * Uses a priority of 100 to ensure that other filters can add additional attributes to - * $parsed_block before the processing starts. - */ -add_filter( 'render_block_data', 'wp_interactivity_process_directives_of_interactive_blocks', 100, 1 ); - /** * Retrieves the main WP_Interactivity_API instance. * diff --git a/wp-includes/version.php b/wp-includes/version.php index 255f77210d..ea72a87119 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.6-alpha-58233'; +$wp_version = '6.6-alpha-58234'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.