From 82b3fac2799d0774780918a277ddbde15f068571 Mon Sep 17 00:00:00 2001 From: Jeremy Felt Date: Fri, 14 Dec 2018 01:49:46 +0000 Subject: [PATCH] Themes: Introduce responsive embeds support. Responsive embeds is a way for a theme to opt in to WordPress dynamically scaling the width/height of an embed. When a theme supports responsive embeds, a `wp-embed-responsive` class is added to the `` tag. This information is also presented through the REST API for clients to respect. Merges [43790] and [43791] from the 5.0 branch to trunk. Props desrosj, danielbachhuber, ocean90. Fixes #45125. git-svn-id: https://develop.svn.wordpress.org/trunk@44138 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-template.php | 4 +++ .../class-wp-rest-themes-controller.php | 14 +++++--- src/wp-includes/theme.php | 4 ++- .../tests/rest-api/rest-themes-controller.php | 32 ++++++++++++++++++- tests/phpunit/tests/theme/support.php | 12 +++++++ 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php index 8219b27f69..4c0fed2b90 100644 --- a/src/wp-includes/post-template.php +++ b/src/wp-includes/post-template.php @@ -760,6 +760,10 @@ function get_body_class( $class = '' ) { $classes[] = 'wp-custom-logo'; } + if ( current_theme_supports( 'responsive-embeds' ) ) { + $classes[] = 'wp-embed-responsive'; + } + $page = $wp_query->get( 'page' ); if ( ! $page || $page < 2 ) { 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 4aa7db4f6f..dbfaa839cb 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 @@ -111,8 +111,9 @@ class WP_REST_Themes_Controller extends WP_REST_Controller { $formats = array_merge( array( 'standard' ), $formats ); $data['theme_supports']['formats'] = $formats; - $data['theme_supports']['post-thumbnails'] = false; - $post_thumbnails = get_theme_support( 'post-thumbnails' ); + $data['theme_supports']['post-thumbnails'] = false; + $data['theme_supports']['responsive-embeds'] = (bool) get_theme_support( 'responsive-embeds' ); + $post_thumbnails = get_theme_support( 'post-thumbnails' ); if ( $post_thumbnails ) { // $post_thumbnails can contain a nested array of post types. @@ -156,16 +157,21 @@ class WP_REST_Themes_Controller extends WP_REST_Controller { 'type' => 'array', 'readonly' => true, 'properties' => array( - 'formats' => array( + 'formats' => array( 'description' => __( 'Post formats supported.' ), 'type' => 'array', 'readonly' => true, ), - 'post-thumbnails' => array( + 'post-thumbnails' => array( 'description' => __( 'Whether the theme supports post thumbnails.' ), 'type' => array( 'array', 'bool' ), 'readonly' => true, ), + 'responsive-embeds' => array( + 'description' => __( 'Whether the theme supports responsive embedded content.' ), + 'type' => 'bool', + 'readonly' => true, + ), ), ), ), diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php index 3d26800436..ee84c031f4 100644 --- a/src/wp-includes/theme.php +++ b/src/wp-includes/theme.php @@ -2318,12 +2318,14 @@ function get_theme_starter_content() { * @since 4.1.0 The `title-tag` feature was added * @since 4.5.0 The `customize-selective-refresh-widgets` feature was added * @since 4.7.0 The `starter-content` feature was added + * @since 5.0.0 The `responsive-embeds` feature was added. * * @global array $_wp_theme_features * * @param string $feature The feature being added. Likely core values include 'post-formats', * 'post-thumbnails', 'html5', 'custom-logo', 'custom-header-uploads', - * 'custom-header', 'custom-background', 'title-tag', 'starter-content', etc. + * 'custom-header', 'custom-background', 'title-tag', 'starter-content', + * 'responsive-embeds', etc. * @param mixed $args,... Optional extra arguments to pass along with certain features. * @return void|bool False on failure, void otherwise. */ diff --git a/tests/phpunit/tests/rest-api/rest-themes-controller.php b/tests/phpunit/tests/rest-api/rest-themes-controller.php index 590f91ec26..520dbed9d0 100644 --- a/tests/phpunit/tests/rest-api/rest-themes-controller.php +++ b/tests/phpunit/tests/rest-api/rest-themes-controller.php @@ -189,9 +189,10 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { $this->assertEquals( 1, count( $properties ) ); $this->assertArrayHasKey( 'theme_supports', $properties ); - $this->assertEquals( 2, count( $properties['theme_supports']['properties'] ) ); + $this->assertEquals( 3, count( $properties['theme_supports']['properties'] ) ); $this->assertArrayHasKey( 'formats', $properties['theme_supports']['properties'] ); $this->assertArrayHasKey( 'post-thumbnails', $properties['theme_supports']['properties'] ); + $this->assertArrayHasKey( 'responsive-embeds', $properties['theme_supports']['properties'] ); } /** @@ -222,6 +223,35 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase { $this->assertSame( array( 'standard', 'aside', 'video' ), $result[0]['theme_supports']['formats'] ); } + /** + * Test when a theme does not support responsive embeds. + * + * @ticket 45016 + */ + public function test_theme_supports_responsive_embeds_false() { + remove_theme_support( 'responsive-embeds' ); + $response = self::perform_active_theme_request(); + + $result = $response->get_data(); + $this->assertTrue( isset( $result[0]['theme_supports'] ) ); + $this->assertTrue( isset( $result[0]['theme_supports']['responsive-embeds'] ) ); + $this->assertFalse( $result[0]['theme_supports']['responsive-embeds'] ); + } + + /** + * Test when a theme supports responsive embeds. + * + * @ticket 45016 + */ + public function test_theme_supports_responsive_embeds_true() { + remove_theme_support( 'responsive-embeds' ); + add_theme_support( 'responsive-embeds' ); + $response = self::perform_active_theme_request(); + $result = $response->get_data(); + $this->assertTrue( isset( $result[0]['theme_supports'] ) ); + $this->assertTrue( $result[0]['theme_supports']['responsive-embeds'] ); + } + /** * Test when a theme does not support post thumbnails. * diff --git a/tests/phpunit/tests/theme/support.php b/tests/phpunit/tests/theme/support.php index 9b943f3261..f71760ed31 100644 --- a/tests/phpunit/tests/theme/support.php +++ b/tests/phpunit/tests/theme/support.php @@ -192,4 +192,16 @@ class Tests_Theme_Support extends WP_UnitTestCase { $this->assertEmpty( get_registered_nav_menus() ); $this->assertFalse( current_theme_supports( 'menus' ) ); } + + /** + * @ticket 45125 + */ + function test_responsive_embeds() { + add_theme_support( 'responsive-embeds' ); + $this->assertTrue( current_theme_supports( 'responsive-embeds' ) ); + remove_theme_support( 'responsive-embeds' ); + $this->assertFalse( current_theme_supports( 'responsive-embeds' ) ); + add_theme_support( 'responsive-embeds' ); + $this->assertTrue( current_theme_supports( 'responsive-embeds' ) ); + } }