diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index ecb4fa5b3dfb4..01cc2070ac779 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1062,18 +1062,20 @@ function traverse_and_serialize_block( $block, $pre_callback = null, $post_callb ); } - $block_content .= traverse_and_serialize_block( $inner_block, $pre_callback, $post_callback ); - if ( is_callable( $post_callback ) ) { $next = count( $block['innerBlocks'] ) - 1 === $block_index ? null : $block['innerBlocks'][ $block_index + 1 ]; - $block_content .= call_user_func_array( + $post_markup = call_user_func_array( $post_callback, array( &$inner_block, $block, $next ) ); } + + $block_content .= traverse_and_serialize_block( $inner_block, $pre_callback, $post_callback ); + $block_content .= isset( $post_markup ) ? $post_markup : ''; + ++$block_index; } } @@ -1135,18 +1137,19 @@ function traverse_and_serialize_blocks( $blocks, $pre_callback = null, $post_cal ); } - $result .= traverse_and_serialize_block( $block, $pre_callback, $post_callback ); - if ( is_callable( $post_callback ) ) { $next = count( $blocks ) - 1 === $index ? null : $blocks[ $index + 1 ]; - $result .= call_user_func_array( + $post_markup = call_user_func_array( $post_callback, array( &$block, null, $next ) // At the top level, there is no parent block to pass to the callback. ); } + + $result .= traverse_and_serialize_block( $block, $pre_callback, $post_callback ); + $result .= isset( $post_markup ) ? $post_markup : ''; } return $result; diff --git a/tests/phpunit/tests/blocks/serialize.php b/tests/phpunit/tests/blocks/serialize.php index 12da03e3cd11f..b4221ef3c5a15 100644 --- a/tests/phpunit/tests/blocks/serialize.php +++ b/tests/phpunit/tests/blocks/serialize.php @@ -74,6 +74,23 @@ public function test_traverse_and_serialize_blocks_pre_callback_modifies_current ); } + /** + * @ticket 59669 + * + * @covers ::traverse_and_serialize_blocks + */ + public function test_traverse_and_serialize_blocks_post_callback_modifies_current_block() { + $markup = "Example.\n\nExample.\n\n"; + $blocks = parse_blocks( $markup ); + + $actual = traverse_and_serialize_blocks( $blocks, null, array( __CLASS__, 'add_attribute_to_inner_block' ) ); + + $this->assertSame( + "Example.\n\nExample.\n\n", + $actual + ); + } + public static function add_attribute_to_inner_block( &$block ) { if ( 'core/inner' === $block['blockName'] ) { $block['attrs']['myattr'] = 'myvalue';