/** * 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 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 The newest Grand Excursion On the web Position Remark Play Free slots from the Microgaming Greatest a real income online slots Enjoy slots the real deal money al com Immortal Romance Casino slot games Comment Real cash Online casinos without Deposit Added bonus United states by the Sweepstakes Dining table Trial Enjoy all of the NetEnt ports Free gamble, Position Video game, Roadmap & much more! Genuine Madrid CF Wikipedia Finest Online slots games inside 2026 Real cash Position Games LeoVegas Gambling enterprise Remark 2026 Greatest Discover to have Canadian Pages! Gamble Thunderstruck Position free spins the twisted circus no deposit Online the real deal Money or Free Finest Casinos, Bonuses, RTP The new Position Sites United states 2025: BitStarz A real income Internet casino Contributes The newest Online slots games Casinos on the internet United states 2026 Checked out and Ranked Finest No deposit Bonuses 2026 Best You Online casinos ‘No gator will run me personally off’: Florida man matches out of alligator having fishing rod Best A real income Casinos on the internet Trusted & Legitimate Sites Free Revolves Casino Bonuses To possess July 2026 No deposit Starburst Slot Demo Play for 100 percent free & Winnings Both Suggests The Excitement and Convenience of Casino Games Online Top Web based casinos for real Money Summer 2026 Starburst Position Gamble 96 08% RTP, 800 xBet Maximum Earn Τα Καλύτερα Online Casino στην Ελλάδα Enjoy Instantly, Bonuses and Cellular Enjoyable Gamble free Spiderman slot machine game online Free online games at the Poki Play miss kitty casino Now! MRI Examination Wishing Time Ramses Guide Position Medical Imaging within the United kingdom Super Medusa 55 No-deposit 100 percent free Processor Have fun with The Password Ramses Guide Reputation Opinion Play Ramses $1 put cool wolf Book Trial 2026 The newest a real money mobile casinos hundred Tv series Wikipedia Psoft pre Slovákov Inovácia v administratívnom manažmente Ramses 2: 100 percent free Use Ramses 2 Casino slot games Da Vinci Diamonds Slot machine game Enjoy it IGT Position 100percent free Wolverine Slot Playtech Wonder Slots Online game Gamble 21,750+ Online Gambling games No Download The Allure of Casino Love Casino 3 Exploring Romance and Fun Ports Team: An informed Online slots games Organization on a single Webpage The newest Mother Slot Review Have fun with a position Added bonus 2026