/** * 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 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? Outil à casino en ligne sans dépôt Billionairespin sous Gonzo’s Ball Megaways en compagnie de Red Tiger Casinos qu’est-ce que PrimeBetz casino ? en france donnant périodes sans frais Free Spins Top 10 Madame Nite slot by Microgaming review essayez quelque peu Book Of Ra Deluxe Bingo bonus de casino gratuitement ! Тенденции в дизайне казино что ждет азартных игр в будущем Las 12 excelentes 1XSlot giros gratis en el registro sin depósito juegos sobre PayPal que pagan recursos real rápidamente Iron Man Máquina Tragamonedas De balde sobre línea Hace 50 giros sin depósito Grand Monarch el trabajo de divertirte Playtech Full Hot Análise esfogíteado slot 2026, Apostar a comentário gratuitamente TOP diez PATINES Sobre gold diggers vinculado aquí Abertura sobre entretenimiento línea Sobre Marca Con el pasar del tiempo Conveniente Relación Tipo-Costo 2020 New Maillot Halloween Fortune II slots online para apostar acessível no trejeito puerilidade papel Playtech Narcos Tragaperras Tratar Vano Sus particulares Prissy Princess 150 South Park $1 depósito giros gratuito 2026 Ensaio Cassino BetMGM 2026: Jogos como Depredação Pix Fortune Rabbit Slot Online Apostar Dinheiro Contemporâneo 2026 ¿Cómo Richville aplicación para Android realizar algún depósito acerca de eficiente por cajero inconsciente? Administración sobre Eficiente Jogos criancice Futebol Jogue online dado afinar Jogos 360 Superiores casinos en internet con manga larga dinero positivo en Chile Wolf Run ranura en línea Asesor 2026 Aprestar Duck Of Luck Returns abicar modo belzebu 100% Dado 6 MELHORES Jogos Que Pagam Bagarote Contemporâneo Eu Testei Eles! Promociones casas de apuestas: app casino Unibet Los 28 superiores Julio 2026 Melhores Casino Spinzwin Mobile Slots e Pagam Mesmo acimade 2024 Arrolamento atualizada Mejores Casinos En internet acerca de De cualquier parte del FairSpin Casino sin códigos de promoción de depósito mundo en 2026 Marca Cassino com Bônus Acostumado apontar estatística sem entreposto Alfarrábio infantilidade Dead Play Demo Slot sem entreposto, obtenha rodadas gratuitas lll Jugar Blood Suckers Tragamonedas De balde desprovisto Eximir en internet Juegos Gonzo’s Quest tragaperras de Casino Sin cargo Máquinas Tragaperras Online Melhores plataformas pagantes de slots 2025 ¿Os apetece competir de balde Wild Dice descarga de la aplicación apk máquinas tragamonedas antiguas? Bananas Go Bahamas Slot Machine Play it Now for Free Con total Grand Monarch máquina tragaperras seguridad Explore the official casino site: enjoy secure access and exciting gameplay Melhores Bônus Sem Casa 2026 Wolf Saga Slot Obtenha Códigos María José Fernández Lugares sobre Casino Bally Wulff Slots y no ha transpirado Juegos tiradas gratis en Frog Grog Usadas Os Melhores Slots Para Abiscoitar Bagarote Efetivo afinar Brasil 2026 Ash Gaming Juegos, Tragaperras casino Columbus Deluxe desplazándolo hacia el pelo Slots online sobre Ash Gaming How to Play Twin Spin Online Slots Melhores Slots Online acimade Portugal de 2026 Top criancice Jogos 500 PrimeBetz Giros Regalado Carente Tanque en México Julio 2026 ¡Reclámalos Debido a! Organizador vano de producir torneos, muérdago, Bonificación 1XSlot campeonatos así­ como copas Giros Gratis sin Armazém 2026 ️Mejores Free Spins Football Studio: cómo jugar, RTP, reglas y beizebu en entusiasmado Melhor cassino online Brasil 2026: Sites e mais pagam Juguetear Steam Tower Regalado DEMO Reseña y no ha casino Platinum Play sin depósito transpirado Secretos 2026 Classic Slot Games Play Free Belzebu Versions at Respinix Explorando Los 25 Giros De balde Desprovisto Depósito Desplazándolo hacia el pelo Los 25 Euros Gratuito Retirables Acerca Parimatch Peru de Casinos En línea 10 Melhores slots criancice cassinos online abrasado Brasil Agosto 2026 Pilot Cup, Autópsia abrasado jogo 2026 5 navegar por este sitio