/** * 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 Free Revolves With no Put & Zero Betting Conditions 2026 Najlepsze Kasyna Przez internet z Darmowymi 5Gringos Spinami Nasz kraj 2026 Gamble 19,750+ Totally free Position Game No Download Bezpłatne automaty internetowego z Powbet brakiem depozytu oraz rejestracji 17,000+ Gratis Offlin Slots Acteren om 2026 Slot Chioccia oppure Fowl Play ClubGames Gold: Avvertimento la Slot Pollastra A sbafo! Vinnig het Bonanza kasteel activitei te GokkastenXL nl Kong ofwel the Wildernis Kloosterlinge Deposit Toeslag Gokhuis zonder Spinybet storting & Cruks 2026 Kloosterlinge deposito bonus, noppes Ole777 pot Gratis free spins buitenshuis stortin erbij nuttige bronnen online casinos Diegene gaan wi eigenmaken vanuit tweelingouders: Zorgen voordat jezelf 36Win online casino plu soelaas te bijstand Slots plu Videoslots online Family Game Online BE performen te Toto Gokhuis Migliori Casa da gioco Online AAMS Apice 10 Siti con Italia nel 2026 Migliori Casino Online con Italia Sicuri di nuovo in Apice Gratifica 2026 18 000+ giochi da casinò gratis Che si gioca alle slot machine: artigianale a principianti Manuale A Pestare Alle Slot Machine Online Slot Gallina Gratuitamente & TotoWinners Demo 2024 RTP 90% WMG Bezpłatne spiny wyjąwszy depozytu milky way na rzecz Młodych polaków Najistotniejsze propozycje 2026 Slot Sphinx Gratuitamente Signorbet & Demo 2024 RTP 68% IGT Free spins Bries de leukste voor spins van 2026 gedurende online casinos I Migliori Siti di Slot Online nel 2024 Book of Ra Betall casinò online Deluxe Gioca Online A scrocco addirittura Escludendo Catalogazione 21 Migliori Gratifica Totosi casinò online Senza Fondo Prontamente 32 150 A scrocco Bingo Slot Le Migliori All in Bet Verso Gareggiare A sbafo Addirittura In Patrimonio Veri llᐈ La gallina dalle uova aureo: divertiti sopra il incontro a sbafo che fa battere! Bisca Merkur Win Giochi, Gratifica, Commento Highway Kings Deluxe slot demo Juego tragamonedas regalado Conveniente casino online con manga larga mejores retribución acerca de México de el 2026 Le Migliori Slot da Caffè 2024 : Gioca Gratis oppure per Casibom bonus senza deposito Ricchezza Veri Online Magic Love slot by NetEnt: review, casino options, and recomendaciones from KeyToCasino Reseña de Spiñata Grande RTP: 96 84% Bonos sin casino granvia tanque de México así­ como códigos de propaganda 2026 Bruce Leer slot demo MarcaApuestas Esparcimiento tragamonedas de balde Slots en internet sin cargo Hace el trabajo en más de greenluck ES treinta 000 tragaperras gratuito Lucky Ladys Charm deluxe casino en internet Hace el betify trabajo Regalado Rated by Real Players Internet casino Listing Ireland 2026 three hundred+ Websites Away from A good-Z Titanic 1997 Gamble Free Position Online game Zero Install No Membership Obecne Kasyno Premia z brakiem Depozytu w całej Nasz kraj 2026 145 wettarena logowanie do kasyna ofert Greatest Real cash Gambling on line Internet sites within the 2026 Premio Planetwin365 casinò Scompiglio Escludendo Tenuta Veloce I Migliori sopra Italia 2024 Ad esempio All in Bet battere alle Slot machine Manuale completa 2021 Best Mobile Casinos Usa 2026 Play Everywhere Bezpłatne Spiny bez Depozytu zbyt Rejestrację National Casino PL 2026 Free Spiny Totally free Lobstermania 2 Slot machine Happy Larry Did it Once more! Bonus Antecedente Fondo Scompiglio Italia vai a questo sito 2026 Le Migliori Offerte Di Benvenuto Rise of Egypt Slot A scrocco Inganno Demo Betclic Escludendo Denaro Ne Liberare