diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php index 71dbcb6193..075be9efe4 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php @@ -326,6 +326,10 @@ class WP_REST_Themes_Controller extends WP_REST_Controller { } } + if ( rest_is_field_included( 'is_block_theme', $fields ) ) { + $data['is_block_theme'] = $theme->is_block_theme(); + } + $data = $this->add_additional_fields_to_object( $data, $request ); // Wrap the data in a response object. @@ -494,6 +498,11 @@ class WP_REST_Themes_Controller extends WP_REST_Controller { ), ), ), + 'is_block_theme' => array( + 'description' => __( 'Whether the theme is a block-based theme.' ), + 'type' => 'boolean', + 'readonly' => true, + ), 'name' => array( 'description' => __( 'The name of the theme.' ), 'type' => 'object', diff --git a/tests/phpunit/tests/rest-api/rest-themes-controller.php b/tests/phpunit/tests/rest-api/rest-themes-controller.php index 01e1a2b6ad..24b564debb 100644 --- a/tests/phpunit/tests/rest-api/rest-themes-controller.php +++ b/tests/phpunit/tests/rest-api/rest-themes-controller.php @@ -172,6 +172,7 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { 'author', 'author_uri', 'description', + 'is_block_theme', 'name', 'requires_php', 'requires_wp', @@ -185,6 +186,8 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { 'theme_uri', 'version', ); + $this->assertIsArray( $data ); + $this->assertNotEmpty( $data ); $this->assertSameSets( $fields, array_keys( $data[0] ) ); } @@ -208,6 +211,7 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { 'author', 'author_uri', 'description', + 'is_block_theme', 'name', 'requires_php', 'requires_wp', @@ -220,6 +224,8 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { 'theme_uri', 'version', ); + $this->assertIsArray( $data ); + $this->assertNotEmpty( $data ); $this->assertSameSets( $fields, array_keys( $data[0] ) ); $this->assertContains( 'twentytwenty', wp_list_pluck( $data, 'stylesheet' ) ); @@ -343,7 +349,7 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { $response = self::perform_active_theme_request( 'OPTIONS' ); $data = $response->get_data(); $properties = $data['schema']['properties']; - $this->assertCount( 15, $properties ); + $this->assertCount( 16, $properties ); $this->assertArrayHasKey( 'author', $properties ); $this->assertArrayHasKey( 'raw', $properties['author']['properties'] ); @@ -357,6 +363,8 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { $this->assertArrayHasKey( 'raw', $properties['description']['properties'] ); $this->assertArrayHasKey( 'rendered', $properties['description']['properties'] ); + $this->assertArrayHasKey( 'is_block_theme', $properties ); + $this->assertArrayHasKey( 'name', $properties ); $this->assertArrayHasKey( 'raw', $properties['name']['properties'] ); $this->assertArrayHasKey( 'rendered', $properties['name']['properties'] ); @@ -471,6 +479,27 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { $this->assertSame( '5.3', $result[0]['requires_wp'] ); } + /** + * @ticket 58123 + * @covers WP_REST_Themes_Controller::prepare_item_for_response + */ + public function test_theme_is_block_theme() { + // Test classic theme, activated in test setup. + $response = self::perform_active_theme_request(); + $result = $response->get_data(); + + $this->assertArrayHasKey( 'is_block_theme', $result[0] ); + $this->assertFalse( $result[0]['is_block_theme'] ); + + // Test block theme. + switch_theme( 'block-theme' ); + $response = self::perform_active_theme_request(); + $result = $response->get_data(); + + $this->assertArrayHasKey( 'is_block_theme', $result[0] ); + $this->assertTrue( $result[0]['is_block_theme'] ); + } + /** * @ticket 49906 */ @@ -1234,6 +1263,7 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { 'author', 'author_uri', 'description', + 'is_block_theme', 'name', 'requires_php', 'requires_wp',