diff --git a/src/wp-includes/block-template-utils.php b/src/wp-includes/block-template-utils.php
index 3f912ad0611b6..9237d1339d02d 100644
--- a/src/wp-includes/block-template-utils.php
+++ b/src/wp-includes/block-template-utils.php
@@ -901,6 +901,14 @@ function _build_block_template_result_from_post( $post ) {
}
}
+ $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 );
+ }
+
return $template;
}
diff --git a/tests/phpunit/tests/block-templates/base.php b/tests/phpunit/tests/block-templates/base.php
index f6a5a9f4dfcec..4add267507505 100644
--- a/tests/phpunit/tests/block-templates/base.php
+++ b/tests/phpunit/tests/block-templates/base.php
@@ -39,7 +39,7 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
'post_type' => 'wp_template',
'post_name' => 'my_template',
'post_title' => 'My Template',
- 'post_content' => 'Content',
+ 'post_content' => '
Template
',
'post_excerpt' => 'Description of my template',
'tax_input' => array(
'wp_theme' => array(
@@ -57,7 +57,7 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
'post_type' => 'wp_template_part',
'post_name' => 'my_template_part',
'post_title' => 'My Template Part',
- 'post_content' => 'Content',
+ 'post_content' => 'Template Part
',
'post_excerpt' => 'Description of my template part',
'tax_input' => array(
'wp_theme' => array(
diff --git a/tests/phpunit/tests/block-templates/buildBlockTemplateResultFromPost.php b/tests/phpunit/tests/block-templates/buildBlockTemplateResultFromPost.php
index 371c50a183533..0d469abe88106 100644
--- a/tests/phpunit/tests/block-templates/buildBlockTemplateResultFromPost.php
+++ b/tests/phpunit/tests/block-templates/buildBlockTemplateResultFromPost.php
@@ -8,6 +8,21 @@
*/
class Tests_Block_Templates_BuildBlockTemplateResultFromPost extends WP_Block_Templates_UnitTestCase {
+ /**
+ * Tear down each test method.
+ *
+ * @since 6.5.0
+ */
+ public function tear_down() {
+ $registry = WP_Block_Type_Registry::get_instance();
+
+ if ( $registry->is_registered( 'tests/my-block' ) ) {
+ $registry->unregister( 'tests/my-block' );
+ }
+
+ parent::tear_down();
+ }
+
/**
* @ticket 54335
*/
@@ -49,4 +64,46 @@ public function test_should_build_template_part() {
$this->assertSame( WP_TEMPLATE_PART_AREA_HEADER, $template_part->area );
$this->assertSame( self::$template_part_post->post_modified, $template_part->modified, 'Template part result properties match' );
}
+
+ /**
+ * @ticket 59646
+ */
+ public function test_should_inject_hooked_block_into_template() {
+ register_block_type(
+ 'tests/my-block',
+ array(
+ 'block_hooks' => array(
+ 'core/heading' => 'before',
+ ),
+ )
+ );
+
+ $template = _build_block_template_result_from_post(
+ self::$template_post,
+ 'wp_template'
+ );
+ $this->assertStringStartsWith( '', $template->content );
+ $this->assertStringContainsString( '"metadata":{"ignoredHookedBlocks":["tests/my-block"]}', $template->content );
+ }
+
+ /**
+ * @ticket 59646
+ */
+ public function test_should_inject_hooked_block_into_template_part() {
+ register_block_type(
+ 'tests/my-block',
+ array(
+ 'block_hooks' => array(
+ 'core/heading' => 'after',
+ ),
+ )
+ );
+
+ $template_part = _build_block_template_result_from_post(
+ self::$template_part_post,
+ 'wp_template_part'
+ );
+ $this->assertStringEndsWith( '', $template_part->content );
+ $this->assertStringContainsString( '"metadata":{"ignoredHookedBlocks":["tests/my-block"]}', $template_part->content );
+ }
}