Apply the pre_render_block, render_block_data, and render_block_context filters when rendering inner/nested blocks. Introdices another param to these filters: $parent_block that is the "parent" WP_Block instance for nested blocks and null for top level blocks. Adds unit tests for the filters.

Props noisysocks, gaambo, azaozz.
Fixes #51612.
Built from https://develop.svn.wordpress.org/trunk@51894


git-svn-id: http://core.svn.wordpress.org/trunk@51487 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Andrew Ozz 2021-10-06 18:49:01 +00:00
parent b3d3473ba0
commit 2dc8f381ca
3 changed files with 51 additions and 13 deletions

View File

@ -813,6 +813,7 @@ function _excerpt_render_inner_blocks( $parsed_block, $allowed_blocks ) {
*/ */
function render_block( $parsed_block ) { function render_block( $parsed_block ) {
global $post; global $post;
$parent_block = null;
/** /**
* Allows render_block() to be short-circuited, by returning a non-null value. * Allows render_block() to be short-circuited, by returning a non-null value.
@ -821,8 +822,9 @@ function render_block( $parsed_block ) {
* *
* @param string|null $pre_render The pre-rendered content. Default null. * @param string|null $pre_render The pre-rendered content. Default null.
* @param array $parsed_block The block being rendered. * @param array $parsed_block The block being rendered.
* @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
*/ */
$pre_render = apply_filters( 'pre_render_block', null, $parsed_block ); $pre_render = apply_filters( 'pre_render_block', null, $parsed_block, $parent_block );
if ( ! is_null( $pre_render ) ) { if ( ! is_null( $pre_render ) ) {
return $pre_render; return $pre_render;
} }
@ -836,8 +838,9 @@ function render_block( $parsed_block ) {
* *
* @param array $parsed_block The block being rendered. * @param array $parsed_block The block being rendered.
* @param array $source_block An un-modified copy of $parsed_block, as it appeared in the source content. * @param array $source_block An un-modified copy of $parsed_block, as it appeared in the source content.
* @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
*/ */
$parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block ); $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block, $parent_block );
$context = array(); $context = array();
@ -860,8 +863,9 @@ function render_block( $parsed_block ) {
* *
* @param array $context Default context. * @param array $context Default context.
* @param array $parsed_block Block being rendered, filtered by `render_block_data`. * @param array $parsed_block Block being rendered, filtered by `render_block_data`.
* @param WP_Block|null $parent_block If this is a nested block, a reference to the parent block.
*/ */
$context = apply_filters( 'render_block_context', $context, $parsed_block ); $context = apply_filters( 'render_block_context', $context, $parsed_block, $parent_block );
$block = new WP_Block( $parsed_block, $context ); $block = new WP_Block( $parsed_block, $context );

View File

@ -57,6 +57,15 @@ class WP_Block {
*/ */
protected $available_context; protected $available_context;
/**
* Block type registry.
*
* @since 5.9.0
* @var WP_Block_Type_Registry
* @access protected
*/
protected $registry;
/** /**
* List of inner blocks (of this same class) * List of inner blocks (of this same class)
* *
@ -115,6 +124,8 @@ class WP_Block {
$registry = WP_Block_Type_Registry::get_instance(); $registry = WP_Block_Type_Registry::get_instance();
} }
$this->registry = $registry;
$this->block_type = $registry->get_registered( $this->name ); $this->block_type = $registry->get_registered( $this->name );
$this->available_context = $available_context; $this->available_context = $available_context;
@ -205,10 +216,33 @@ class WP_Block {
if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) { if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) {
$index = 0; $index = 0;
foreach ( $this->inner_content as $chunk ) { foreach ( $this->inner_content as $chunk ) {
$block_content .= is_string( $chunk ) ? if ( is_string( $chunk ) ) {
$chunk : $block_content .= $chunk;
$this->inner_blocks[ $index++ ]->render(); } else {
$inner_block = $this->inner_blocks[ $index ];
$parent_block = $this;
/** This filter is documented in wp-includes/blocks.php */
$pre_render = apply_filters( 'pre_render_block', null, $inner_block->parsed_block, $parent_block );
if ( ! is_null( $pre_render ) ) {
$block_content .= $pre_render;
} else {
$source_block = $inner_block->parsed_block;
/** This filter is documented in wp-includes/blocks.php */
$inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block );
/** This filter is documented in wp-includes/blocks.php */
$inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block );
$block_content .= $inner_block->render();
}
$index++;
}
} }
} }

View File

@ -16,7 +16,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '5.9-alpha-51893'; $wp_version = '5.9-alpha-51894';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.