/** * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. * * @package WordPress * @subpackage Embeds * @since 4.4.0 */ /** * oEmbed API endpoint controller. * * Registers the REST API route and delivers the response data. * The output format (XML or JSON) is handled by the REST API. * * @since 4.4.0 */ #[AllowDynamicProperties] final class WP_oEmbed_Controller { /** * Register the oEmbed REST API route. * * @since 4.4.0 */ public function register_routes() { /** * Filters the maxwidth oEmbed parameter. * * @since 4.4.0 * * @param int $maxwidth Maximum allowed width. Default 600. */ $maxwidth = apply_filters( 'oembed_default_width', 600 ); register_rest_route( 'oembed/1.0', '/embed', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => '__return_true', 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'default' => 'json', 'sanitize_callback' => 'wp_oembed_ensure_format', ), 'maxwidth' => array( 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), ), ), ) ); register_rest_route( 'oembed/1.0', '/proxy', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_proxy_item' ), 'permission_callback' => array( $this, 'get_proxy_item_permissions_check' ), 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'description' => __( 'The oEmbed format to use.' ), 'type' => 'string', 'default' => 'json', 'enum' => array( 'json', 'xml', ), ), 'maxwidth' => array( 'description' => __( 'The maximum width of the embed frame in pixels.' ), 'type' => 'integer', 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), 'maxheight' => array( 'description' => __( 'The maximum height of the embed frame in pixels.' ), 'type' => 'integer', 'sanitize_callback' => 'absint', ), 'discover' => array( 'description' => __( 'Whether to perform an oEmbed discovery request for unsanctioned providers.' ), 'type' => 'boolean', 'default' => true, ), ), ), ) ); } /** * Callback for the embed API endpoint. * * Returns the JSON object for the post. * * @since 4.4.0 * * @param WP_REST_Request $request Full data about the request. * @return array|WP_Error oEmbed response data or WP_Error on failure. */ public function get_item( $request ) { $post_id = url_to_postid( $request['url'] ); /** * Filters the determined post ID. * * @since 4.4.0 * * @param int $post_id The post ID. * @param string $url The requested URL. */ $post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] ); $data = get_oembed_response_data( $post_id, $request['maxwidth'] ); if ( ! $data ) { return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } return $data; } /** * Checks if current user can make a proxy oEmbed request. * * @since 4.8.0 * * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function get_proxy_item_permissions_check() { if ( ! current_user_can( 'edit_posts' ) ) { return new WP_Error( 'rest_forbidden', __( 'Sorry, you are not allowed to make proxied oEmbed requests.' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Callback for the proxy API endpoint. * * Returns the JSON object for the proxied item. * * @since 4.8.0 * * @see WP_oEmbed::get_html() * @global WP_Embed $wp_embed WordPress Embed object. * @global WP_Scripts $wp_scripts * * @param WP_REST_Request $request Full data about the request. * @return object|WP_Error oEmbed response data or WP_Error on failure. */ public function get_proxy_item( $request ) { global $wp_embed, $wp_scripts; $args = $request->get_params(); // Serve oEmbed data from cache if set. unset( $args['_wpnonce'] ); $cache_key = 'oembed_' . md5( serialize( $args ) ); $data = get_transient( $cache_key ); if ( ! empty( $data ) ) { return $data; } $url = $request['url']; unset( $args['url'] ); // Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names. if ( isset( $args['maxwidth'] ) ) { $args['width'] = $args['maxwidth']; } if ( isset( $args['maxheight'] ) ) { $args['height'] = $args['maxheight']; } // Short-circuit process for URLs belonging to the current site. $data = get_oembed_response_data_for_url( $url, $args ); if ( $data ) { return $data; } $data = _wp_oembed_get_object()->get_data( $url, $args ); if ( false === $data ) { // Try using a classic embed, instead. /* @var WP_Embed $wp_embed */ $html = $wp_embed->get_embed_handler_html( $args, $url ); if ( $html ) { // Check if any scripts were enqueued by the shortcode, and include them in the response. $enqueued_scripts = array(); foreach ( $wp_scripts->queue as $script ) { $enqueued_scripts[] = $wp_scripts->registered[ $script ]->src; } return (object) array( 'provider_name' => __( 'Embed Handler' ), 'html' => $html, 'scripts' => $enqueued_scripts, ); } return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } /** This filter is documented in wp-includes/class-wp-oembed.php */ $data->html = apply_filters( 'oembed_result', _wp_oembed_get_object()->data2html( (object) $data, $url ), $url, $args ); /** * Filters the oEmbed TTL value (time to live). * * Similar to the {@see 'oembed_ttl'} filter, but for the REST API * oEmbed proxy endpoint. * * @since 4.8.0 * * @param int $time Time to live (in seconds). * @param string $url The attempted embed URL. * @param array $args An array of embed request arguments. */ $ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args ); set_transient( $cache_key, $data, $ttl ); return $data; } } https://validator.w3.org/feed/docs/rss2.html Bears vs Vikings Predictions: Betting Tips for the Big Match RooBet Casino DK – Oplev Spændende Spil og Fantastiske Tilbud Bevegas La plataforma de apuestas deportivas y juegos de azar en línea Finest United kingdom Acca Insurance rates Offers and Campaigns 2025 Authoritative GRID: Whom starts where to your 2025 Miami Grand Prix Golf Conditions All of the Pupil Golfer Should know Nordic Bet Casino DK 2026 Din Ultimative Spiloplevelse 48544828 BWin Casino DK 2026 – Din Ultimative Guide til Online Spil Oplev Spændingen hos Lucky Vegas Slots Casino DK 37852484 Casino House DK 2026 – Den Ultimative Spiloplevelse 63989171 TipWin Casino DK – Download Oplev Spændingen hos Lucky Vegas Slots Casino dk 48180343 Genting Slots Casino DK 2026 En omfattende guide MrVegas Casino DK – Oplev spændingen ved online gambling Royal Bet Casino dk – Oplev det bedste inden for online gaming RooBet Casino DK – Det Bedste Online Kasino BloxGame Casino DK – Spil og Vind Sikkert! LuckyMe Slots Casino dk 2026 En ny æra inden for online spil 65788718 Genting Slots Casino DK 2026 En Oplevelse Uden Lige 71550328 BloxGame Casino DK 2026 – Den Fremadskuende Spiloplevelse BWin Casino DK 2026 – En Dybtgående Analyse af Spilmuligheder Pusulabet Mobil Giriş – Kolay ve Hızlı Bahis Deneyimi SpilDanskNu Casino DK – Din Guide til Online Casinoer i Danmark Casino and Friends DK 2026 Den Ultimative Spiloplevelse 42127500 Casino House DK 2026 – Din Ultimative Spiloplevelse Nordic Bet Casino DK 2026 Din Guide til Online Spil 53036843 Marathon Bet Casino DK 2026 Din Guide til Spil og Bonusser 51281265 Casino and Friends DK 2026 Den Ultimative Spiloplevelse 63599093 Tivoli Casino DK – En Uforglemmelig Spiloplevelse 56877265 LuckyMe Slots Casino dk 2026 En Oplevelse Uden Lige Expekt Casino DK 2026 – En Ny Æra inden for Online Spil 60706921 The Ultimate Guide to Canadian Online Casinos -205720870 Online kasína 2026 Trendy, inovácie a zábava Online Kasína 2026 Svet Zábavy a Výhier Online kasína na Slovensku – všetko, čo potrebujete vedieť Explore the Exciting World of Mostbet AZ -141922698 Online kasína 2026 Nové trendy a vývoj v hernom priemysle Online kasína bez vkladu Zábava bez rizika Online kasína na Slovensku – Všetko, čo potrebujete vedieť Online kasína bez bankového účtu – Hrajte bez obmedzení! Online kasína na Slovensku Ako sa orientovať a vybrať si to pravé Cabergolina per Atleti: Vantaggi e Considerazioni Online Kasína Bez Vkladu Získajte Bonusy Bez Rizika Casino qua 1 Einzahlung sämtliche Bonusangebote & Anbieter 2026 Online kasína na Slovensku Ako si vybrať to pravé pre seba Great Blue fr demo-biform Knicks vs Celtics: A Marquee NBA Matchup for Bettors Betonwin La Revolución en Apuestas Deportivas en Línea -596796730 Explore the Thrilling World of Spintime Your Ultimate Online Casino Destination The Powerful Combination of Clenbuterol and T3 for Maximum Results