WordPress.org

Make WordPress Core

Ticket #45447: 45447.3.diff

File 45447.3.diff, 6.9 KB (added by swissspidy, 14 months ago)
  • src/wp-includes/class-wp-embed.php

    diff --git src/wp-includes/class-wp-embed.php src/wp-includes/class-wp-embed.php
    index 10d36afcd0..e981fb2591 100644
    class WP_Embed { 
    125125                unset( $this->handlers[ $priority ][ $id ] );
    126126        }
    127127
     128        /**
     129         * Returns embed HTML for a given URL from embed handlers.
     130         *
     131         * Attempts to convert a URL into embed HTML by checking the URL
     132         * against the regex of the registered embed handlers.
     133         *
     134         * @since 5.5.0
     135         *
     136         * @param array $attr {
     137         *     Shortcode attributes. Optional.
     138         *
     139         *     @type int $width  Width of the embed in pixels.
     140         *     @type int $height Height of the embed in pixels.
     141         * }
     142         * @param string $url The URL attempting to be embedded.
     143         * @return string|false The embed HTML on success, false otherwise.
     144         */
     145        public function get_embed_handler_html( $attr, $url ) {
     146                $rawattr = $attr;
     147                $attr    = wp_parse_args( $attr, wp_embed_defaults( $url ) );
     148
     149                ksort( $this->handlers );
     150                foreach ( $this->handlers as $priority => $handlers ) {
     151                        foreach ( $handlers as $id => $handler ) {
     152                                if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) {
     153                                        $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr );
     154                                        if ( false !== $return ) {
     155                                                /**
     156                                                 * Filters the returned embed HTML.
     157                                                 *
     158                                                 * @since 2.9.0
     159                                                 *
     160                                                 * @see WP_Embed::shortcode()
     161                                                 *
     162                                                 * @param string|false $return The HTML result of the shortcode, or false on failure.
     163                                                 * @param string       $url    The embed URL.
     164                                                 * @param array        $attr   An array of shortcode attributes.
     165                                                 */
     166                                                return apply_filters( 'embed_handler_html', $return, $url, $attr );
     167                                        }
     168                                }
     169                        }
     170                }
     171
     172                return false;
     173        }
     174
    128175        /**
    129176         * The do_shortcode() callback function.
    130177         *
    class WP_Embed { 
    166213                $url = str_replace( '&', '&', $url );
    167214
    168215                // Look for known internal handlers.
    169                 ksort( $this->handlers );
    170                 foreach ( $this->handlers as $priority => $handlers ) {
    171                         foreach ( $handlers as $id => $handler ) {
    172                                 if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) {
    173                                         $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr );
    174                                         if ( false !== $return ) {
    175                                                 /**
    176                                                  * Filters the returned embed HTML.
    177                                                  *
    178                                                  * @since 2.9.0
    179                                                  *
    180                                                  * @see WP_Embed::shortcode()
    181                                                  *
    182                                                  * @param string|false $return The HTML result of the shortcode, or false on failure.
    183                                                  * @param string       $url    The embed URL.
    184                                                  * @param array        $attr   An array of shortcode attributes.
    185                                                  */
    186                                                 return apply_filters( 'embed_handler_html', $return, $url, $attr );
    187                                         }
    188                                 }
    189                         }
     216                $embed_handler_html = $this->get_embed_handler_html( $rawattr, $url );
     217                if ( false !== $embed_handler_html ) {
     218                        return $embed_handler_html;
    190219                }
    191220
    192221                $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null;
  • src/wp-includes/class-wp-oembed-controller.php

    diff --git src/wp-includes/class-wp-oembed-controller.php src/wp-includes/class-wp-oembed-controller.php
    index 290d60a66d..f4e9711f04 100644
    final class WP_oEmbed_Controller { 
    193193                $data = _wp_oembed_get_object()->get_data( $url, $args );
    194194
    195195                if ( false === $data ) {
     196                        // Try using a classic embed, instead.
     197                        global $wp_embed;
     198
     199                        /* @var WP_Embed $wp_embed */
     200                        $html = $wp_embed->get_embed_handler_html( $args, $url );
     201
     202                        if ( $html ) {
     203                                global $wp_scripts;
     204                                // Check if any scripts were enqueued by the shortcode, and include them in the response.
     205                                $enqueued_scripts = array();
     206
     207                                foreach ( $wp_scripts->queue as $script ) {
     208                                        $enqueued_scripts[] = $wp_scripts->registered[ $script ]->src;
     209                                }
     210
     211                                return (object) array(
     212                                        'provider_name' => __( 'Embed Handler' ),
     213                                        'html'          => $html,
     214                                        'scripts'       => $enqueued_scripts,
     215                                );
     216                        }
     217
    196218                        return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) );
    197219                }
    198220
  • tests/phpunit/tests/oembed/controller.php

    diff --git tests/phpunit/tests/oembed/controller.php tests/phpunit/tests/oembed/controller.php
    index 40a9dfccf7..72b3aed0bf 100644
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    9797                $this->request_count += 1;
    9898
    9999                // Mock request to YouTube Embed.
    100                 if ( ! empty( $query_params['url'] ) && false !== strpos( $query_params['url'], self::YOUTUBE_VIDEO_ID ) ) {
     100                if ( ! empty( $query_params['url'] ) && false !== strpos( $query_params['url'], '?v=' . self::YOUTUBE_VIDEO_ID ) ) {
    101101                        return array(
    102102                                'response' => array(
    103103                                        'code' => 200,
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    609609                $this->assertEquals( $data->height, $request['maxheight'] );
    610610        }
    611611
     612        /**
     613         * @ticket 45447
     614         *
     615         * @see wp_maybe_load_embeds()
     616         */
     617        public function test_proxy_with_classic_embed_provider() {
     618                wp_set_current_user( self::$editor );
     619                $request = new WP_REST_Request( 'GET', '/oembed/1.0/proxy' );
     620                $request->set_param( 'url', 'https://www.youtube.com/embed/' . self::YOUTUBE_VIDEO_ID );
     621                $request->set_param( 'maxwidth', 456 );
     622                $request->set_param( 'maxheight', 789 );
     623                $request->set_param( '_wpnonce', wp_create_nonce( 'wp_rest' ) );
     624                $response = rest_get_server()->dispatch( $request );
     625                $this->assertEquals( 200, $response->get_status() );
     626                $this->assertEquals( 2, $this->request_count );
     627
     628                // Test data object.
     629                $data = $response->get_data();
     630
     631                $this->assertNotEmpty( $data );
     632                $this->assertInternalType( 'object', $data );
     633                $this->assertInternalType( 'string', $data->html );
     634                $this->assertInternalType( 'array', $data->scripts );
     635        }
     636
    612637        public function test_proxy_with_invalid_oembed_provider_no_discovery() {
    613638                wp_set_current_user( self::$editor );
    614639
    615                 // If discover is false for an unkown provider, no discovery request should take place.
     640                // If discover is false for an unknown provider, no discovery request should take place.
    616641                $request = new WP_REST_Request( 'GET', '/oembed/1.0/proxy' );
    617642                $request->set_param( 'url', self::INVALID_OEMBED_URL );
    618                 $request->set_param( 'discover', 0 );
     643                $request->set_param( 'discover', false );
    619644                $response = rest_get_server()->dispatch( $request );
    620645                $this->assertEquals( 404, $response->get_status() );
    621646                $this->assertEquals( 0, $this->request_count );
    class Test_oEmbed_Controller extends WP_UnitTestCase { 
    624649        public function test_proxy_with_invalid_oembed_provider_with_default_discover_param() {
    625650                wp_set_current_user( self::$editor );
    626651
    627                 // For an unkown provider, a discovery request should happen.
     652                // For an unknown provider, a discovery request should happen.
    628653                $request = new WP_REST_Request( 'GET', '/oembed/1.0/proxy' );
    629654                $request->set_param( 'url', self::INVALID_OEMBED_URL );
    630655                $response = rest_get_server()->dispatch( $request );