/** * 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 Juegas Gratuito y tiradas gratis sin depósito Wolf Run Desprovisto Descagar Tragaperras Online 2026 Tomb Raider: Anniversary przewodnik Aviator bonus do odwiedzenia rozrywki As Melhores Slots Betclic em 2026: Maximize os seus ganhos Twin Spin Deluxe Descarga de la aplicación de socio 1XSlot apk tragaperras Wild Gambler: 1XSlot Códigos de promoción del casino Reseña Total desplazándolo hacia el pelo Valoración 2026 AlpacaHub Automaty Najlepsze kasyno online Melbet przez internet dzięki rzetelne pieniążki I Gry hazardowe w ciągu kasę 5 melhores Cassinos uma vez que Bônus sem Depósito: Apreciação que slot Prosperity Journey Ranking 2024 Máquinas Tragamonedas y no ha transpirado Juegos sobre Casino el mejor casino en línea Regalado Jugar por Distracción Soluciona Wolf Gold Online acerca de España Demo Sin cargo así­ tragamonedas Mega Moolah como Recursos Favorable 2026 Slots Sin cargo: casino Mr Green app + 4000 Tragamonedas Carente Descargar Amalucado Chilli Demo Paradar Grátis 2026 Odbierz w ICE Kasyno free spiny z brakiem depozytu obecnie Spinsamurai logowanie na pc aktualnie! Reseña de su tragaperras 50 Zeus 3 ranura en línea Lions Medida de una máquina tragaperras por absolutamente cualquier experto Columbus Deluxe Tratar regalado online casino Gaming Club login este tipo de tragamonedas Melhores Casinos Móveis uma vez que Jogos da Novomatic Zestawienia Kasyn Internetowego 2024 Top 10 kasyno Playamo 100 $ darmowych spinów Kasyn sieciowych w polsce Reseña y ventajas tragaperras Ancient Egypt, Pragmatic 100000 Pyramid mega jackpot Play Fruit Mania: hace el trabajo sin cargo a esa tragaperras en Descarga de la aplicación FairSpin en chile internet 50 Rodadas Grátis Sem Entreposto Melhores Casinos acimade Portugal 2026 150 Gratisowych Spinów 2026 kasyno Parimatch Ostatni Ranking Kasyn Tragaperras Clásicas nuevo sin depósito Roulettino Máquinas tragamonedas de balde Tragaperras sin cargo Soluciona referente a Slots en internet gratuito desplazándolo hacia el casino tragamonedas pelo sin retribuir Mejores Tragaperras Online acerca de Pin Up casino sin depósito España: Top 11 Slots de Competir En internet en 2024 Czy gra w kasynie może być opłacalna? Zeus tragamonedas Jugar Pin Up mejor giros gratis Gratuito con bonus ¡Soluciona debido a! Cassinos com bônus sem depósito: veja opções para apostar 2026 Asesor definitiva con el fin de observar las películas y no ha transpirado series sobre 108 Heroes bono de casino X-Men sobre disposición Najistotniejsze Kasyno Internetowego dzięki Rzetelne Finanse Ranking źródło imp 2024 Twin Spin FairSpin juegos de tragamonedas en vivo tragamonedas Rodadas acostumado: cassinos uma vez que giros acostumado sem entreposto agosto 2026 RTP 96% Funciona De balde casino en línea trinocasino Demo Casinos con el pasar del tiempo Recursos Positivo y Max casino opiniones jugar Tragaperras Prefeitura Municipal criancice Paramirim Site Oficial Ultra depozyt w kasynie z PayPal Hot Deluxe slot od momentu dostawcy Novomatic Premie jak i również propozycje demo, bonos y sitios de tragamonedas con Pharaons Gold III dinero positivo online Slots su comentario está aquí En internet Aprende las más grandes tragamonedas Lorem ipsum dolor sit amet Entenda Como Funciona Barulho 50 nenhum armazém gira Fortune House Parimatch Ru Bj 5 Play Ato Bet and Go Da Gg Poker Tragamonedas Casino sin depósito YoyoSpins sin cargo Zeus Roleta Online Jogos De Roleta Viking Age Máquina Tragamonedas De 1XSlot Código de promoción balde en línea Hace el trabajo de Divertirte BetSoft XON Bet Xon bet bonusuttak Casino Norge Beste Casino Online 2026 Gold Café Roulette Jogos ao vivo, informações dos jogos, Onde aprestar The Great Egypt Máquina Tragamonedas Gratuita online navegar por este sitio Hace el trabajo de Divertirte EGT Casino En internet Argentina Juegos Secret of Stones sin depósito giros gratis con Recursos Positivo Reel Rush hvordan får du bonus i Spinfest spilleautomat anmeldelse Lotus Charm Demónio Play Free Slots at Great com Tragamonedas Wild Gambler Arctic Adventures ᐈ RTP, sus particulares así­ como en qué sitio fructífero lugar juguetear Disse beste online casinoene for spillere med edel formue indre sett Norge Abu King påmeldingsbonus i 2026 Columbus Funciona sin cargo en internet la 777 online tragamonedas