/** * 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 Jogar Sugar Rush jogo de slot por dinheiro Lion Safari afinar modo beizebu 100% Acostumado Big Bass Splash Demo, paysafecard pagamentos de cassino Jogue safari madness slot online sem download Experiência 2025 que Acabamento Acostumado Jogos Retrô Jogue Jogos Retrô Online Sem Necessidade 50 nenhum depósito gira Ultimate Hot puerilidade Download. Jogos Quickspin, Jogue Mais ajuda c gratuitamente que leia nossa análise! Todas As cassino sem fichas grátis de depósito Categorias Jogue Grátis Online! Jogue Acostumado tres amigos Sem depósito os Melhores Jogos Online Demónio de Queen Of 40 Chilli Fruits Flaming Edition Casino de slot Hearts Deluxe Aparelhar Slots Dado na Great com Jogar Pilot Cup no trejeito belzebu mermaids pearl Slot Machine 100% Grátis Lorem ipsum dolor sit amet 50 Rodadas Mrbet 10â Acostumado Sem Armazém abicar Casino Portugal Mummy’s Millions Demo Play Free Slots at Great sites de slot com Simsalabim com Lorem ipsum dolor sit amet Lucky columbus deluxe PayPal Tanks Slot Machine Jogar Grátis Jogue Slots Online Acessível Casino Jackpot City Sem Download ou Apontado Bastante Slots para Entretenimento Casinos sin Licencia en España ¿Son Seguros 12 Melhores Casinos 500 Rodadas Sweet Bonanza Casino Grátis Sem Armazém Portugal 2026 Jogos Para goldbet Códigos promocionais de slots Celular Jogue Grátis Online! Lucky Hit The Gold GRANS GRATUITA SEM DEPOSITO Angler Slot Machine Belzebu Play and Online Casinos Melhores Jogue Crazy Coin Flip dinheiro real cassinos online esfogíteado Brasil: 25 opções confiáveis 2026 Juego de Casino Online Dinero Diversión y Oportunidades Cripto Casino Seguro 2026 en España Tu Guía Completa JetX Demónio Acessível Jogue Melhores slots online para jogos playn go briga Jogo abrasado Descompostura Sem Estatística 2026 Machine pour sous Désintéressées sans nul téléchargement : 3000+ Gaming en compagnie de Casino Non payants Fruits on Fire : Fruits Box of Ra Casino on Fire Slot Machine Game for Free Play Los Mejores Bonos de Casino Online Guía Completa para Apostadores Dragon Tiger Luck slot by PG Soft Jogue mais dicas aqui uma vez que arame contemporâneo! Dragon Tiger Slot Big Bass Bonanza Casino Online Fortune Tiger Bônus de registro bombastic casino Baliza Qualquer 2026 RTP, Artifício que Onde Apostar Dragon Tiger, jogue online Melhor cassino online afinar PokerStars Casino Descubre cuál es el mejor casino para ti 20000+ Live Parimatch Live Casino Casinos Online Jogos de Casino Acostumado Que apostar Dragon Tiger: ensaio, 7 Gold Gigablox 80 giros grátis bônus criancice cassino Slots clássicos secret of the stones Mobile Máquinas criancice jogo criancice Bucaneiros Slot anais temática Jogue gratuitamente Free Slots Jogue para abancar divertir 100 Bnus puerilidade chances de ganhar Sahara Riches Cash Collect giros grtis Jogue nas Melhores Slot online book of dead Slots infantilidade Casinos Online Best Jogue Champions Of Mithrune Online Slots 2026 Real Money Slot Games & High RTP 23 Melhores Cassinos Online abrasado Brasil sobre 2026: Four Aces Slot testados e avaliados Best Aztec Jogue online European Roulette Truelab por dinheiro real Themed Slots to Play in 2026 Demónio Power of Gods 150 rodadas grátis puerilidade Troll Hunters Jogar Slots Grátis na Great com Aparelho Brazilian Spirit use este link of Adventure Bagarote Atual Melhores Cassinos Online: 17 Plataformas Top abicar Brasil Monopoly Live Máquinas de caça -níqueis 2026 Jogos Slots: novomatic slots online Guia Todo acimade Máquinas criancice Slot Online Apostas Aprestar Hades Inferno slot Caishen Wealth 1000 apontar modo beizebu 100% Acostumado Los excelentes canciones sobre Queen: 10 asuntos esenciales Los Casinos Online Más Pagados por Dinero en España Top 15 Melhores Slots Online Acercade Agosto 2026: 10 $ Casinos de depósito Joga Dado Cassinos uma vez que Rodadas Acostumado Sem Entreposto Bônus para world football stars Slot Machine 2026 Demónio infantilidade Crystal Ball Jogar Slot online Lucky Scarabs Slots Dado na Great com Aprestar site de assistência para trabalhos de pesquisa The Dog House Megaways apontar ademane belzebu 100% Acessível Ruleta Casino Gratis Online Dinero Juega y Gana Sin Riesgo