From b009613b3143049c29f94f0cc7e087822c19d451 Mon Sep 17 00:00:00 2001 From: Alquen Sarmiento Date: Fri, 17 Jul 2026 22:29:11 +0800 Subject: [PATCH] fix: remove null markers for non-stackable blocks that have been removed --- .../block-defaults/custom-block-styles.php | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/deprecated/block-defaults/custom-block-styles.php b/src/deprecated/block-defaults/custom-block-styles.php index 47e95f77e..ab2869f82 100644 --- a/src/deprecated/block-defaults/custom-block-styles.php +++ b/src/deprecated/block-defaults/custom-block-styles.php @@ -307,8 +307,16 @@ public function sanitize_parsed_blocks( $blocks ) { $block['attrs'] = $this->sanitize_block_style_data_value( $block['attrs'] ); } - if ( ! empty( $block['innerBlocks'] ) ) { - $block['innerBlocks'] = $this->sanitize_parsed_blocks( $block['innerBlocks'] ); + // Keep original indexes so matching innerContent null markers can be removed when a child block is sanitized out. + $inner_blocks = array(); + if ( ! empty( $block['innerBlocks'] ) && is_array( $block['innerBlocks'] ) ) { + foreach ( $block['innerBlocks'] as $index => $inner_block ) { + $sanitized_inner_block = $this->sanitize_parsed_blocks( array( $inner_block ) ); + if ( ! empty( $sanitized_inner_block ) ) { + $inner_blocks[ $index ] = $sanitized_inner_block[0]; + } + } + $block['innerBlocks'] = array_values( $inner_blocks ); } if ( ! empty( $block['innerHTML'] ) ) { @@ -322,6 +330,10 @@ function( $content ) { }, $block['innerContent'] ); + $inner_content = $this->remove_orphan_inner_content_markers( $block['innerContent'], $inner_blocks ); + // innerBlocks and innerContent must stay aligned for WordPress' serialize_block(). + $block['innerContent'] = $inner_content['innerContent']; + $block['innerBlocks'] = $inner_content['innerBlocks']; } $sanitized[] = $block; @@ -330,6 +342,38 @@ function( $content ) { return $sanitized; } + /** + * Keep innerContent null markers aligned with surviving innerBlocks. + * + * @param array $inner_content Parsed block innerContent. + * @param array $inner_blocks Parsed block innerBlocks keyed by original index. + * @return array + */ + public function remove_orphan_inner_content_markers( $inner_content, $inner_blocks ) { + $inner_block_index = 0; + $sanitized_inner_blocks = array(); + $sanitized_inner_content = array(); + + foreach ( $inner_content as $content ) { + if ( $content === null ) { + // Each null marker points to the next original inner block. + if ( array_key_exists( $inner_block_index, $inner_blocks ) ) { + $sanitized_inner_content[] = null; + $sanitized_inner_blocks[] = $inner_blocks[ $inner_block_index ]; + } + $inner_block_index++; + continue; + } + + $sanitized_inner_content[] = $content; + } + + return array( + 'innerBlocks' => $sanitized_inner_blocks, + 'innerContent' => $sanitized_inner_content, + ); + } + public function register_route() { register_rest_route( 'stackable/v2', '/update_block_style', array( 'methods' => 'POST',