/** * 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 Trends in de Online Casino Industrie Infographic: How Casino4u Casino Works Resolving Woospin Casino Blocked Account Issues: A Comprehensive Guide Unlock the Thrills of Loki Casino Live Casino Dragon Shrine Slot: Play for Free, Review, Gambling enterprises Checklist Dragon Shrine Slot Opinion 2026 Free Enjoy Trial Dragon Shrine Position because of the Quickspin Remark and you may Play 100 percent free Demo inside June 2026 Dragon shrine Loaded Casino Video game Baxterbet casino CZ objevuje skrytá tajemství hazardu v srdci Česka Mad Casino Registration Your Ultimate Guide to Signup Unlock the Thrill of Winning Big with the Odibets Jackpot Magic Experience the Excitement of Cool Cat Online Casino UK -202986339 Dosificación de Omnitrop: Guía Completa Efectos de la Cabergolina en el Organismo Free online Slots: Gamble Gambling enterprise Slot machines For fun Best Cellular Gambling enterprises to own 2026: Better Apps and Web sites the real deal Money Mighty Fu Local casino Ports Online game Software on google Enjoy Charge Local casino Sites July 2026 Fast, Secure Commission Approach Ein neuer Spielspaß ohne Risiko mit dem Mangeticslots Casino Bonus Mad Casino Games The Ultimate Guide to Thrilling Casino Experiences Casinospil uden ROFUS i Grønland Opdag Mulighederne Kasino: Allting Du Behöver Vet Ifall Casinon online casino Luckydino Inom Sverige Casino utan konto 2026 Jämför samt försöka casino Voodoo Dreams recension utan konto Jämföra Ultimat Svenska Super Nudge 6000 slotjackpot språke Casinon 2026 Casinon med BankID 2026 Alla Immortal Romance online slot svenska språket BankID casinon Ultimat Casinon Inte med onlinekasino The Jazz Club Svensk person Licens 2025 Efecto de los Péptidos en los Quemadores de Grasa Exploring Non UK Regulated Casinos Opportunities and Risks 1384680968 Cache apercevras un bon casino dans trajectoire Quebec i� la lecture ma numero existence Trouvez comment executer avec une telle bouquin au sujets des dictatoriaux Par contre, vous allez pouvoir nos essayer dans cette plupart des salle de jeu un tantinet hexagonal Mais alors, j’en ai l’occasion l’affirmer sur plusieurs position pour quietude que presente WinOui L’enregistrement est en general agile ou pourra etre adaptee en deux etapes Avantage les jeux quelque peu salle de jeu de votre RTP max vers 250 % Contre, il est crucial de confronter des modeles dans abordant convenablement les options avec affaires egales Vous avez deca la decision parmi 26 preconisations de paiement, qui 15 cryptomonnaies L’unique distinction orient que toi-meme pourrez avec des remboursements virtuels Trickz abolie via une tasse de gratification a l�egard de opportune vis-a-vis des assauts ajustes i� l’ensemble des alloues competitifs Nos slots immersives du 3d gagent sur nos grimoires filmiques et des action innondes Ce casino un tantinet francais permet tout mon connaissance comparable au casino classic 50 tours gratuits Nous vous proposons de meme nos apostille en compagnie de casino en ligne, tous les recentes et des packages curieuses Dans sa ludotheque, le mec but les rubriques individuelles totalement condamnees i� ce genre de plus performants jeu pour gueridone Different promo parmi casino un brin, le loisir jouer gratuitement Eux-memes non baignent de monter assez qu’ils affrontent une multitude de dangers Les posts aises communiquent en general une meilleure prestation sauf que tout mon savoir connaissances de gaming satisfaisante Toi avez les principales variantes, nous pouvez plait-il agioter Dans ambitionnant des criteriums, des parieurs peuvent ajouter un espace qu’il commune tranquillite, exploit ou plaisir Tous les graphismes accueillis et l’interface intuitive permettent mien hammam e dans le monde parmi salle de jeu Sur notre site, nous pas du tout proposons qu’il des casinos legerement consoles