/** * 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 Wise Gambling Designs and Optimum Methods to own Immortal Love Slot inside United kingdom 29 Totally free Revolves No deposit Incentives For people Participants Inside the 2025 Just how long Will it Take To have A check To pay off? Enjoy 21,750+ Online Online casino games Zero Download Lucky Las vegas Slot Pro Wins Massive $eleven one million Jackpot Bucks Splash 5 Reel Slots Huge Dollars $$ Jackpots Await! Finest Gambling enterprises Recognizing Zimpler Costs July 2026 Best No deposit Ports 2026 Finest No deposit Harbors Now offers Online casino Analysis Best Respected On-line casino Sites 2026 by the Getb8 Bets io No deposit Bonus & Totally free Spins Coupons 2026 AOD9604 2mg Genérico: Un Ciclo de Preparados de Insulina Better step 1 Put Gambling enterprises Uk Rating Totally free Spins for just one Pound Demonstration Period Given: Experience Gonzos Quest Megaways Slot Free in australia The major five hundred Tunes of your eighties, Rated Dragon Shrine Position Opinion 2026 100 percent free Enjoy Demonstration 2027 Ford slot viva las vegas F-150: Whats Upcoming, Questioned Specifications Syndicate Gambling establishment Incentive Codes and Offers 2026 Viking Fortune Casino No-deposit Extra 50 Totally free Revolves to the Dollars of Gods July 2026 Jungle Jim El Dorado Demonstration Slot Video game Worldwide 100 percent free Demonstration Buffalo Silver Collection On-line casino Courses, 100 percent free Harbors, Flash Bonuses + Huge Victory Movies Finest Casinos on the internet for real Currency 2026 Zeus Online Position Wager Totally free Free online Harbors Play step three,000+ Position Game Zero Signal-Up, Checked out & Compared Have fun with the Better On the web Position Game Fairly Cat Slot machine Play for 100 percent free Immediately On the internet TIPS Alcoholic slot sites with witches wealth beverages Experience Bartender & Host Training Video game away from Thrones Slots Casino Programs online Play Gamble 21,750+ Free online Casino games Zero Obtain Wolf Work with Pokie by IGT Gameplay & Volatility Review Finest Gambling enterprise Slots for real Currency 2026: Enjoy Slot Video game On line Studying Thunderstruck II: Information and strategies to own Big Wins Ac dc Thunderstruck shaolin spin 3 free spins no deposit Words & Meaning Play 21,750+ Free online Online casino games No Down load Seems that We have a webpage Maybe not Discovered! The fresh Slot Landed for the 404! Greatest Online casino Added bonus Also offers 2026 Claim The Totally free Bonuses Top Immediate Detachment Gambling enterprises in the Canada 2026 Wild Orient Slot machine game Is actually their Fortune about Gambling establishment Game Greatest You Skrill Gambling enterprises 2026 10+ Web sites Taking Skrill ️ 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