/** * 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 method to decide Gambling establishment Internet sites British GambleAware is actually a reports and services program getting to try out reliance Everything we Come across Just in case Considering Web based casinos PlayOJO জুয়া এন্টারপ্রাইজ যোগ করা হয়েছে বোনাস পঞ্চাশ বাজি – 2026 এর মধ্যে সম্পূর্ণ বিনামূল্যে স্পিন How to pick The best Casino to need to relax and you will play on the online Roulette fifty Dragons 100 процента безплатен слот Trial Gamble Aristocrats fifty Dragons с безплатни завъртания и 1250x максимална победа It’s time to Begin To play throughout the Casinos on the internet! Recognizing the fresh new Gambling establishment Internet You should Prevent What we should Get a hold of When looking at On the web casinos петдесет Напълно безплатни завъртания Без депозит Нулев залог Великобритания 2026 Запазете trinocasino казино онлайн всички Gamble Sınaq Proqramı 100% 1Win tətbiqinin nəzərdən keçirilməsi pulsuzdur التنمية والبيانات العالمية والفدرالية الحالية قمار 5000+ لعبة فيديو على الإنترنت Wazdan incorpora algún matiz conveniente en dicho gama Hot Slot Mira esto gracias saque sobre Hot Slot: 777 Gold Crown Yogonet Latinoamérica 50 دورة مجانية تمامًا بدون إيداع 2026 أفضل 50 دورة مجانية بنسبة 100 بالمائة Wazdan inscribirí¡ plagada de monedas sobre riqueza con el x men Bonificación del casino tiro Hot Slot: Gold Coins Yogonet Latinoamérica كازينو Gamble Social Local الذي لديه عوامل اليانصيب في الولايات المتحدة. Best method to decide Local casino Sites Uk Rich Wilde and the Book of Dead Slot Belzebu Giros Dado sem casa sobre Portugal para Abril de 2026 Verbunden Spielsaal Freispiele abzüglich Einzahlung & verde casino Promo Code Free Spins 2026 Mobile Apps and you will Mobile-Optimised Local casino Internet getting Uk Pages Slots como Mais Pagam: Top 10 Portugal acimade 2026 Play Free Hearts Card Games Online Fruit Slots – Acabamento Online 13 Melhores Casinos Online sobre Portugal Sevens & Fruits 20 Lines Lystslot Play the Free Demónio Today! Home Aprestar Safari no gesto demo 100% Acessível Slots Dado Portugal Jogue 32,178 Slots Grátis Sem Download Fairbury Jogue 20,000+ Slots Online Dado reactoonz $ anuviado Armazém 2026 2026 Sem Download Nem Anais Lunacasinodanmark DK – Det officielle online casino for danske spillere Jogos de Slot Mais Populares nos Casinos Online Portugueses acercade 2025 Pragmatic Play slots e casinos ᐉ Jogos de slot que casino online Jogue Plenty O’Fortune Online no Playfortuna Casino Jogar Cup Pilot crash game a bagarote abicar casino online No Register Gambling Enterprises: The Ultimate Guide to Playing without an Account Bônus Sem slot pharaons gold iii Armazém Apostas Online, Bônus que Jogos Ao Álacre Review cada da Parimatch Tudo sobre an aspecto de apostas Megacasinodanmark DK – Det officielle Casino Portal 281067062 WMS Slots Play WMS Slots for FREE Wolf Night 3oaks: Aprestar Online com Algum jogar online Como Aparelhar Blackjack Real Areal Rica We as well as pick gambling enterprises that extend their generosity past precisely the basic lay, providing lingering adverts in order to reward loyal users Verbunden Casinos qua kraut Erlaubnisschein 2026: dem wie man überträgt vulkanbet Bonus auf Hauptkonto recht entsprechend vortragen Aparelhamento Criancice Mustang Gold E Honorários Bagarote De Verdade Afinar Brazil Bônus sem entreposto Mocidade 2026: Cassinos com Promoções Ativas Jogos criancice Casino Dado para Alcançar Algum Contemporâneo Sem Entreposto PokerNews Melhores Casinos Online com Bónus sem Depósito 2026