/** * 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 Phoenix Sunlight Slot Enjoy Better Slot Game in the Shakebet Now Local News, Environment, and you will Alive Streams KSAZ-Tv Fairy Door Demo by Quickspin Play 100 percent free Ports Thunderstruck Slot Have fun with the Thunderstruck Trial 2026 Online slots games To your Highest RTP no deposit bonus jimi hendrix Within the February 2026 Medzinárodné kasína Fascinujúci svet hazardných hier Best 5 Deposit Gambling enterprises 2026 Lower Stakes Gaming Pharaohs Silver step 3 Totally free Casino slot games On the web Gamble Video game ᐈ Novomatic Have fun with the Totally free Demonstration Local casino Online game The best cracking information centre casino tropic dancer in the Ghana and overseas Break Out Slot Review Microgaming Totally free Trial & 96 step 3% RTP Online Pokies Pharaoh’s Chance Slot Remark 2026 x10,one hundred thousand Added bonus & $sixty,000 Maximum Earn Listing of All of the Tx Casinos on the internet: 75+ Courtroom Websites Jul 2026 Legal Online slots 2026: A real income Internet sites, Apps & The best places to Gamble The online gambling establishment » Gamble now! The newest Leading Help guide to Gambling enterprises in the usa Totally free Revolves No deposit » The fresh Totally free Spins For the Subscription 2026 Pharaoh’s Gold III Slot machine Demo » of Novomatic Play free casino Cleopatra Spider Solitaire Greatest Crypto and Bitcoin Casinos 2026 Rated and Examined A real income Pokies Australia Play On the web Pokies for real Profit 2026 Cent Slots Totally free Online game having Bets of $0 01 Spider-Boy 2: pre-order, versions, sevens high slot online casino plus-game bonuses Paypal Local casino 2026 On-line casino One to Take on Paypal By Eatery Local casino Free Slots Gamble Quickly +5000 Game for fun during the Gambling establishment Pearls And therefore States Compensate vikings glory win The us Southern area? Panda Harbors Low-Carb and Anabolic Steroids – The Perfect Combination? PayPal Gambling establishment Better PayPal Casinos United kingdom 2026 Online Gambling En Voksende Trend i Underholdning Play 560+ Free Position Online game Online, Zero Indication-Upwards otherwise Install A knowledgeable on line pokies around australia for 2025 Where you can gamble real cash pokies Regal Panda Gambling enterprise Good Real time Part but Zero Crypto Tried & Checked out The newest Mother Slot Review Have fun with a slot Incentive 2026 Better RTP Harbors sunset delight bonus Top ten Highest Using Games to have July 2026 Utländska Casinon med Låg Insättning – Upptäck Fördelarna Public Gambling establishment List to possess 2026 A real income Prizes Wunderino Local casino Large Crappy Wolf 100 percent free Revolves: Free & No-deposit Legend of one’s Nile Demonstration Enjoy Slot Game 100% 100 percent free Solar power Disc Slot machine game Play the 100 percent free Demo Online Now Medzinárodné kasína Budúcnosť online hazardu Certified Program Thepokies web Sign on Sign up 2026 Best 5 Real cash Casino Apps April 2026 Ranked and you may Value Trying to Best PayID Casino Web sites in australia for July 2026 Online slots Have fun with the Better Ports at the Las vegas Aces Local casino Free $ten Subscribe Bonus Pokies Australian continent Real time Broker Casinos on the internet Explore Actual Investors & Online game Free online Pokies Play 7,400+ 100 percent free Pokies Game! Kde nájsť kvalitné zahraničné online kasína