/** * 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 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 Adaptasi Demonstrasi 1XSlot putaran gratis tanpa deposit Luau Loot Of Wms Dan Anda dapat Menulis di Server Slot baru Better On the internet Pokies Australia 2026 Better Online game playing Online Pokies Play 7,400+ 100 percent free Pokies Video game! NetCost Market Field of Food Grocery store Birth pokie internet Australia 2026: Complete Help guide to On the internet Pokie Networks Ulasan Happy Larry’s Lobstermania 2 Slot Mainkan Login kasino 1XSlot Video game 100 persen gratis Di internet Best Seller from slot machine online wild north Harbors, Real time Gambling establishment & RNG Games Pokies 50 No deposit Incentive Australian continent Greatest Real cash Local casino Programs for 2026: 10 Best Casinos on the internet Online online casino slots real money casino Ratings Better Respected Online casino Internet sites 2026 by the Getb8 Legjobb Valódi Pénzes Online Pokies Oldalak Ausztráliában 2022-ben Kompletný zoznam online kasín na Slovensku Greatest No deposit Gambling establishment Bonuses Easter 2026: Claim Your Totally free Incentive Now Cleopatra dos Slot machine game Comment & Gambling enterprises Online Blackjack online játék $3 hundred Bonus + $50 100 percent free Casinos Instead samba carnival slot free spins of Gamstop: Greatest 8 Assessed and you will Opposed A kaszinó vezetősége tájékoztatja a jogi képviselőket, hogy az előző MP frusztráltabb lett a blackjack veszteségei miatt. Basketball celebrity Online casino games Enjoy Today! Better Visa Online casinos in the us 2026 Free Harbors 39,000+ On casino mrgreen mobile the web Position Online game No Download Cellular Gambling enterprises & Real money Gambling establishment Programs Gamble Around July 2026 Többszörös Diamond 5 nyerőgép ingyen játszható Ports Safari Casino is actually Rated 2 5 away from 5 in the 2026 2 Incentives Specialist Rotation & Second Rejuvenate Cool Fresh fruit urgent hyperlink Trial by the Playtech Free Slot & Remark Játssz teljesen ingyenes online kaszinójátékokat Aztec Empire Wikipedia Kasína s minimálnym vkladom Hrajte bez stresu a bez vysokých nákladov Minimal Deposit Local casino Websites Best $1 to help you $ten Low Deposit Gambling enterprises U S. online casinos: The following is in which all of the 50 says currently stand-on legalizing internet sites playing, local casino enjoy Élvezd a több mint 9000 ingyenes Position Zero videojátékot, a letöltést vagy jelzést Internet casino Ratings Best Respected On-line casino Internet sites 2026 from the Getb8 Tilslutte Casino Katalog automobilov Objavte svet automobilov a ich špecifikácie Kasína s minimálnym vkladom Hrajte bez stresu Greatest A real income Web based casinos within the 2026, Proven Finest Web based casinos the real deal Money 2026