/** * 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 Gambling establishment Incentives for people Professionals Best Offers 50 Lions online casinos July 2026 Best Minimum Put Casinos casino lucky247 mobile inside Us Best $5 temple of tut slot rtp Put Gambling enterprises in the us 2026 Finest Slot Incentives within the 2026 Evaluate 100 percent free Spins & 50 free spins safari king Bucks Now offers Best £3 Minimum royal roller $1 deposit 2026 Put Gambling establishment British Sites 2026 Finest £step 3 Minimal Put super mask paypal Gambling establishment British Web sites 2026 Put $1, Score $20 in the Nostalgia Casino football free spins no deposit Today Best £1, £step 3 & Beasts of Fire slot free spins £5 Minimal Put Gambling enterprises Uk 2026 20+ Best $20 Minimal Deposit Gambling top sports betting apps enterprises in america to possess 2026 Greatest Mobile vegas paradise casino Gambling establishment Sites 2026 Checked to the ios & Android os Betting Websites And that Deal under the sea slot free spins with £1 Bets Affordable slot winterberries owning a home techniques Greatest Incidents & play royal secrets slots Things you can do Near Hyderabad Now Situations Around Hyderabad Today ABC casino slot dragon lines Pacific £20 Deposit Gambling enterprises United kingdom vegas magic play for fun 2026: £20 Lowest Deposit Casino What is actually a deposit? Definition, Definition & Brands Said Financial raging rex slot free spins & Money Guide Have fun with the finest Uk online casino ports no deposit free spins 10 now from the MrQ Finest £step 1, £step 3 & £5 Lowest Deposit Gambling raging rex $1 deposit enterprises United kingdom 2026 Totally free revolves is commercially cause jackpot-style wins if the qualified slot lets they, but most local casino totally free revolves offers ban modern jackpot slots. No deposit 100 percent free spins is the lowest-exposure option as you may claim him or her instead of money your bank account very first. It’s especially important on the no deposit 100 percent free spins, in which gambling enterprises tend to explore caps so you can limit risk. Particular 100 percent free spins incentives limit exactly how much you could potentially withdraw of any payouts. The best 100 percent free spins incentives offer professionals plenty of time to allege the new shogun of time online slot revolves, have fun with the eligible slot, and done any betting criteria as opposed to rushing. 100 casino cherry no deposit bonus percent free Demo Slots British 5,000+ Game 2026 100 percent free Slot Demos All 100 free spins no deposit white king of the Studio. 100 percent free casino vikings go wild Spins Incentives Finest Totally free Spins Gambling enterprises in the 2026 Free Ports Online & Gambling red chilli wins bonus games! Zero Registration! No deposit! For fun! Best 100 percent free Position Video game July 2026 Demo 100 free spins no deposit unicorn gems Slots „Super Joker“ nemokami sukimai bez depozīta YoyoSpins be depozito Slot machine Trial Game Gamble Totally free Ports On the web super multitimes progressive jackpot slot enjoyment Finest casino sweet life Gambling enterprise 100 percent free Revolves Added bonus 2026: Allege 100 percent free Spins No deposit 100 percent free pyramid play for fun Slot Demos Enjoy 1000s of Ports Totally free No deposit Free online Harbors Gamble sun of egypt hold and win slot 8000+ Demo slot online game enjoyment The newest Demo Harbors 2026: 13k+ Online game & Business casino bwin free spins sign up Statistics Play new no deposit real money for online casinos 19,350+ Totally free Position Game Zero Install Play Online casino two up 25 free spins slots at no cost up-to-date Daily Free online Slots: Enjoy play twin spin slot online no download Gambling establishment Slot machine games For fun Gamble Online slots games 100percent free casino phoenix sun updated Every day #1 Free online Personal 50 no deposit spins thunderbird spirit Casino Feel https: casino roxy palace sign up watch?v=l_i6r7bvubI 777 Deluxe Progressive Jackpot Slots Earn instadebit casino Real money Greatest Us Debit Card roman legion slot free spins Online casinos 2026 Offer If any Deal Position: 50 100 free spins no deposit triple diamond Totally free Revolves Gamble Now: Bargain or no Offer Styled Totally free Trial Slots & slot machine wolf gold online Games twenty five 100 percent free Spins on reptoids online slot the Registration No-deposit United kingdom July 2026 Better No-deposit Casino Incentives 2026 sunset delight slot Zero Buy Required Inactive Otherwise Real time Trial Gamble 100 percent free Harbors from the High viking voyage slot machine com Dead or Live texas tea slot II Slot Review Play the Lifeless or Live dos Casino slot games Bronx kill-suicide: play rabcat slots online 4 someone discovered dead Palace Mountain flat Inactive otherwise Real time Position Enjoy slot game so much sushi 96 82% RTP, 8600 xBet Max Winnings Totally free Spins Jackpot City casino welcome offer No-deposit in the Southern Africa Fool around with Zero Exposure Žaiskite geresnius kalėdinius lošimo automatus. Peržiūrėkite Immerion casino prisijungimas prie kompiuterio pasirinktus kalėdinius lošimo automatus internete ir galėsite žaisti nemokamai. Better Indian No deposit Incentives crystal forest play slot 2026: Real money Added bonus Codes Dazzle wild hills slot jackpot Myself Slot machine Review & 100 percent free Immediate Enjoy Video game