/** * 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 three dimensional Harbors: Have fun with the Best 3d Position Game On line Dead or Alive dos Slot Comment and Trial Más grandes lugares sobre ruleta en avispado: crupieres reales desplazándolo hacia el pelo acción con el pasar del tiempo recursos favorable online Dead otherwise Live 2 position remark Truthful, hands-to your verdict Online Ports: Enjoy Local casino Slot machine games For fun Live22: proveedor sobre juegos de tragamonedas en camino Impress Me personally Position: Added bonus Rules and Resources Dazzle Me personally Totally free Revolves Selling for real Money 2026 Sobre cómo escoger la mejor microSD para cual su smartphone vuele Da Vinci Diamonds Twin Play Trial by IGT 100 percent free Position and Video game Opinion No deposit Incentive Rules 2026 10 Deposit Local casino Sites NZ Greatest Bonuses for ten Cash Da Vinci Diamonds Twin Play Remark 100 percent free Gamble otherwise Real cash Greatest Gambling establishment Software 2026 Finest Cellular Gambling establishment Sites in america Tratar a +39,712 Tragaperras Regalado sobre España Da Hong Bao Gold Position: Wager Totally free, Remark, Casinos Listing All the Ports Funciona 500+ tragamonedas sin cargo falto registrarte Cuckoo Slot: 100 percent free Enjoy inside Demo Mode Greatest Online casinos Canada in the 2026 the real deal Money Betting Demo sobre Kitty Glitter por IGT Hace el trabajo a las Tragamonedas GratisKitty Glitter serí­a algún entretenimiento muy conocido dentro de las practicantes para gatos, mediante sus encantadores gráficos así­ como emocionantes propiedades de descuento Interior and Additional Painting for every Area Avalon On line Position Free Demonstration + Video game Remark 2026 Excelentes Viviendas de Apuestas Con Bonos Falto Depósito sobre 2026 Free online games and Play Today! Greatest On line Craps Casinos for real Profit All of us Better 150+ Gambling enterprises with 3 hundred% Incentive United states of america 2026 Cool Gems Trial Harbors from the White and Question Comment and Totally free Enjoy Cosmic Chance Position Opinion 96 9percent RTP NetEnt Modern Jackpot Tratar regalado en Golden Ticket by Oryx Gaming sobre manera demo Better 100% Gambling establishment Incentives 2026: List of 100% Put Incentives Chill Gems Position On the internet Wager Free No deposit Free Spins Gambling enterprises 2026 Play 100 percent free, Victory the real deal Vacation Station Deluxe Demo sobre Playtech Sus particulares y Tragaperras Gratuito Specialist Sports Picks and Forecasts Best Non UK Casino Sites A Guide to Top Online Gambling Options Cleopatra Along with Slot because of the IGT Gamble Ripple Craze Position: Opinion, Casinos, Extra & Videos Cleopatra Totally free Harbors Play Casino Video game On the web No Install Novedosas Tragamonedas Gratuito 2026 Slots Recién Lanzados Gambling establishment Vintage Coupon codes August 2026: 40 Free Opportunity, 100percent As much as two hundred Asia Wikipedia Juegos Gratuito Online sin eximir Play Boom Brothers Harbors On line Chinese New-year Gambling establishment Offers Told me 2026 Chinese Alphabet: Chinese Letters, Signs and Pinyin Book Juegos De balde online acerca de CrazyGames ¡Funciona Bien! Free Publication out of Ra Luxury Slot Finest step one Lowest Deposit Gambling enterprises 2026 Start by Merely 1 Juegos online sobre casino gratuitos