diff --git a/src/wp-includes/block-template-utils.php b/src/wp-includes/block-template-utils.php index a4e54432d2aa2..f71ae26aab220 100644 --- a/src/wp-includes/block-template-utils.php +++ b/src/wp-includes/block-template-utils.php @@ -547,15 +547,18 @@ function _build_block_template_result_from_file( $template_file, $template_type $template->area = $template_file['area']; } - $before_block_visitor = '_inject_theme_attribute_in_template_part_block'; + $before_block_visitor = ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ? '_inject_theme_attribute_in_template_part_block' : null; $after_block_visitor = null; $hooked_blocks = get_hooked_blocks(); if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) { $before_block_visitor = make_before_block_visitor( $hooked_blocks, $template ); $after_block_visitor = make_after_block_visitor( $hooked_blocks, $template ); } - $blocks = parse_blocks( $template_content ); - $template->content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor ); + if ( null !== $before_block_visitor || null !== $after_block_visitor ) { + $blocks = parse_blocks( $template_content ); + $template_content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor ); + } + $template->content = $template_content; return $template; } diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index ecb4fa5b3dfb4..3a2e943ad5cfc 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -779,7 +779,9 @@ function make_before_block_visitor( $hooked_blocks, $context ) { * @return string The serialized markup for the given block, with the markup for any hooked blocks prepended to it. */ return function ( &$block, $parent_block = null, $prev = null ) use ( $hooked_blocks, $context ) { - _inject_theme_attribute_in_template_part_block( $block ); + if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { + _inject_theme_attribute_in_template_part_block( $block ); + } $markup = ''; diff --git a/src/wp-includes/class-wp-block-patterns-registry.php b/src/wp-includes/class-wp-block-patterns-registry.php index a11bac06bef02..1c528abb3f92e 100644 --- a/src/wp-includes/class-wp-block-patterns-registry.php +++ b/src/wp-includes/class-wp-block-patterns-registry.php @@ -165,14 +165,16 @@ public function unregister( $pattern_name ) { private function prepare_content( $pattern, $hooked_blocks ) { $content = $pattern['content']; - $before_block_visitor = '_inject_theme_attribute_in_template_part_block'; + $before_block_visitor = ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ? '_inject_theme_attribute_in_template_part_block' : null; $after_block_visitor = null; if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) { $before_block_visitor = make_before_block_visitor( $hooked_blocks, $pattern ); $after_block_visitor = make_after_block_visitor( $hooked_blocks, $pattern ); } - $blocks = parse_blocks( $content ); - $content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor ); + if ( null !== $before_block_visitor || null !== $after_block_visitor ) { + $blocks = parse_blocks( $content ); + $content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor ); + } return $content; } diff --git a/tests/phpunit/tests/block-template-utils.php b/tests/phpunit/tests/block-template-utils.php index b06e931529f1e..814e1ee8511ed 100644 --- a/tests/phpunit/tests/block-template-utils.php +++ b/tests/phpunit/tests/block-template-utils.php @@ -161,64 +161,6 @@ public function test_build_block_template_result_from_file() { $this->assertEmpty( $template_part->modified ); } - /** - * @ticket 59325 - * - * @covers ::_build_block_template_result_from_file - * - * @dataProvider data_build_block_template_result_from_file_injects_theme_attribute - * - * @param string $filename The template's filename. - * @param string $expected The expected block markup. - */ - public function test_build_block_template_result_from_file_injects_theme_attribute( $filename, $expected ) { - $template = _build_block_template_result_from_file( - array( - 'slug' => 'single', - 'path' => DIR_TESTDATA . "/templates/$filename", - ), - 'wp_template' - ); - $this->assertSame( $expected, $template->content ); - } - - /** - * Data provider. - * - * @return array[] - */ - public function data_build_block_template_result_from_file_injects_theme_attribute() { - $theme = 'block-theme'; - return array( - 'a template with a template part block' => array( - 'filename' => 'template-with-template-part.html', - 'expected' => sprintf( - '', - $theme - ), - ), - 'a template with a template part block nested inside another block' => array( - 'filename' => 'template-with-nested-template-part.html', - 'expected' => sprintf( - ' - -', - $theme - ), - ), - 'a template with a template part block with an existing theme attribute' => array( - 'filename' => 'template-with-template-part-with-existing-theme-attribute.html', - 'expected' => '', - ), - 'a template with no template part block' => array( - 'filename' => 'template.html', - 'expected' => ' -

Just a paragraph

-', - ), - ); - } - /** * @ticket 59338 * diff --git a/tests/phpunit/tests/blocks/renderBlockCoreTemplatePart.php b/tests/phpunit/tests/blocks/renderBlockCoreTemplatePart.php new file mode 100644 index 0000000000000..b85c4c821d6f6 --- /dev/null +++ b/tests/phpunit/tests/blocks/renderBlockCoreTemplatePart.php @@ -0,0 +1,121 @@ +original_block_to_render = WP_Block_Supports::$block_to_render; + } + + public function tear_down() { + WP_Block_Supports::$block_to_render = $this->original_block_to_render; + $this->original_block_to_render = null; + + if ( $this->switch_to_default_theme_at_teardown ) { + $this->switch_to_default_theme_at_teardown = false; + switch_theme( WP_DEFAULT_THEME ); + } + + parent::tear_down(); + } + + /** + * Tests that the core template part block assumes the current theme if no theme attribute provided. + * + * @ticket 59583 + */ + public function test_render_block_core_template_part_without_theme_attribute() { + $this->maybe_switch_theme( 'block-theme' ); + + WP_Block_Supports::$block_to_render = array( 'blockName' => 'core/template-part' ); + + $content = render_block_core_template_part( array( 'slug' => 'small-header' ) ); + + $expected = '
' . "\n"; + $expected .= '

Small Header Template Part

' . "\n"; + $expected .= '
'; + + $this->assertSame( $expected, $content ); + } + + /** + * Tests that the core template part block returns the relevant part if current theme attribute provided. + * + * @ticket 59583 + */ + public function test_render_block_core_template_part_with_current_theme_attribute() { + $this->maybe_switch_theme( 'block-theme' ); + + WP_Block_Supports::$block_to_render = array( 'blockName' => 'core/template-part' ); + + $content = render_block_core_template_part( + array( + 'slug' => 'small-header', + 'theme' => 'block-theme', + ) + ); + + $expected = '
' . "\n"; + $expected .= '

Small Header Template Part

' . "\n"; + $expected .= '
'; + + $this->assertSame( $expected, $content ); + } + + /** + * Tests that the core template part block returns nothing if theme attribute for a different theme provided. + * + * @ticket 59583 + */ + public function test_render_block_core_template_part_with_another_theme_attribute() { + $this->maybe_switch_theme( 'block-theme' ); + + WP_Block_Supports::$block_to_render = array( 'blockName' => 'core/template-part' ); + + $content = render_block_core_template_part( + array( + 'slug' => 'small-header', + 'theme' => WP_DEFAULT_THEME, + ) + ); + + $expected = 'Template part has been deleted or is unavailable: small-header'; + $this->assertSame( $expected, $content ); + } + + /** + * Switches the theme when not the default theme. + * + * @param string $theme Theme name to switch to. + */ + private function maybe_switch_theme( $theme ) { + if ( WP_DEFAULT_THEME === $theme ) { + return; + } + + switch_theme( $theme ); + $this->switch_to_default_theme_at_teardown = true; + } +} diff --git a/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php index 61298d1b164af..8eb4fce78b251 100644 --- a/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php +++ b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php @@ -316,29 +316,6 @@ public function test_get_registered() { $this->assertSame( $pattern_two, $pattern ); } - /** - * Should insert a theme attribute into Template Part blocks in registered patterns. - * - * @ticket 59583 - * - * @covers WP_Block_Patterns_Registry::register - * @covers WP_Block_Patterns_Registry::get_all_registered - */ - public function test_get_all_registered_includes_theme_attribute() { - $test_pattern = array( - 'title' => 'Test Pattern', - 'content' => '', - ); - $this->registry->register( 'test/pattern', $test_pattern ); - - $expected = sprintf( - '', - get_stylesheet() - ); - $patterns = $this->registry->get_all_registered(); - $this->assertSame( $expected, $patterns[0]['content'] ); - } - /** * Should insert hooked blocks into registered patterns. * @@ -391,29 +368,6 @@ public function test_get_all_registered_includes_hooked_blocks() { $this->assertSame( $expected, $registered ); } - /** - * Should insert a theme attribute into Template Part blocks in registered patterns. - * - * @ticket 59583 - * - * @covers WP_Block_Patterns_Registry::register - * @covers WP_Block_Patterns_Registry::get_registered - */ - public function test_get_registered_includes_theme_attribute() { - $test_pattern = array( - 'title' => 'Test Pattern', - 'content' => '', - ); - $this->registry->register( 'test/pattern', $test_pattern ); - - $expected = sprintf( - '', - get_stylesheet() - ); - $pattern = $this->registry->get_registered( 'test/pattern' ); - $this->assertSame( $expected, $pattern['content'] ); - } - /** * Should insert hooked blocks into registered patterns. *