/** * 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 Obtain Logitech G Middle 2026 step 3.880543 Greatest No-deposit Gambling establishment Incentives Appeared to have June 2026 Kasínové bonusy za registráciu Využite výhody bez rizika! Greatest Online Pokies Australia 2025: Where to Play Finest Pokie Online game Bonanza On the web Slot Video game: Enjoy Slot machine Enjoyment Zero Install Relaxed Game Enjoy Free internet games to the Poki On-line casino Slots and Live Game SA’s pokie losses surpass $1bn to have first-time, $24m within the Attach Gambier by yourself Siberian Storm Online Position Enjoy Demonstration wild seas slot Complimentary Forklift Rental Philippines Greatest Skrill Gambling enterprises Accepting Money inside the 2026 Free internet games Gamble Now! Exactly how Air conditioning DCs no deposit bonus codes casino la fiesta Thunderstruck Turned Certainly Hollywoods Most expensive Music Very hot Deluxe Position Demonstration because of the Novomatic ᗎ Enjoy Totally free Vintage Slot Weve got an excellent gutful from politicians neglecting to act for the spoil regarding the pokies This is a critical second to have NSW Work Darcy Byrne Tranquility Position Video game Trial Enjoy & Free Revolves Poki Online game Application APK Download to have Android Most recent Type Gambling establishment Perks 100 percent free Spins Incentives Finest Totally free Spin Now offers 2026 Thunderpick Promo rewards no deposit Password 2026 one hundred% up to $2,100 Extra Australias Extremely Exclusive A real income Pokies Apps 50 Totally free Spins No deposit for the Signal-Right up Casinos 2026 Blackjack Laws and Manual a hundred Free Spins Canada Gambling establishment 2026: Cazimbo Launches 100 percent free Spins No-deposit that have Real money Across online casino skrill 10$ the country Finest Penny Slots playing Online Greatest Penny Position Casinos 2026 Play Safari slot because of the better gambling establishment online game creator! Wolverine Position Opinion Greatest On line Pokies Australia 2025: Top Au Pokie Web sites Finest Sports betting Apps in slot wild catch america July 2026 An informed free-to-enjoy sweepstakes slot machine game with high RTP to have December 2025 Enjoy Reel Spinner because of the Microgaming 100percent free to the Casino Pearls Learn about betting requirements in addition to their finest gambling establishment also offers 2026 Slovenské online kasína Objavte Svet Hracích Hier z Pohodlia Domova Reel Spinner Video slot Gamble Tomb Raider because of the Microgaming free of charge to the Casino Pearls Play Thunderstruck Position 96 10% RTP A real income Games Champion Gambling enterprise 2026 â¬0 Matches Incentive Bonus Requirements with no Deposit Casinos 2026 BetMGM Casino Remark to the Survivor Triple Issue Position Finest Australian On the web Pokies for real Cash in 2026 Slovenské online kasína Prehľad a tipy na hranie Thunderstruck II Position sakura dragon 80 free spins Comment 2026 Gamble On the internet 2,000+ Real cash Ports and step 3,000 Incentive 2026 Prirodnastrava Cesta k zdraviu a vitality Finest Fl Web based casinos 2026: Greatest Sweepstakes Websites to have Judge, Real-Honor Gamble 114 No deposit Added bonus Codes July 2026 Gamble Thunderstruck dos Position 96 65% RTP $1 red hot devil Real cash Game Finest Tx Online casino No-deposit Bonuses 2026 Gifts away from Christmas Position Play 96 72% RTP, 1400 xBet Maximum Winnings Settle down and enjoy Ramses Guide Position Playing within the United kingdom Best Casinos on the internet Us 2025 A real income, Incentives and The new SitesBest You Online casinos 2026 Top-by-Side Analysis Ramses Guide Reputation Gamble Trial for free Online