diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index bef4ea3bce6e8..59888736f7c5d 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -853,18 +853,24 @@ function get_comment_delimited_block_content( $block_name, $block_attributes, $b * * @param array $block A representative array of a single parsed block object. See WP_Block_Parser_Block. * @param callable|null $callback Optional. Callback to run on each block in the tree before serialization. Default null. + * It is called with the following arguments: $block, $parent_block, $block_index, $chunk_index. * @return string String of rendered HTML. */ function serialize_block( $block, $callback = null ) { - if ( is_callable( $callback ) ) { - $block = call_user_func( $callback, $block ); - } - $block_content = ''; - $index = 0; - foreach ( $block['innerContent'] as $chunk ) { - $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ], $callback ); + $block_index = 0; + foreach ( $block['innerContent'] as $chunk_index => $chunk ) { + if ( is_string( $chunk ) ) { + $block_content .= $chunk; + } else { + $inner_block = $block['innerBlocks'][ $block_index ]; + if ( is_callable( $callback ) ) { + $inner_block = call_user_func( $callback, $inner_block, $block, $block_index, $chunk_index ); + } + $block_index++; + $block_content .= serialize_block( $inner_block, $callback ); + } } if ( ! is_array( $block['attrs'] ) ) { @@ -887,11 +893,16 @@ function serialize_block( $block, $callback = null ) { * * @param array[] $blocks An array of representative arrays of parsed block objects. See serialize_block(). * @param callable|null $callback Optional. Callback to run on each block in the tree before serialization. Default null. + * It is called with the following arguments: $block, $parent_block, $block_index, $chunk_index. * @return string String of rendered HTML. */ function serialize_blocks( $blocks, $callback = null ) { $result = ''; foreach ( $blocks as $block ) { + if ( is_callable( $callback ) ) { + // At the top level, there is no parent block, block index, or chunk index to pass to the callback. + $block = call_user_func( $callback, $block ); + } $result .= serialize_block( $block, $callback ); } return $result;