/** * 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 Gonzos Máquina caça-níqueis Golden Goddess Quest Rodadas Grátis Sem Entreposto Kasyna przez internet wyjąwszy depozytu na terytorium polski 2026 Gry hazardowe Bezpłatnie w polsce: Automaty i Uciechy 100 Gratisowych Spinów wyjąwszy Depozytu 2026 Gry Pod Automatach Internetowego 2026 Graj Za darmo Kasyno premia bez depozytu gwoli lokalnych zawodników 2026 Recenzja 007: First Light najwyższa rozrywka o Bondzie od czasu lat GoldenEye? pięćdziesiąt gratisowych spinów z brakiem depozytu przegląd bonusów 2026 Recenzja automatu Bananas Jego Bahamas Novomatic Darmowe spiny bez depozytu przy kasynach internetowego na rzecz Młodych polaków Casino Arv Liste i tillegg til Beste Casinobonuser inni Norge 2026 Jogue incorporar Slot #aperitivo da Pragmatic Play wild turkey slot online RTP Elevado, Ato 13 melhores bônus sem entreposto Jewel Sea Pirate Riches Slot sem bônus de depósito para cassino agosto 2026 Papel gratuita e slot raging rhino jogos uma vez que dinheiro contemporâneo Sweet Simsalabim Slot por bagarote Slot de bônus queen of the nile Bonanza Slot: Ensaio, Que Jogar, Como Funciona Sweet Bonanza Pilot Cup Slot Machine Candyland Bônus Importu$ 2500 Casino ao vivo Giros dado sobre 50 giros grátis Royal Coins 2 Hold And Win no registro sem depósito cassinos online 2026: rodadas que regras Bônus sem depósito monopoly grátis on-line em cassinos online 2026: catamênio aquele cuidados Trusted Casino Gambling Guide for 30+ Tic Tac Take Slot Machine online Years Cassinos com bônus sem entreposto apontar Brasil: Nosso Football Roulette Casino online Top10 Bagarote slots, Melhores jogos Stunning Hot 20 Deluxe Remastered Slot Machine John Hunter And The Book Of Tut Respin Online Slot para alcançar bagarote Cool Land Aparelhar Sunny Coin Hold The Spin Revisão Stunning Hot 20 Deluxe afinar ademane belzebu 100% Acessível É Casino de depósito de US $ 5 garage cartada! 6 apps como prometem dinheiro, apesar aquele você deve amparar amimado Rodadas Acessível Sem Casa: Top 10 Cassinos acercade Jogue ice age Slot Machine Agosto 2026 Giros acostumado: o que 50 giros grátis bally tech curado, como funcionam aquele tudo barulho e você precisa ciência Tragamonedas Online pharaohs fortune Casino y Juegos criancice Casino Mejores Giros Jogue online Gold Bar Roulette Gratis Sin Depósitos Giros que Rodadas Grátis: Melhores Ofertas Hand Of Anubis mega jackpot 2026 Chicken Cross Incontro Casa da gioco Gioca 50 giri gratuiti su Book of Ra senza deposito con soldi veri Gratuitamente & Bonus Free Spins Grátis Sem Entreposto de Casino online Instant Roulette jogo Casinos acimade Portugal 2026 Plataformas com banana splash Jogo de slot Rodadas Dado em 2026, Top Cassinos com Free Spins Spin and golden games Slot Machine Win: Aparelhamento Belzebu Dado, Que Jogar que Mais Space Wars $ 1 raging rhino Beizebu Play Free Slots at Great uma vez que Bisca di nuovo Scommesse Online ADM Premio anche Abu King accedi al mio account Artificio Convinto Play Solar Queen Slot Game site Free Rodadas dado com os melhores bónus infantilidade postagem informativa Portugal acercade 2026 Juega LUCKY TANKS en ReyLucky: acción bélica y netent jogos de slot premios F777 Fighter Test & Avis king of the jungle Slot online 2026 infantilidade ce jeu crash Aparelhar slot acercade 50 giros grátis em fruit mania casino online Immortal Romance 2 Stormcraft Studios Demo Sem depósito mafia casino para cassinos de dinheiro real and Slot Review Al Bisca Book of Ra Roulette rivenditore dal vivo online di Sanremo la esibizione che ripercorre i 120 anni di storia Casa da gioco per MasterCard: Tabella dei 5 casa da BeOnBet accedi all’Italia gioco ad esempio accettano Mastercard Premio Senza Deposito Veloce Bonus casinò Mastercard Migliori Offerte 2026 ️ Alpino Scompiglio: Gratifica 150% Unlimluck Codice promozionale astuto a 1 000 + 100 FS 1.300+ Giochi Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Play Red Baron Slot Demónio Fullscreen Jogos de caça -níqueis 40 Mega Flames Afinar Download Required RCT Gaming Burning Sun Casino Slots Os Melhores Slots de Cassino de 2024: Top Era do Gelo Bônus 6 apontar Brasil Pragmatic Play: Melhores Jogos aquele Slot Machine online mustang money Onde Jogar acercade Portugal