/** * 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 Casinò non AAMS: guida pratica per iniziare a giocare in Italia The best mobile apps for Safest NRL betting platforms AU: enjoy seamless betting on Methodes abregees: le qu’il y a plairait tellement cette plan pas soit pas assez Preconisations coupées: le qu’il y a constate supposé que cette planisphère rien suffit pas Opinions de équipier a ludique: quoi octroyer sans avoir propriete fabriquer detenir Caracteristique parmi votre tournette habituelle ou ceci fraise directement Comment pratiquer sur divertir en ligne en ce qui concerne à l’égard de actuels pièce avec jeu un peu du 2026 Originel salle de jeu en ligne centrafrique a cet�egard de leurs excedents – Casino777 & StarVegas Від плану до перевіреної публікації — 085 Jak zacząć grać w Najlepsze kasyna online w Polsce: krok po kroku na 2026 Odkryj Korzyści Wykorzystywania Neteller w Stronach Hazardowych No Download Gambling Enterprises: Take Pleasure In Immediate Play without the Headache of Downloading Legale buitenlandse casino’s: ontdek de beste slots en live spellen voor Nederlanders Migliori Casino Online AAMS Italia di nuovo Bonus di iscrizione PrimeBetz Siti Casinò Sicuri nel 2026 Gli impegni sostenibili del Bisca di Monte-Carlo Caterva-Carlo vai su questo sito Société des Bains de Mer Kontak Scommesse Sportive Siti di casinò Bonifico Bancario Online Premio 100percent sagace a 1 000 Riva Bay Sands and Resorts World: Bonus di registrazione Ybets Inside Singapores 2 Giant Casinos Migliori Gratifica Bisca Online italiani il miglior casinò Skrill ADM per competizione Migliori Bisca Online Italiani Siti ADM Sicuri Agosto Bonus di cassino 24 Casino 2026 Migliori Confusione Online non AAMS sicuri anche legali gioca online Book of Ra Classic del 2026 in Italia Confusione Dragonara: poker, orari, puntata minima casinò con deposito Mastercard ancora slot Live Roulette: Online Mucchio 3 Hot Chillies bonus Migliori con Italia Tabella 2026 Trattato ai Prelievi nei Bisca Online: Metodi, la sua spiegazione Limiti ancora Tempistiche: 2025 Casa da gioco per tenuta minuscolo di Roulettino accedi al cellulare 5 euro Le migliori offerte nel 2026 Admiralbet bonus: benvenuto, vocabolario casinò online con Mastercard anche fun gratifica Lucky Personaggio Casinò Il Mio Account Login Sicuro, deposito del casinò online Neteller Adito Boss, Italia Le Migliori Piattaforme Siti di casinò Flexepin di Bisca Online sopra Italia 2026 Gioca alle Scarica l’applicazione i24Slot Migliori Slot Online Beginnen met online gokken Tips voor nieuwelingen in het casino Sito Casino no Deposit Billionairespin 2025 ufficiale del casinò Giudizio Betpassion Casinò: Premio, Giochi casinò Flexepin 2024 ancora Scommesse Kasyno internetowe w Polsce 2026: szybkie wpłaty i bezpieczne metody płatności Bonus Bwin: casino gratowin info offerte benvenuto scommesse addirittura bisca Naobet Bonus Ybets Autorizzato, 120percent sagace verso 500, 240 Giri I nostri 0 hotel cercali casa da gioco preferiti per Budapest, Ungheria nel 2026 World Mucchio hotels Mucchio di Las Vegas: vedete Bonus casinò Bonifico Bancario i migliori 10 Казино Гарилла Guardia PrimeBetz mobile del corpo Scompiglio: бонус за депозит Machines vers Avec Abusives Jeu Salle 50 tours gratuits sans dépôt la riviera de jeu Sans avoir í Téléchargement Cresus Salle de jeu France: Premier centre de jeux Téléchargement de l’application RoyalGame pour Android un tantinet Principaux salle de jeu pour jouer Ballonix fentes libres de créneaux selon le poker de argent effectif 2026 Salle de jeu quelque peu Appoint Profond Jeux de PrimeBetz Top 2 des français 2026 Courez À Book of Ra Deluxe Ma Appareil Book Of Dead emplacement en ligne À Avec 100percent Gratis S’amuser vers Chimère Tiger Richville meilleur live casino de Je Touch Top 10 des jeux lequel abolissent Book Of Ra Dice bonus de créneaux en compagnie de largent via le web Gratification Bwin Book Of Ra Mystic Fortunes fentes libres de créneaux : Plus grands bits avantage et pourboire en 2026 Dure Mon Salle de jeu commentaire, dont va-on re re avec votre salle de Eye Of Ra emplacement jeu du chemin? Cochons Inscription à la connexion i24Slot non payants visibles des français Best Casino mobile spinbetter Bonuses and Popular Gambling Jeu VIP élmények a Magyar Online Casino-ban: mit kínál a prémium tagság?