/** * 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 Better Online slots within the 2026 Real cash Position Games Slovenské online kasína Vaša brána do sveta zábavy step three Aztec Temples Demonstration Play Position Video game a hundred% Totally free Greatest eWallet web based casinos around australia Company Insider Africa Play On the web & To the Mobile Okay Local casino No deposit Extra 2026 40 Totally free Revolves otherwise 10 100 percent free Tips Allege Athugasemd um spilafyrirtækið Playfrank 2022 Penziontatrasport – Ideálne miesto pre vašu dovolenku Simple tips to Win during the Slots: prepaid visa online casino Best Suggestions to Enhance your Opportunity Cool Fruits Demo by Playtech Free Position and Remark 100 100 percent free Revolves No deposit 2026 United kingdom Claim Now Netspilavíti Finest All of us Online casinos 2026 Tested, Ranked & Reviewed Online kasíno na Slovensku Všetko, čo potrebujete vedieť Web based casinos United states 2026 Checked out & Ranked $a hundred No deposit Incentive & 2 hundred Totally free Revolves Us Online casinos Gamble 19,350+ Totally free Position Online game Zero Down load Funky Fresh fruit Slot Enjoy Totally free Playtech Games On line Slovenské online kasína Všetko čo potrebujete vedieť 888 Casino Added bonus Now offers Acceptance Added bonus, 100 percent free Spins & Incentive Codes Top High Payment Casinos on the internet within the 2026 $fifty Or more No deposit Bonuses Finest Exclusives Monday Evening Funkin’ Tomb Raider Position by Microgaming Gamble Totally free or Real money Better Gambling establishment to possess Ports within the CT $step 1,000,one hundred thousand Commission! Slovenské Online Kasína Všetko, čo potrebujete vedieť -2059396781 Tomb Raider Discounts 20% Of Sitewide inside July 2026 Slovenské online kasína Vaša brána k zábave a výhram -2048780500 No-deposit Totally free Revolves to own Titanic from the Bally All Buffalo Position Previously! 17 position trendy fresh fruit fixed Celebrities Which Freed the brand new Breast Blackjack Enjoy Online Check in at the Slots Money Local casino for fifty No deposit Spins July 2026 Book Out of Ra Slots Top ten Publication Of Ra Position Websites In the 2026 Thunderstruck dos Slot Review Play the Totally free Demonstration Game & Casino Incentives Enjoy Guide of Ra 100 percent free Zero Download free Demonstration Casino slot games Remark 20+ cool fruits 80 totally free revolves Greatest Gambling establishment App the real offer Money To play 2026 Appreciate 100 percent free Egyptian Enjoyable! Thunderstruck II Position Opinion 96 65% RTP Microgaming 2026 Ideal Gambling Establishments That Accept Mastercard Deposits Multiple Diamond 100 percent free Harbors: Enjoy 100 percent free Casino slot games because of the IGT: Zero Obtain Video slot Remark Pokies Parlour Gambling enterprise Incentive Rules Bonus Requirements 2026 Verified Welcome Also offers Gold rush Online slots games Online game, Sign up Today & Assemble their 3 hundred% Acceptance Added bonus Stéroïdes et Performances au CrossFit Lifeless or Real time Position Enjoy 96 82% RTP, 8600 xBet Maximum Victory Cashwin CZ – Oficiální online kasino pro české hráče 1341112343 Gamble Pharaoh’s Silver step 3 Online Totally free Pharaoh’s Gold step three Position