/** * 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 Progressive Harbors Publication 2026 Gamble Modern Jackpot Harbors Most readily useful Progressive Jackpot Harbors Guide Chance, Features & Info Top Us Gambling on line Internet sites 2026 Professional Checked & Ranked Best Poker Sites to experience Online inside the 2025 Most useful Selections & Incentives Top Payment Casinos on the internet 2026, Highest RTP Casino Websites High Commission Casinos on the internet U . s . Most useful Payout Web based casinos to own Highest RTP Games for the July, 2026 10 Fastest Payment Online casinos in 2026 Top 10 casinos on the internet in the Ontario #1 Finest On-line casino Websites & Incentives 2026 Better Online casinos one to Undertake Members regarding the Us within the 2026 Greatest Casinos on the internet in the 2026: Best 15 Real money Web sites Grandwin La Nueva Era de Las Apuestas en Línea 1722328937 Most readily useful Gambling enterprise Software for real Currency July 2026 Most readily useful Online casinos United states 2026: Real money Courtroom Gambling enterprise Internet Ideal Online casinos Usa 2026: A real income Internet sites Examined Top Ports to relax and play On the web for real Currency July twenty five Lowest Bet Roulette Play Roulette On the internet on 888 Gambling enterprise $5 and you may $10 Lowest Put Gambling enterprises Obtainable in the us Most readily useful Online casino Bonuses and you may Offers 2026 Real Specialist Websites Rated On the web Roulette Video game: Top Options for 2026 Greatest Real time Casinos 2025 The best place to Play Live Agent Video game On the web Cracking Information and you may Current Reports Now Most useful On line Alive Specialist Casinos In the us To possess 2026 Better Live Gambling enterprises 2026 one hundred+ Alive Broker Game Top Alive Casinos on the internet All of us 2025 Gamble Real time Agent Video game Live Agent Web based casinos: How they Really works, Where you should Gamble & A lot more Live agent internet casino: Our picks to discover the best real time local casino programs 2026 On line Real time Gambling establishment Web sites 2026: Top 10 Best Real time Agent Gambling enterprises U . s . A real income Games 2026 Finest Real time Specialist Casinos & Games Most readily useful Real time Gambling establishment Top ten Real time Broker Gambling enterprises 2026 Alive Specialist Casinos Us: Most useful Real time Gambling enterprise Sites getting 2026 Real time Local casino On line Range of Most readily useful United states of america Live Specialist Casinos on the internet Most useful United states Live Broker Casinos 2026 Hd Avenues Looked at An informed Live Agent Online casinos Dive on the types of top real time agent casinos feels like investigating a jewel chart in which for every single X scratching another playing experience. Yes – FanDuel Local casino is the perfect place playing real money black-jack on the internet! To close out, live blackjack also offers a vibrant and you will immersive playing feel that mixes the fresh excitement of a real gambling establishment with the convenience of playing from your home. Most useful Real time Dealer Web based casinos to tackle inside the July 2026 Real time Dealer Casinos 2026 Gamble on top Real time Gambling enterprise Websites Top Real time Online casinos July 2026 Websites Having Most useful Real time Dealer Online game Ideal Alive Broker Casinos on the internet in the us Greatest Real time Broker Online casinos when you look at the July 2026 Top Online gambling Internet within the July, 2026 Top Alive Agent Online casinos to tackle for real Cash in 2026 5 Better Alive Gambling enterprises in the 2026 15 Better Live Dealer Blackjack Internet sites 2026: Most readily useful Game Alternatives Alive Dealer Web based casinos: The way they Work, Where to Gamble & A whole lot more Most readily useful On the web Alive Casinos 2026 Play above You Live Gambling enterprises