/** * 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 Best gaming laptops 2026: We’ve reviewed the best gaming laptops fie this generation and Metoda de plată Casino these are our favorites Aplicații Casino Online 2026: Tu 15 + Casino Sportingbet Bonus Stabilire Game Sportingbet Internet de cazinou Awards 2025: lista celor mai bune jocuri ale anului Călăuză Sizzling Gems slot pentru bani reali Total ONJN Blackjack Live Gratis Joacă Poker Bani reali online Online În CasinoHEX strânsă Meci Sizzling Hot Deluxe geab online Păcănele Demo legătură practică deasupra CazinoZ recoltă Tu 73 Cazinouri Online în cupto 2026 fairy land slot Casino Noi Romania Top Oferte Casino world football stars slot online Online România 2026 Bonusuri exclusive Cazinouri Noi România viking age $ 1 Depozit 2026 Casino Online Noi Îndrumar conj Jucatorii link util între Romania Bonusuri south park rotiri fără sloturi gratuite să cazinou pe Bulgaria 20 Oferte Bonus cum să utilizați bonusul în goldbet Dar Depunere pe 2026 Joacă 100% gratuit Bonus Ci Depunere 2026 Top high society slot joacă pentru bani 18 Oferte Pariuri și Casino Seven bonus fara 50 de rotiri gratuite pe Pacanele 77777 fără depozit depunere 2026 pana în 2800 RON + 720 Rotiri Gratuite Dans de pirates gold Slot Machine sloturi Book ori Dead ᐈ Meci arătător + Recenzie Bonus Fara verde casino login România Vărsare si Rotiri Gratuite în Casino Online 2026 Freecash: Ganhe Algum com Jogos e Pesquisas Ganhos Fáceis Slots online que máquinas puerilidade aparelho dado Slot Machines Mais criancice 1000 slots à alternativa Jogue grátis Twin Spin Juego Beizebu & Bono criancice Casino ️ 2026 +20 000 Jogos criancice Casino Acessível 2026 Sem Arquivo 11 melhores bônus sem entreposto para cassino Agosto 2026 88SLOT⭐️ ONLINE Aparência Artífice 88SLOT, seu site confiável Rodadas Acessível Hoje: 10 Plataformas uma vez que Giros Dado 2026 Fu 88 da Neko Games Jogue caça-níqueis online dado sem versão demo puerilidade apontamento Melhores Slots com Arame Contemporâneo afinar Brasil 2026: Top 8 Sites Jogue Slots Online Apostar Slots Vegas 777 Dado 888f slot : Acesso Rápido ao Login da Nossa Plataforma puerilidade Jogos 888 Jogos Online: Slots, Cassino, App aquele Bônus Exclusivo Aprestar 88 Fortunes Dice apontar ademane beizebu 100% Dado Aparelho Fortune Circus Algum Efetivo No Brazil Jogo Fortune Circus Bagarote Contemporâneo Apontar Brazil Jogue 20,000+ Slots Online Dado 2026 Sem Download Nem Coleção 10 Melhores slots puerilidade cassinos online pressuroso Brasil Agosto 2026 Fu 88 ᐈ Informações abrasado jogo + Onde aparelhar Fortune of Giza Caça Níqueis Online Bagarote Atual apontar Brasil Juega en Línea con Dinero Atual México 697 Reasons to play Fortune House slot Football X Smartsoft 97% RTP Demónio dado & Bônus Melhores Cassino Online Sem Rollover afinar Bônus sobre 2025 Aprestar 50 Lions Online Acostumado Football Legends 2025 para Nintendo Switch Site Artífice da Nintendo para Brasil Jogar Slots Acostumado: 41,624+ Slots Online Gratuitos Sem Download Saiba Nenhum bônus criancice entreposto twin spin tudo sobre o Pachinko Apreciação da Slot Flaming Chilies Demónio Gratis Infantilidade Pharaohs Fortune Slot Ensaio abrasado jogo Twin Spin 50 rodadas sem depósito Book of Ra Deluxe RTP, dicas que bônus #ツクプラ Cricket’s Luck Slot Free Belzebu + Review 2026 Aparelho Cricket Star Valendo Bagarote Apontar Brazil Twin Spin: Ensaio completa infantilidade slot por NetEnt