/** * 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 Gamble 100 percent free Demo & Real money RTP 96 21% Free Blackjack On line that have Family members No Install otherwise Reg Spend because of the mobile phone casinos: Top pay from the cellular gambling enterprises 2026 Gamble Black-jack On line 100 percent free Zero Download, Zero Real cash Big bucks Bigfoot Position Gamble it Slot machine game Online 200% Put Incentive Gambling establishment: Welcome Now offers inside the slot dragon wins United kingdom August 2026 Online Harbors Gamble 3,000+ Slot Game Zero Signal-Upwards, Checked & Opposed Free Spins No deposit South Africa Finest No deposit Extra Gambling enterprises 2026 Simple tips to Deposit a seek advice from Cellular View Put Enjoy La Cucaracha On the internet Slot for free otherwise with Incentive Invited bonus deposit slot 100% Bonus Spend By the Cellular telephone & Cellular Casinos Comprehend Recommendations & Greatest Incentives Greatest Pay by the Cellular telephone Gambling enterprises Southern area Africa 2026 Enjoy Now Online casinos Us 2026 Tested & Ranked Greatest Pay By the Mobile phone Casinos 2026 Put from the Cellular Statement Worms Reloaded Real-Go arctic madness online slot out Statistics, RTP & SRP Fu Dao Ce Slots, Real money Slot machine game & Free Play Demo Better Shell out by the Mobile Casinos United kingdom Pay because of the Cell phone Expenses Casino Best Real cash Ports for all of us Players in the 2026 The simplest way to Put and you can Play Real cash Cellular Slots Pay From the Cellular phone Statement Daily Racing Function The lord of the ocean casino new Wizard Best Online casino Bonuses and you will Discounts for top level Casino Programs Greatest Shell out From the Cellular phone & Mobile Casinos 2023 Publication Best Shell out because of the Boku Gambling enterprises Find a very good Shell out by Boku Casinos Bingo Commission Steps Set of Fee Versions You can use ? Finest Web based casinos in america the real deal Money 2026 How to make contactless money from the smartphone Superior queen of the nile slot no deposit bonus Bonds opportunities calculator NS&We Possibility Better 50 Free Spins No-deposit Bonuses inside the The fresh Zealand 2026 Top Online casino Real money Sites in the usa to have 2026 Panda People Position Game play On the internet for real Currency Enjoy Owl Sight Slot: Comment, Gambling enterprises, Added bonus & Movies Pay by Cell phone Gambling enterprises cuatro Internet sites Recognizing Places inside the 2026 Online casinos 2026 Better A real income Online casinos Play 100 percent free Slot Video game Zero Down load, Simply Fun! Crazy titanic $1 deposit Swarm Comment on line Wikipedia 100 percent free Spins Casinos on the internet 2026 No deposit & Wager-Free Now offers Enjoy 24,000+ Free online Online casino games Zero Obtain Advertisements and you may Incentives at the Crazy Casino Personal No-deposit online pokies NZ free spins no deposit Extra Rules 2026 Instantaneous Enjoy Monthly $9000 Crypto Invited Bonus Better Online slots 2026: Enjoy Ports the real deal Money Free online Pokies NZ 2026 Gamble 23,000+ Harbors at no cost An educated Roulette Web sites within the 2026 Gamble Internet casino Roulette Lowest put gambling enterprise book: Lower deposit web based casinos inside August 2026 The new Wild Lifetime Slot Comment new casino 2026 Enjoy Free Demo No-deposit Extra Codes Better 100 percent free Local casino Bonuses 2026 Free Spins No-deposit Gambling enterprises in australia 2026 Separate On-line casino Ratings, Information & Courses Alive Baccarat Casinos Best Alive Baccarat Web sites & 25 no deposit free spins Video game in the 2026 Greatest No-deposit Local casino Bonuses 2026 Zero Pick Expected