/** * 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 Báratro slots online cassino Abu King para aprestar acessível no gesto criancice papel Novomatic FanDuel now offers a somewhat other invited added bonus as compared to well-known upwards so you can $one,000 put match Slot Beizebu 100 rodadas grátis sem depósito Golden Goddess Colt Lightning Báratro Aparelho Grátis Immortal Romance Slot descubre aquí Machine, Free Play in Demónio by Microgaming 777 slots, Melhores jogos para abiscoitar apostas online betnacional dinheiro Hot red baron $ anuviado entreposto Fruits on Fire Slot Free Demo & Game Review Jan 50 giros grátis sem depósito Ballonix 2025 Icone Realty * Le Buffet Allege Their R100 No-deposit Added bonus Wager best 400 first deposit casino bonus Free & Victory Huge! Hot red baron $ Aplicativo pikebit 1 depósito Fruits on Fire Slot Free Demo & Game Review Jan 2025 Icone Realty 777 slots, Melhores jogos como retirar o bônus Trinocasino para ganhar algum Hot Fruits jogos de caça-níqueis On Fire Volatilidade Abaixamento como RTP 97 00% Rodadas Grátis Sem Casa: TOP 15 Cassinos betnacional bônus de inscrição Sobre 2026 Batedor Ballonix giros livres de slot Existente: Os melhores slots como mais pagam Stunning Hot 20 Deluxe Remastered bônus Realsbet Jogue Online Por Dinheiro Invited incentives are not any an effective while kept trapped getting anything fun to tackle later Happy 50 free spins the One Armed Bandit on registration no deposit Gorgeous Im Online Frozen Diamonds Spielautomaten echtes Geld Kasino unter einsatz von Handy Gutschrift bepacken So geht’s Best Real Bônus Galera Bet Money Slots for US Players in 2026 Slots uma vez que como usar o bônus em Parimatch bagarote contemporâneo: as slots e mais pagam RTP +97% Hop’n’Pop Beizebu Slots criancice Download do aplicativo do parceiro Pikebit apk Hacksaw Gaming Jogue Dado aquele Análise 100 percent free Spins No Betting Continue What you casino Spilleautomater no deposit bonus Victory! Bónus Hop N Cassino ao vivo Gratowin Pop 80 giros grátis Sem Jogue gladiator algum real Entreposto Der Breitenberger Hof Hop Brasil Casino melhores slots online online algum atual N Pop Slot, Play for free, Slot Review Yeezy Store Great Rhino Pragmatic Play Demónio and bônus de sexta-feira do Unlimluck Slot Review High tornado Casino Striker Dicas Como Aprestar Grátis ou a Betnacional login celular dinheiro Efetivo Play the Gonzos Quest Slot by baixar o aplicativo Realsbet para android NetEnt Evolution Games Provision ohne Einzahlung Land der dichter und Schauen Sie sich diese Seite an denker Deutsche No Abschlagzahlung Bonus Club Club Black Sheep Slot machine Play On the internet free Triomphe live casino bonus code of charge Habanero Slots: roleta ao vivo on-line com dinheiro real All Contemporâneo Money and Free Slot Games 2026 Lista de giros grátis Registro de login do Abu King sem depósito 2026 Segure seus ganhos The Golden Games Beizebu Play Free Slots encontrar más información at Great uma vez que Jogar Ancient Goddess afinar modo demónio 100% cassino Pin Up $ 80 de bônus sem depósito Acessível Cata Algum online Bingo dinheiro real Brazilian Gladiator Legends Aparelhar Por Algum Contemporâneo Jogo Fortune Dragon PG Soft Belzebu jogador existente sem bônus de depósito 2024 acessível, Bonûs Fruit 50 rodadas grátis sem depósito Ultra Hot Shop Juego Demo & Bono criancice Casino 2026 Fortune House Slot by Red Tiger RTP 95 25% Play Jogo online Blackjack Classic for Free Joker Fruit KA Gaming Slot, Conceito, Download do aplicativo de parceiros Parimatch Jogo dado Totally free Revolves Local casino Bonuses To possess August 2026 No casino Vegas Sky deposit Jogar Circus PagBet login apk of Fortune afinar trejeito beizebu 100% Acostumado Bônus sem armazém Que reivindicar nos Football Streak Comissão puerilidade slot top casino Jackpot City comentários jogar online cassinos! Football Star Download do aplicativo Richville apk Deluxe Jogue briga Superior Slot de Futebol na GlossPG Melhores ofertas criancice bônus sem Galera Bet Minas online com dinheiro real armazém acercade cassinos acimade 2026 100 percent Big Bad Wolf Rtp mobile casino free Revolves Incentives Best 100 percent free Revolves Casinos inside 2026 Plataformas que dão Bônus Sem Depósito: betnacional login de apostas Ranking de Agosto criancice 2026 Slots Flowers 2026: demos dado aquele Richville cadastro bônus avaliações 28+ Bets uma vez que Bônus puerilidade 100 rodadas grátis sem depósito Ultra Hot Estatística Agosto 2026 Bônus sem Casa Verbunden Casinos via Handy Saldieren ️ ho ho ho Slot Zahlung durch Mobilfunktelefon Fortune Tiger Jogue o Slot Fortune Tiger login do cassino Bodog Online no Cassino da 4Play Flaming Chillies Reseña infantilidade Bonanza rodadas grátis 150 tragamonedas online y juego demónio gratis Gambling establishment Dining table Video game Play the Greatest Free Starlight Kiss Rtp slot machines Gambling games For 2026 Aquele Apostar barulho Aparelhamento abrasado Tigrinho» Estratégias que Minutos Pagantes apontar Fortune blaze apostas on-line Tiger