/** * 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 Starburst XXXtreme Position Review 100 percent free Trial Gamble 2026 Greatest Online Pokies in australia: Best A real income web sites Gamble Trial & Real money NetEnt Baseball Celebrity Slot 100 percent free: Play Slot Demo Instead Getting ⭐ Starburst Slot Opinion 2026 97% RTP Uk Gambling enterprises & Free Spins Bar Club Black Sheep Harbors Top ten Bar Bar Black colored Sheep Slot Websites Starburst Totally free Revolves No-deposit Precisely what does Fafa Suggest? Meaning, Spends and much more Avalon Actual-Date Analytics, RTP & SRP Celebrity Trek 100 percent free Slots Gamble On line Slot machine games Top ten Best Online casino And Pokies In australia For real Currency 2025 Best Australian Casino Websites Sabah FA The new Saints Suggestion 07 07.2026, Match Stats and Opportunity 76 100 percent free Spins to the Liberty Rockets July 2026 Lion Ports Gambling establishment No-deposit Better Casinos on the internet in australia 2026 Real money Casinos As to the reasons try the new Sphinx created? Dragon Shrine Position Opinion 2026 Free Gamble Demo No deposit versus Totally free Revolves: Which Local casino Bonus Is better? Higher Sphinx of Giza Wikipedia Ariana Slots Wager Online no Downloads South Park Harbors Huge Jokes using this type of Video game DraftKings Promo Password: 200 in the Bonus Bets for 5 July 2026 Incentive Local casino inside the Italia Lista aggiornata di July 2026 Simple tips to weight ‘Star Trek: Starfleet Academy’ 50 no-deposit 100 percent free revolves Discover release day, far more Dolphins Pearl Slot Remark, Incentives and Totally free Play 95 13percent RTP 100 percent free cool good fresh fruit gold coins 2025 Cofre de Previdência 2 Funcionários Públicos de Angola 2026’s Greatest Online slots games Gambling enterprises to play for real Money Wilderness Cost Slot: Game play, Extra, Rtp Slots Angels 100 percent free Enjoy 96 89% RTP Slot Trial Greatest 400% Deposit Extra Gambling enterprises Score eight hundred% Bonuses Harbors Angels Slot Enjoy Online for free otherwise A real income Greatest Online casino Christmas Bonuses in america 2026 Tombraider Ports Tomb Raider 1 deposit casinos online and you can Lara Croft Slot machine Casinos on the internet United states 2026 Tested and Ranked Dual Spin Video slot Enjoy Twin Twist Position Online free of charge Business Email 150 opportunity serenity address Rating a professional Email within a few minutes No deposit Incentive Requirements 2026 Actual-Currency Casinos on the internet Sphinx Casino slot games Wager Totally free Quickly On line 10bet Casino 150 chance christmas reactors South Africa Viewpoint Indian Dreaming Position: Information, 100 percent free Revolves and more Greatest 5 Lowest Deposit Gambling enterprises for 2026 Fa Fa Fa Slot Review, Incentives & 100 percent free Enjoy 97 1% RTP $2 hundred No deposit Incentive 2 hundred Totally free Revolves Extra 2026 Deceased or Live Position Opinion Bonus, RTP 96 82percent and you may 100 percent free Demonstration Turkish governor having a losing desire crossword secret clues & solutions Have fun with the Raging Rhino Slot machine game On the internet free of charge Play Yahtzee On the internet at no cost Thunderstruck dos Position Review and you can 100 percent free Demonstration 96 65% YAHTZEE Position Totally free Demonstration Play Enjoy Cricket Superstar from the Microgaming for free to your Gambling enterprise Pearls Have fun with the Fantastic Goddess Slot machine game free of charge No Obtain