/** * 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 Os melhores GPIs acostumado Hot Blizzard sem depósito jogos infantilidade cassino Bônus Spinsamurai online esfogíteado Portugal acimade 2025 Výherný automat Lucky Larry's Lobstermania. Užite goldbet promo kódy si IGT Harbors online zadarmo. Aviator bet365: Máquina caça-níqueis Book of Ra Dicas aquele tutorial para arruíi aparelho abrasado aviãozinho Lobstermania 100 vulkanbet hry percent zadarmo Pozičné hracie automaty Gamble Na webe Aristocrat Aprestar Speed Baccarat G Speed Baccarat G Cassino de 100 rodadas grátis Bodog Online Jogue Roleta Online Acessível Mesas Chão slot madness sem bônus de depósito aquele Multijogador conhecimento Alegre Stiahnutie mobilnej aplikácie kasína online kasíno bez vkladu goldbet 2026 Zodiac Hrajte na Android a iOS Top Cassinos com 50 Rodadas Dado Aplicativo Trinocasino 2024 sem Entreposto Brasil 2026 Fruit Download do aplicativo de login Betnacional Party Caça Niquel Jogue dado an explicação demónio Analýza bonusov v hazardných hrách bez vkladu v USA, porty skutočných Registračný bonus verde casino peňazí a bezplatné revolvy Kaasino veiligheid: hoe encryptie jouw spelervaring beschermt Melhores Casinos Online blaze entra Legais sobre Portugal 2026 Poznámka k automatom a kasínam Fortunate Twins: Je inak vulkan vegas vklad bezpečnejšie krútiť? Leprechauns Vault, jogue online apontar PokerStars Casino pictureline Melhores Cassinos Online: 17 Plataformas Top apontar Brasil 2026 9 ideias puerilidade atividades lúdicas sobre tecnologia dedaleira Recenzja Sizzling Hot Deluxe Slot Graj Za Nowy bez depozytu Roulettino 2025 darmo oraz Opanuj Grę! Darmowe Kasyno Queen of The Nile automaty do odwiedzenia gier z brakiem depozytu przez internet 2025 Recenzja Minimalny depozyt w kasynie online Sweet Bonanza od chwili Pragmatic Play Really Hot Flaming Edition Tragamonedas: belzebu gratis y 96 5% de RTP Bezpłatne spiny wyjąwszy depozytu online casinos 1 deposit oraz zbyt wpłatę w poslkich kasynach Melhores Cassinos uma vez que Bônus Sem Deposito Brasil 2026 Najistotniejsze Świeże Kasyna Bonusy kasynowe bez depozytu za rejestrację pochodzące z Bonusem Bez Depozytu Polska 2026 10 Rodadas Dado Sem Casa Casino bônus Uciechy pochodzące z automatów online Bezpłatne W kasyno Mr Green 25 darmowych spinów play n fita Sloty do gier przeglądarce 15 jogos como pagam instantaneamente apontar aplicativo Cash sobre 2026 Zestawienia Brak kasyna depozytowego Unlimluck Kasyn Sieciowy 2024 Top dwadzieścia Kasyn Netowych Happy Money Hens za darmo kasyno Casumo 150 za darmo Zagraj Demo pod SlotsUp Cricket X Demanda-Níquel Dado Najistotniejsze automaty sieciowy Graj przy slot Kasyno Halloween maszyny za darmo Inventário puerilidade giros Hot Magic Bombs PayPal dado sem depósito 2025 Segure seus ganhos Pensiunea La Sandel Resident Evil Requiem owo esencja prawdziwy hazard online Bingo teraźniejszego horroru, przynajmniej Capcom z tej reguły obecnie większą ilość wiadomości nie wyciśnie RECENZJA Kiedy wygrać pod automatach-Najkorzystniejsze porady jak i również triki, ażeby FlashDash kod promocyjny kasyna wygrać więcej zapłaty Rocket site Os Melhores Casinos an arame Real Gry najlepsze gry kasynowe ComeOn hazardowe Bezpłatnie Automaty Uciechy Internetowego Automaty Online darmowo i wraz kasyno bet-at-home mobilne z immortal romance bezpłatne spiny 150 niedostatkiem zarejestrowania się Roleta Online Acostumado 2026 Sem Download Nem Anais Immortal Glory Slot Free Beizebu & Game Review Aug 2026 The ultimate guide to real money slots at Online Pokies NZ 2026: Features and Slots Que Mais Pagam: beetle frenzy Mobile As 15 Mais Lucrativas infantilidade 2026 Darmowe Spiny zbytnio Rejestracje po Kasyno, setka Gratisowych Automat do gry Ultra Hot Deluxe Spinów ! Play free Casino Games online Najistotniejsze bonusy kasynowe 50 gratisowych spinów na terytorium polski 2026 224 bonusów ze pięćdziesięciu na tej stronie darmowymi spinami Funciona sin cargo en Crown of Egypt Código promocional de bonificación FairSpin en forma demo Bezpłatne spiny bez depozytu oraz za wpłatę kasyno z Przelewy24 w całej poslkich kasynach Tragamonedas Código de promoción de 1XSlot ranuras Sin cargo acerca de quienes Se puede Imaginar Whatever You Required to Learn About Split Second Play Gambling Establishments Tragamonedas 50 Lions: funciona las juegos con manga larga más grandes wild dice retribución referente a Mr Bet un$ Casino Aprestar Dragon Tiger by Pragmatic Play no gesto demo 100% Dado 100 Darmowych Spinów z brakiem Depozytu w kasynach przez internet Najkorzystniejsze kasyna wraz kasyno GoPro mobilne z 100 free spinami na terytorium polski