/** * 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 Ontdek de magische wereld van wizebets online casino avonturen Mostbet Casino Onlayn Mərc Dünyasının Lideri Zázračné výhry a nezabudnuteľná zábava v Thor Fortune Casino 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 Unlock Your Destiny at Thorfortune Casino with a Simple Login Search casino Winner mobile Odkrijte skrivnosti dobrodošlice s Thorfortune in osvojite več Mostbet Your Ultimate Guide to Online Betting Weten How kitty glamour $ 1 stortin zelfs Play, Rules, Odds & Strategies Bizzo Casino Do Je Behalve op Acteren Pro Werkelijk Bankbiljet wegens Holland Blog Nurserylive.com gardening afwisselend india Train Jouw Betreffende Gij Incline Bench Online gokspellen ming dynasty Press Zoetwatermeer Gij Kop Buste? 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 Experience the Thrill at Online Casino Caliente 1153687660 Магия Dragon Money: Как драконы приносят удачу в онлайн-казино Betreed de wereld van goud met Goldbet casino vrijspelcodes 2026 Tips to have Psychological state Feeling Day 2026 Thorcasino entfesselt den Nervenkitzel des Glücksspiels neu Experience the Thrill of Prestige Casino & Sportsbook -1334135902 Experience the Excitement at 7Gold Online Casino Descubra os segredos avançados do jogo um guia completo para apostadores experientes Estrategias efectivas para gestionar tus finanzas en el juego Mythen über das Glücksspiel Was Sie wirklich wissen sollten Online of offline waar vind je de beste casino-ervaring Exploring Gambling Strategy A Comprehensive Guide from Legal and Reliable Betting Sites EU License Verification Iniciando en los casinos consejos indispensables para principiantes Best Real cash Web based casinos Top In-may 2026 Best Real cash Harbors to try out On the web 2026 Current Greatest Payment On-line casino Canada: Higher Paying Sites 2026 Top ten Casinos on the internet for all of us Participants for Could possibly get 2026 Better Online Black-jack Internet sites This week: A real income Blackjack Casinos Ranked 7 Finest Local casino Programs in order to Win Real money Get 2026 Pro Reviews Top Online casino A real income Internet sites in the us for 2026 The ultimate guide to understanding gambling A complete overview of ice fishing strategies Myths and misconceptions about gambling debunking the most common beliefs Mastering popular game strategies in gambling five tactics for success Her er en titel til en SEO-blog om casino for begyndere Finest United states Paypal Casinos 2026: Listing of United states Web based casinos With PayPal Mastering the art of strategic betting an advanced guide to gambling success The evolution of casino culture How World Cup AI Predictions shapes global gaming experiences