diff --git a/src/wp-includes/block-supports/layout.php b/src/wp-includes/block-supports/layout.php
index 70d1fe4255..67d6a3f1b7 100644
--- a/src/wp-includes/block-supports/layout.php
+++ b/src/wp-includes/block-supports/layout.php
@@ -638,7 +638,7 @@ function wp_render_layout_support_flag( $block_content, $block ) {
* for features like the enhanced pagination of the Query block.
*/
$container_class = wp_unique_prefixed_id(
- 'wp-container-' . sanitize_title( $block['blockName'] ) . '-layout-'
+ 'wp-container-' . sanitize_title( $block['blockName'] ) . '-is-layout-'
);
// Set the correct layout type for blocks using legacy content width.
@@ -883,17 +883,45 @@ function wp_restore_group_inner_container( $block_content, $block ) {
return $block_content;
}
- $replace_regex = sprintf(
+ /*
+ * This filter runs after the layout classnames have been added to the block, so they
+ * have to be removed from the outer wrapper and then added to the inner.
+ */
+ $layout_classes = array();
+ $processor = new WP_HTML_Tag_Processor( $block_content );
+
+ if ( $processor->next_tag( array( 'class_name' => 'wp-block-group' ) ) ) {
+ foreach ( $processor->class_list() as $class_name ) {
+ if ( str_contains( $class_name, 'is-layout-' ) ) {
+ $layout_classes[] = $class_name;
+ $processor->remove_class( $class_name );
+ }
+ }
+ }
+
+ $content_without_layout_classes = $processor->get_updated_html();
+ $replace_regex = sprintf(
'/(^\s*<%1$s\b[^>]*wp-block-group[^>]*>)(.*)(<\/%1$s>\s*$)/ms',
preg_quote( $tag_name, '/' )
);
- $updated_content = preg_replace_callback(
+ $updated_content = preg_replace_callback(
$replace_regex,
static function ( $matches ) {
return $matches[1] . '
' . $matches[2] . '
' . $matches[3];
},
- $block_content
+ $content_without_layout_classes
);
+
+ // Add layout classes to inner wrapper.
+ if ( ! empty( $layout_classes ) ) {
+ $processor = new WP_HTML_Tag_Processor( $updated_content );
+ if ( $processor->next_tag( array( 'class_name' => 'wp-block-group__inner-container' ) ) ) {
+ foreach ( $layout_classes as $class_name ) {
+ $processor->add_class( $class_name );
+ }
+ }
+ $updated_content = $processor->get_updated_html();
+ }
return $updated_content;
}
diff --git a/tests/phpunit/tests/block-supports/layout.php b/tests/phpunit/tests/block-supports/layout.php
index df0abf9b49..379c10fe2b 100644
--- a/tests/phpunit/tests/block-supports/layout.php
+++ b/tests/phpunit/tests/block-supports/layout.php
@@ -252,4 +252,94 @@ class Test_Block_Supports_Layout extends WP_UnitTestCase {
),
);
}
+
+ /**
+ * Check that wp_restore_group_inner_container() restores the legacy inner container on the Group block.
+ *
+ * @ticket 60130
+ *
+ * @covers ::wp_restore_group_inner_container
+ *
+ * @dataProvider data_restore_group_inner_container
+ *
+ * @param array $args Dataset to test.
+ * @param string $expected_output The expected output.
+ */
+ public function test_restore_group_inner_container( $args, $expected_output ) {
+ $actual_output = wp_restore_group_inner_container( $args['block_content'], $args['block'] );
+ $this->assertEquals( $expected_output, $actual_output );
+ }
+
+ /**
+ * Data provider for test_restore_group_inner_container.
+ *
+ * @return array
+ */
+ public function data_restore_group_inner_container() {
+ return array(
+ 'group block with existing inner container' => array(
+ 'args' => array(
+ 'block_content' => '',
+ 'block' => array(
+ 'blockName' => 'core/group',
+ 'attrs' => array(
+ 'layout' => array(
+ 'type' => 'default',
+ ),
+ ),
+ 'innerBlocks' => array(),
+ 'innerHTML' => '',
+ 'innerContent' => array(
+ '',
+ ),
+ ),
+ ),
+ 'expected_output' => '',
+ ),
+ 'group block with no existing inner container' => array(
+ 'args' => array(
+ 'block_content' => '',
+ 'block' => array(
+ 'blockName' => 'core/group',
+ 'attrs' => array(
+ 'layout' => array(
+ 'type' => 'default',
+ ),
+ ),
+ 'innerBlocks' => array(),
+ 'innerHTML' => '',
+ 'innerContent' => array(
+ '',
+ ' ',
+ '
',
+ ),
+ ),
+ ),
+ 'expected_output' => '',
+ ),
+ 'group block with layout classnames' => array(
+ 'args' => array(
+ 'block_content' => '',
+ 'block' => array(
+ 'blockName' => 'core/group',
+ 'attrs' => array(
+ 'layout' => array(
+ 'type' => 'default',
+ ),
+ ),
+ 'innerBlocks' => array(),
+ 'innerHTML' => '',
+ 'innerContent' => array(
+ '',
+ ' ',
+ '
',
+ ),
+ ),
+ ),
+ 'expected_output' => '',
+ ),
+ );
+ }
}