/** * 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 Free Revolves on the Slots Get Totally free Spins Bonuses in the Web based casinos Better Casinos on the internet the real deal Profit the us Finest Casino Web sites The new Online slots games Newest Real money Video game Playamo Gambling enterprise Incentives: Deposit and you may Weekday Incentives Figma Sites: Framework, Model & Upload Your future Webpages Thunderstruck free spin casino Trial Play Free Slots from the Higher com Free Revolves No-deposit » The fresh 100 percent free Revolves For the Registration 2026 Siberian Cat: Breed Character, Services & Worry Orient Xpress Local casino No-deposit Incentives 2026 Trolls Slot Review 95 step one% RTP NetEnt 2026 Best Slot machines playing in the Gambling enterprise: Top 10 Picks Internet casino No-Deposit Bonuses For brand new Players in the 2026 Better Mobile Casinos to possess 2026: Greatest Software & Web sites the real deal Currency Better Minimal Put Gambling enterprises in the seasons: $5 & $ten Reduced Deposits Massachusetts Scrape-Offs, Chance and you can Leftover Honors Comment, Incentives and Recommendations Tomb Raider Remark 2026 The fresh Video slot from the Seller Gamble Now ‘The Magic Provide from Christmas’ Hallmark Christmas Movies Remark: Weight It Or Disregard It? Sweepstakes & Social Gambling enterprise With 100 percent free Everyday Gold coins Interactive Understanding System Separate rating and Ripoff view Protection and you can Efficacy of Bacterial Ecosys .. NCT03832400 Load real time Tv, Video, Originals, Reports, and Safari Nipple orgasm: The goals, and the ways to have one Install it away from Uptodown at no cost Take advantage of away from Staking with Thunderstruck Position Gambling establishment Promo Password Just how Ac DCs Thunderstruck Turned into Indeed Hollywoods slot Jungle Difficulties Rtp Most jackpot wheel casino no deposit bonus costly Songs LearnGeeta An informed On the web Pokie Web sites 2024 Real cash Pokies NZ ten Totally free No-deposit No Put Card Ports https: m youtube.com check out?v=v2AC41dglnM Steeped against Poor Lady: Liven up & Makeover use Playgama because of the Novye Igry Thunderstruck Position Play the Thunderstruck Trial 2026 Equivalent Web site Look Play Thunderstruck Wild Super 100 percent free in the Demo and study Review Reddish Mansions Position Comment 95 03% RTP IGT 2026 Slovenské online kasína Všetko, čo potrebujete vedieť 1286891375 Thunderstruck II Pokie Play for Free & Read Remark $step 1 Local casino Put Bonus Greatest step one Dollars Incentives to own 2026 Thunderstruck Nuts Lightning Slot 2026 ️ Review RTP 96 step one% Microgaming Position No deposit Gambling establishment Bonuses Totally free Spins to own On line Participants 2026 50 100 percent free Revolves No-deposit South Africa ️ June 2026 Post Cycle Therapy (PCT) im Bodybuilding – Warum sie unverzichtbar ist https: shangri la slot free spins view?v=mBksMIl9Kf0 Greatest Slot Online game On line Top Casinos Fortunate Emperor Local casino Remark 2026 Bonus and Online game Publication We Speed The best Pokies Online To experience Now MDC provides discover your incentives that give you more two hundred Incentive Revolves to possess $10 LuckyDino Local casino Bonuses: Invited Added bonus and Totally free Spins A knowledgeable 50 Totally free Spins No-deposit Bonus within the 2026