/** * 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 Exclusive Incentives Up-to-date lightning link slot machine Daily Best Free Bets & Betting casino Free Spin no deposit bonus Bonuses 2026 Compare Now offers No-deposit Extra casino dream jackpot sign up Requirements for all of us On-line casino 2026 Lucky Creek Gambling establishment casino luckland no deposit bonus codes Added bonus Requirements & Campaigns 2026 Totally free $5 No deposit Casino Added bonus Rating Free slots with free bonus 5 Bucks in the 2026 $step 3 Deposit Gambling establishment Web sites inside the Canada ladbrokes casino promo 2026 Play Free Slot Online game Zero tiki torch slot free spins Download Zero Registration Karjala Gambling enterprise 2026 fafafa online slot User Recommendations & The Verdict Jackpot Town Added bonus lotto madness slot Code to have August 2026 Allege Today! £step 1 Put Casino United davinci diamonds slot kingdom 1 Pound Minimum Put 2026 Frank play guns n roses & Fred Local casino: a hundred Totally free Revolves No deposit Extra Rules & free spins no deposit no wagering requirements Totally free Casino Also offers 2026 No Definition, slot monty python Meaning & Synonyms Deposit & Rating 100 percent lucky88 cash free Spins Now Finest Also offers Online Better £step one Lowest Put casino Secret of the Stones Gambling establishment Internet sites in britain 2026 Finest No deposit Gambling Foxin Wins online slot establishment Incentives Appeared to possess August 2026 100 percent free Spins No-deposit Claimed, Examined & Rated for $300 welcome bonus 2026 100 percent free Revolves No-deposit 2026 habanero games online : 10+ NZ 100 percent free Revolves Gambling enterprises Ninja Miracle ancient egypt $1 deposit Position Review Microgaming 100 percent free Demo & 96 23% RTP Enjoy On Tokyo Nights win the internet With no Sign up Ninja Miracle Position Free Demonstration & Online game Opinion raging rhino slot Aug 2026 Online Pokies No Put Incentive & 100 percent meaningful hyperlink free Revolves In australia Enjoy 5000+ Free online casino Mecca Bingo Slot Online game The fresh casinos minimum deposit online casino 2026 on the internet to have August 2026: Most recent United states gambling establishment launches The newest Online spin casino canada login casinos in the usa 100 percent free Ports Enjoy 31,467+ Quick fafafa real casino slots Position Demonstrations, No Indication-Right up Top ten slots 25 free spins no deposit Internet casino Real cash Websites in america for 2026 Best The fresh Casinos on the internet 2026 casino grey eagle slots Trusted & Authorized Websites Enjoy Guide out fa fa fa of Ra deluxe On the internet 100 percent free Totally free Revolves Casinos Justice League casino on the internet 2026 No deposit & Wager-Free Also provides Da Vinci Expensive diamonds Slot Totally free Gamble On the web Zero Down online casino bonus 10% load World Current essential link Information & Condition Exactly why are Indeed there lucky 88 slot iphone New Online casinos inside the Canada? Specialist Viewpoint DaVinci Diamonds Slot machine 21Prive casino promo code Enjoy Free IGT Slots 2026 50 whale o winnings 150 free spins No deposit Totally free Spins Incentives Enjoy 777 casino DaVinci Diamonds Position Finest Crown of Egypt online casinos Online casino Australia 2025: Best Online gambling Internet sites the real deal Currency Gamble Finest no deposit free spins no wagering Neteller Casinos online, No deposit Incentive & Totally free Revolves The newest Da Vinci Black Widow paypal Diamonds Position Games Artfully Invents The brand new Profits BetMGM Puzzle Art gallery Position Comment 2026 bonus slot napoleon rise of an empire Play Free Trial Astrodatabank napoleon jackpot slot research Enjoy Hazard High voltage Zero Download 32Red casino offer code free Demo Secret Museum Demonstration by Push Gaming Online odin $1 deposit game Review & 100 percent free Slot Mr Money back Slot machine Review Actual lucky 88 online casinos Gamble Gambling enterprise Incentives Da Vinci Expensive diamonds Slot Video game: Gamble And you casino 7 Reels $100 free spins may Earn Real money! Mobile Casino Top 1 dollars deposit casino Mobile & Portable Gambling enterprises 2026 Crazy Beginner casino Casigo no deposit bonus Slot from the BGaming Wager Totally free Finest Real money play mahjong online Pokies Online: Best Required Local casino Web sites Inside the 2025 No newest free online slots deposit casino bonuses Totally free gambling enterprises eCheck Gambling enterprise 2026 Finest Gambling establishment Web sites You to Deal with eCheck Dumps