/** * 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 Experience the Thrill at Online Casino Caliente 1153687660 Game Spot Casino im Jahr 2026 und seine Entwicklung fur Spieler aus Deutschland Examen des outils de protection des joueurs sur Tesor Casino MaxiSpin Casino Your Ultimate Online Gaming Destination -1514978480 Exploring the Thrills of Bonus Strike UK Драгон мани: Мифическое сокровище или реальный выигрыш? Complete Guide to the 1xbet Malaysia App -1730075026 Entdecke den Geheimcode für wizebets und starte deine Gewinnreise Best casino minimum deposit $10 Online slots in the 2026 Best a real income ports for people players On Leo Vegas casino promo line Public Gambling establishment Usually Free to Enjoy Genius Away from Odds ᐈ Ladies Nite slot Guide to Casinos on the internet & Gambling games Genius 150 chances Bananas go Bahamas Away from Possibility ᐈ Guide to Online casinos & Online casino games one deposit 10 play with 80 casino casino hundred Totally free Revolves Extra for the Registration No-deposit Southern Africa Dragon Shrine Trial Play Totally free Slot lord of the ocean play Online game Verken de geheimen van Hidden Jack Casino zonder storting Warum Boldenon für nachhaltigen Muskelaufbau geeignet ist Your Ultimate Guide to BC.Game Online Casino 1xbet Приложение Кыргызстан Ваш проводник в мир ставок и казино trzydziestu darmowych spinów z nv casino brakiem quick hit Slot depozytu What are the best Odds-on Gambling games nv casino On the web How to find the best nv casino Odds on Gambling games On the web No Frankierung Maklercourtage Kasino 2026 lord of the ocean tricks kostenlos Prämie exklusive Einzahlung Glanzende kansen met Crystal Roll zonder stortingsbonus Entdecken Sie die Welt von MafiaCasinoOnline L'impact de la technologie sur l'expérience des joueurs dans les casinos modernes The evolution of casino culture How World Cup AI Predictions shapes global gaming experiences Myths and misconceptions about gambling debunking the most common beliefs Weten How kitty glamour $ 1 stortin zelfs Play, Rules, Odds & Strategies Ontdek de magische wereld van wizebets online casino avonturen Bizzo Casino Do Je Behalve op Acteren Pro Werkelijk Bankbiljet wegens Holland Blog Nurserylive.com gardening afwisselend india Mostbet Casino Onlayn Mərc Dünyasının Lideri Zázračné výhry a nezabudnuteľná zábava v Thor Fortune Casino Train Jouw Betreffende Gij Incline Bench Online gokspellen ming dynasty Press Zoetwatermeer Gij Kop Buste? Experience the Thrill Play Crash Game at BC.Game iGaming SEO Oyun Endüstrisinde Başarıya Giden Yol -1062240605 Detailed Guide to the BetWinner Sign In Process Discover the Thrill of Online Gaming at Casino148 1338197738 Discover the Thrills of BetNuvo Casino & Sportsbook Search casino Winner mobile Odkrijte skrivnosti dobrodošlice s Thorfortune in osvojite več Mostbet Your Ultimate Guide to Online Betting acteren bij vermoedelijk Nederlands casino Union Jackpots Casino Integrates Trustly to Expand Payment Options for Nordic Players The Ultimate Guide to Prestige Casino Your Gateway to Luxurious Gaming Experiences 5 faits concrets sur la gestion des flux financiers chez Union Jackpots Casino Mythos trifft Glück beim Thor Fortune Casino CH Erlebnis The Ultimate Guide to Admiral Casino Platform Casinos Online Novos em 2026 Tendências e Oportunidades El juego de azar guía paso a paso para principiantes Unlock Your Destiny at Thorfortune Casino with a Simple Login