/** * 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 Ostateczny Przegląd po Darmowej Ruletce na żywo Online: Każda Mała Rzecz, Co Musisz Potrzebować Wiedzieć Najlepsze Online Automaty Kasyno: Kompleksowy Poradnik Dragon hatch bonuses in 2026: unlock amazing rewards at Indian casinos Chicken Road game voor beginners: hoe je jouw eerste winst kunt behalen How to dive into ice fishing game online: A beginner’s guide to start your Bier Haus Automat z przekąskami Online Za Darmo: Ciesz się Autentyczną Niemiecką Zabawą i Nagrodami What You Need to Know About Safer Gambling Najlepsza Lista Kasyn Internetowych: Odnalezienie Doskonałego Doświadczenia Betowania Zalety z grania w darmowe stronę kasyna gry MSport Application bonuses in 2026: Unlock your potential with boosted odds and rewards What to know about security and payments at raketti casino: ensuring safe play Ideal Bez kosztów Obroty Bez Opłaty: Kompleksowy Przegląd dla Zawodników Witryny kasyna Naviguer sans effort parmi les options du top 10 casino en ligne Belgique Test Post Created Ethische Überlegungen beim Glücksspiel Eine notwendige Diskussion Money coming casino: discover the best bonuses and RTP for winning strategies Najlepsze kasyna online w Polsce: jak bezpiecznie wpłacać i wypłacać w 2026 roku 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