diff --git a/package-lock.json b/package-lock.json index 25c2a9e25e106..39314e25cc24e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7548,7 +7548,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { diff --git a/tests/phpunit/data/themedir1/block-theme-child/block-templates/page-1.html b/tests/phpunit/data/themedir1/block-theme-child/block-templates/page-1.html new file mode 100644 index 0000000000000..c3e788b393ee8 --- /dev/null +++ b/tests/phpunit/data/themedir1/block-theme-child/block-templates/page-1.html @@ -0,0 +1,3 @@ + +

Page (ID 1) Template

+ \ No newline at end of file diff --git a/tests/phpunit/data/themedir1/block-theme-child/page-home.php b/tests/phpunit/data/themedir1/block-theme-child/page-home.php new file mode 100644 index 0000000000000..86efe80db6afb --- /dev/null +++ b/tests/phpunit/data/themedir1/block-theme-child/page-home.php @@ -0,0 +1,3 @@ + +

Index Template

+ \ No newline at end of file diff --git a/tests/phpunit/data/themedir1/block-theme/block-templates/page-home.html b/tests/phpunit/data/themedir1/block-theme/block-templates/page-home.html new file mode 100644 index 0000000000000..6be0c70fb29c8 --- /dev/null +++ b/tests/phpunit/data/themedir1/block-theme/block-templates/page-home.html @@ -0,0 +1,3 @@ + +

Page (Home) Template

+ \ No newline at end of file diff --git a/tests/phpunit/data/themedir1/block-theme/block-templates/page.html b/tests/phpunit/data/themedir1/block-theme/block-templates/page.html new file mode 100644 index 0000000000000..61c493e1bd8e8 --- /dev/null +++ b/tests/phpunit/data/themedir1/block-theme/block-templates/page.html @@ -0,0 +1,3 @@ + +

Page Template

+ \ No newline at end of file diff --git a/tests/phpunit/data/themedir1/block-theme/page-1.php b/tests/phpunit/data/themedir1/block-theme/page-1.php new file mode 100644 index 0000000000000..eafbb1b6e854b --- /dev/null +++ b/tests/phpunit/data/themedir1/block-theme/page-1.php @@ -0,0 +1,3 @@ + 'wp_template', - 'post_name' => 'wp-custom-template-my-block-template', - 'post_title' => 'My Custom Block Template', - 'post_content' => 'Content', - 'post_excerpt' => 'Description of my block template', - 'tax_input' => array( - 'wp_theme' => array( - get_stylesheet(), - ), - ), + public function set_up() { + parent::set_up(); + switch_theme( 'block-theme' ); + } + + public function tear_down() { + global $_wp_current_template_content; + unset( $_wp_current_template_content ); + + parent::tear_down(); + } + + function test_page_home_block_template_takes_precedence_over_less_specific_block_templates() { + global $_wp_current_template_content; + $type = 'page'; + $templates = array( + 'page-home.php', + 'page-1.php', + 'page.php', ); - self::$post = self::factory()->post->create_and_get( $args ); - wp_set_post_terms( self::$post->ID, get_stylesheet(), 'wp_theme' ); + $resolved_template_path = locate_block_template( get_stylesheet_directory() . '/page-home.php', $type, $templates ); + $this->assertEquals( self::$template_canvas_path, $resolved_template_path ); + $this->assertStringEqualsFile( get_stylesheet_directory() . '/block-templates/page-home.html', $_wp_current_template_content ); } - public static function wpTearDownAfterClass() { - wp_delete_post( self::$post->ID ); + function test_page_block_template_takes_precedence() { + global $_wp_current_template_content; + $type = 'page'; + $templates = array( + 'page-slug-doesnt-exist.php', + 'page-1.php', + 'page.php', + ); + $resolved_template_path = locate_block_template( get_stylesheet_directory() . '/page.php', $type, $templates ); + $this->assertEquals( self::$template_canvas_path, $resolved_template_path ); + $this->assertStringEqualsFile( get_stylesheet_directory() . '/block-templates/page.html', $_wp_current_template_content ); } - public function tear_down() { + function test_block_template_takes_precedence_over_equally_specific_php_template() { global $_wp_current_template_content; - unset( $_wp_current_template_content ); + $type = 'index'; + $templates = array( + 'index.php', + ); + $resolved_template_path = locate_block_template( get_stylesheet_directory() . '/index.php', $type, $templates ); + $this->assertEquals( self::$template_canvas_path, $resolved_template_path ); + $this->assertStringEqualsFile( get_stylesheet_directory() . '/block-templates/index.html', $_wp_current_template_content ); + } + + /** + * In a hybrid theme, a PHP template of higher specificity will take precedence over a block template + * with lower specificity. + * + * Covers https://github.com/WordPress/gutenberg/pull/29026. + */ + function test_more_specific_php_template_takes_precedence_over_less_specific_block_template() { + $page_id_template = 'page-1.php'; + $page_id_template_path = get_stylesheet_directory() . '/' . $page_id_template; + $type = 'page'; + $templates = array( + 'page-slug-doesnt-exist.php', + 'page-1.php', + 'page.php', + ); + $resolved_template_path = locate_block_template( $page_id_template_path, $type, $templates ); + $this->assertEquals( $page_id_template_path, $resolved_template_path ); + } + + /** + * If a theme is a child of a block-based parent theme but has php templates for some of its pages, + * a php template of the child will take precedence over the parent's block template if they have + * otherwise equal specificity. + * + * Covers https://github.com/WordPress/gutenberg/pull/31123. + * + */ + function test_child_theme_php_template_takes_precedence_over_equally_specific_parent_theme_block_template() { + /** + * @todo This test is currently marked as skipped, since it wouldn't pass. Turns out that in Gutenberg, + * it only passed due to a erroneous test setup. + * For details, see https://github.com/WordPress/wordpress-develop/pull/1920#issuecomment-975929818. + */ + $this->markTestSkipped( 'The block template resolution algorithm needs fixing in order for this test to pass.' ); + + switch_theme( 'block-theme-child' ); + + $page_slug_template = 'page-home.php'; + $page_slug_template_path = get_stylesheet_directory() . '/' . $page_slug_template; + $type = 'page'; + $templates = array( + 'page-home.php', + 'page-1.php', + 'page.php', + ); + $resolved_template_path = locate_block_template( $page_slug_template_path, $type, $templates ); + $this->assertEquals( $page_slug_template_path, $resolved_template_path ); + } + + function test_child_theme_block_template_takes_precedence_over_equally_specific_parent_theme_php_template() { + global $_wp_current_template_content; + + switch_theme( 'block-theme-child' ); + + $page_template = 'page-1.php'; + $parent_theme_page_template_path = get_template_directory() . '/' . $page_template; + $type = 'page'; + $templates = array( + 'page-slug-doesnt-exist.php', + 'page-1.php', + 'page.php', + ); + $resolved_template_path = locate_block_template( $parent_theme_page_template_path, $type, $templates ); + $this->assertEquals( self::$template_canvas_path, $resolved_template_path ); + $this->assertStringEqualsFile( get_stylesheet_directory() . '/block-templates/page-1.html', $_wp_current_template_content ); } /** @@ -63,6 +154,22 @@ public function test_custom_page_php_template_takes_precedence_over_all_other_te public function test_custom_page_block_template_takes_precedence_over_all_other_templates() { global $_wp_current_template_content; + // Set up custom template post. + $args = array( + 'post_type' => 'wp_template', + 'post_name' => 'wp-custom-template-my-block-template', + 'post_title' => 'My Custom Block Template', + 'post_content' => 'Content', + 'post_excerpt' => 'Description of my block template', + 'tax_input' => array( + 'wp_theme' => array( + get_stylesheet(), + ), + ), + ); + $post = self::factory()->post->create_and_get( $args ); + wp_set_post_terms( $post->ID, get_stylesheet(), 'wp_theme' ); + $custom_page_block_template = 'wp-custom-template-my-block-template'; $page_template_path = get_stylesheet_directory() . '/' . 'page.php'; $type = 'page'; @@ -74,7 +181,9 @@ public function test_custom_page_block_template_takes_precedence_over_all_other_ ); $resolved_template_path = locate_block_template( $page_template_path, $type, $templates ); $this->assertSame( self::$template_canvas_path, $resolved_template_path ); - $this->assertSame( self::$post->post_content, $_wp_current_template_content ); + $this->assertSame( $post->post_content, $_wp_current_template_content ); + + wp_delete_post( $post->ID ); } /**