diff --git a/src/wp-includes/class-wp-block-patterns-registry.php b/src/wp-includes/class-wp-block-patterns-registry.php index e516277e42dde..08523cddcd397 100644 --- a/src/wp-includes/class-wp-block-patterns-registry.php +++ b/src/wp-includes/class-wp-block-patterns-registry.php @@ -112,7 +112,10 @@ public function register( $pattern_name, $pattern_properties ) { $pattern = array_merge( $pattern_properties, - array( 'name' => $pattern_name ) + array( + 'name' => $pattern_name, + 'parsed' => false, + ) ); $this->registered_patterns[ $pattern_name ] = $pattern; @@ -190,8 +193,12 @@ public function get_registered( $pattern_name ) { return null; } - $pattern = $this->registered_patterns[ $pattern_name ]; - $pattern['content'] = $this->prepare_content( $pattern, get_hooked_blocks() ); + $pattern = $this->registered_patterns[ $pattern_name ]; + if ( ! $pattern['parsed'] ) { + $pattern['content'] = $this->prepare_content( $pattern, get_hooked_blocks() ); + $pattern['parsed'] = true; + $this->registered_patterns[ $pattern_name ] = $pattern; + } return $pattern; } @@ -206,16 +213,27 @@ public function get_registered( $pattern_name ) { * and per style. */ public function get_all_registered( $outside_init_only = false ) { - $patterns = array_values( - $outside_init_only + $patterns = $outside_init_only ? $this->registered_patterns_outside_init - : $this->registered_patterns - ); + : $this->registered_patterns; + $hooked_blocks = get_hooked_blocks(); - foreach ( $patterns as $index => $pattern ) { - $patterns[ $index ]['content'] = $this->prepare_content( $pattern, $hooked_blocks ); + + foreach ( $patterns as $pattern_name => $pattern ) { + if ( ! $pattern['parsed'] ) { + $pattern['content'] = $this->prepare_content( $pattern, $hooked_blocks ); + $pattern['parsed'] = true; + $patterns[ $pattern_name ] = $pattern; + } } - return $patterns; + + if ( $outside_init_only ) { + $this->registered_patterns_outside_init = $patterns; + } else { + $this->registered_patterns = $patterns; + } + + return array_values( $patterns ); } /** diff --git a/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php index 61298d1b164af..d10f3b64ec811 100644 --- a/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php +++ b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php @@ -244,9 +244,12 @@ public function test_get_all_registered() { ); $this->registry->register( 'test/three', $pattern_three ); - $pattern_one['name'] = 'test/one'; - $pattern_two['name'] = 'test/two'; - $pattern_three['name'] = 'test/three'; + $pattern_one['name'] = 'test/one'; + $pattern_one['parsed'] = true; + $pattern_two['name'] = 'test/two'; + $pattern_two['parsed'] = true; + $pattern_three['name'] = 'test/three'; + $pattern_three['parsed'] = true; $expected = array( $pattern_one, @@ -276,6 +279,7 @@ public function test_get_registered_rejects_unknown_pattern_name() { $pattern_two = array( 'title' => 'Pattern Two', 'content' => '

Two

', + 'parsed' => true, ); $this->registry->register( 'test/two', $pattern_two ); @@ -310,7 +314,8 @@ public function test_get_registered() { ); $this->registry->register( 'test/three', $pattern_three ); - $pattern_two['name'] = 'test/two'; + $pattern_two['name'] = 'test/two'; + $pattern_two['parsed'] = true; $pattern = $this->registry->get_registered( 'test/two' ); $this->assertSame( $pattern_two, $pattern ); @@ -376,9 +381,12 @@ public function test_get_all_registered_includes_hooked_blocks() { $this->registry->register( 'test/three', $pattern_three ); $pattern_one['name'] = 'test/one'; + $pattern_one['parsed'] = true; $pattern_two['name'] = 'test/two'; $pattern_two['content'] .= ''; + $pattern_two['parsed'] = true; $pattern_three['name'] = 'test/three'; + $pattern_three['parsed'] = true; $pattern_three['content'] .= ''; $expected = array( @@ -445,6 +453,7 @@ public function test_get_registered_includes_hooked_blocks() { $this->registry->register( 'test/two', $pattern_two ); $pattern_one['name'] = 'test/one'; + $pattern_one['parsed'] = true; $pattern_one['content'] = '' . $pattern_one['content']; $pattern = $this->registry->get_registered( 'test/one' );