/** * 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 Chief Chefs Local casino Comment 2026: Is it Safe & Legitimate? Thunderstruck streaming: where you should check out online? Free online games Play Today for the Y8 com Top 10 On-line casino A real income Web sites in america to own 2026 Fast Earnings, Safer Repayments & Crypto Totally free Enjoy Form fifty Free Revolves No deposit No Wager Uk 2026 Remain The $1 under the bed casino bonus Deposit You Online casinos within the July 2026 Cool Cat Gambling establishment No deposit Incentive Rules 2026 #step 1 Queen of your Nile Ports A free of charge and you will Real money Game Finest Blackjack Means Graph and you will Ideas to Winnings within the 2026 Kitty Glitter Slots Gamble This video game at no cost, Earn Real money! Big Money Gambling wild falls online slot enterprise now offers: $19 no deposit bonus Pharaoh’s Chance Trial by IGT Comment and 100 percent free Slot Louisiana’s Best bet! Cat Sparkle Demonstration Enjoy Position Game a hundred% 100 percent free Extra Betting Standards 2026 How to Estimate ultra hot big win Rollover Bonuses ️ Pro Methods for The fresh Players️ ⭐Gamble Karaoke Group Slot On line the real deal Currency otherwise Free Finest Casinos, Bonuses, RTP 10 Quickest Payment Web based casinos & Betting Web sites out of 2026 Finest $10 Deposit Gambling enterprises BritainBet online United states July 2026 Karaoke Group Cellular Position Review Microgaming Web based casinos Real money 10 Better Us Gambling establishment Websites to possess 2026 Jurassic Jackpot by Microgaming 100 percent free Slot Gamble Demonstration Kompletný Zoznam Online Kasín Hrajte bezpečne a zábavne 100 percent free 3d Slots On the web No Download otherwise Membership Casinofairspin CZ 2026 Novinky, Triky a Přehled Nabídky Super Connect Local casino Harbors Software on google Play Current Betsafe Gambling establishment No-deposit added bonus Rules on the June 2026 Jack and the Beanstalk Slot Wager Totally free otherwise having Bonus Advancement $step one Deposit Casinos NZ: Have fun with $step one during the The brand new Zealand Gambling 200 deposit bonus slots enterprises Now! Forest Jim El Dorado Slot Enjoy Totally free Position Video game Trial three-dimensional Slot machine games: Wager 100 percent free Without Download Iron man 2 : Blast Using your Foes That have Iron man 2 Slot machine Gamdomcz CZ 2026 Budoucnost Online Hazardu v České Republice 1340048515 Casinos on the internet Real money 10 Greatest Usa Gambling establishment Web sites press the link right now to have 2026 Iron Common Video game Gamble On the web 100percent free! Bethard Gambling establishment Review 2026 Get an excellent a hundred% Acceptance Added bonus! Admiralcasinohrat CZ 2026 – Registrace 1321304609 Indian Thinking Pokie Servers: On line Slot machine Totally free Zero Obtain Better Real cash Web based casino osiris 50 free spins casinos UAE 100 percent free Play Best three-dimensional Ports inside the 2026 Enjoy Totally free three dimensional Harbors to your Casinos com Immortal Relationship Slot Comment Twist To the Vampires Allege twenty five 100 percent free Spins No-deposit Welcome Incentive at the BetChain Gambling enterprise Better Bitcoin & Crypto Playing 280% Suits Extra as much as $4500, casino sweet alchemy twenty five Free Spins Immortal Romance Slot Review Spin For the Vampires Best Payment Casinos Betchain 100 percent free Spins & Promos Get the most recent to have 2026