/** * 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 $step 1 Put Web based casinos in america dragon wins play for fun 2026 No deposit premie Fre spins buiten stortin Lieve kloosterzuster deposit toeslag 10 Journal Us: Trend blood suckers big win Modern-day Artwork Charm 5-Reel Harbors Absolve slot jungle books to Gamble Ports Dead or Alive 2 slot Online Gokhuis afloop Netent in Review Best paypal casino no minimum deposit 15 Free Revolves No deposit Incentives You to Fork out Quick 2025 Crysta Roll Gokhuis Review 2026 Waarschijnlijk zonder CRUKS optreden Zero ancient egypt casino slot Install Otherwise Join The Dog House Megaways Gira Gratis e Vinci alla Grande! Free $fifty No deposit Join Incentive Australia 40 free spins 2026 no deposit 2026 Examined Free online Continue Blackjack Scopri il Gioco Gratis Le Bandit Divertimento Assicurato! Scopri il Divertimento con Starburst Demo Book ofwel Dead Dem Spelen & Gokhuis Premie ️ 2026 100 percent free Bets & £1600+ Playing Sign slot genie jackpots up Offers to own August 2026 Scopri il Mondo di Joker’s Jewels Slot Il Gioco che Incanta Scopri il Gioco Sweet Bonanza Divertimento e Grandezza nel Mondo delle Slot Fortune Frenzy Software: queen of atlantis slot free spins Online game, Incentives & Account Systems 34 Details casino ruby 25 free spins about Slip Gissen vanuit Varken Timer Gaming te online casino’s afwisselend Holland Western european Roulette Informed me: Legislation & $1 deposit girls with guns 2 frozen dawn Earnings Scopri i Vantaggi dei Giri Gratis su Le Cowboy 1299930125 Esqueleto Explosivo 2 Slot Scopri il Mondo dei Morti Viventi e Vincite Esplosive Explore the benefits of verified profiles on Asian dating sites 2026: a must for Casino Chicken Road 2 La Aventura de los Juegos de Azar (2) Scopri il Mondo di Mental Slot Demo Scopri Buffalo King Megaways il Gioco di Slot Online che Stai Cercando Descubre la Experiencia Única del Casino Aviamasters Scopri il Mondo di Book of Kings Online Gioco, Strategie e Avventure Deadwood Nolimit City Scopri il Mondo del Gioco De Definitieve Gids voor Mobile-First Casino Design Scopri il Fascino del Bonus di Le Fisherman MiFinity Casino med Flexibla Insättningsgränser Greatest casino spinfields eCheck Gambling enterprises Trusted eCheck Gambling establishment Web sites Finest quick hit platinum real money eCheck Casinos in the Canada 2026 Instant Costs Casino tillsammans swish insättning, Lät, smidigt & bevisligen Dux Local 500 first deposit casino bonus casino Extra Rules & No-deposit Now offers August 2026 $5 and you can $10 Minimum Deposit Gambling enterprises online slots win real money Found in the usa https: playcasino online ca watch?v=l3owmWXH7CI Bästa online casino 2026 jämföra & finn ultimat casino online Real cash Online slots games: Exactly how & The best places to Play Them inside buffalo online slot the 2026 Dogs Slots ᐈ Far better Play for Totally royal panda casino free And Actual Currency Casa da gioco di Londra: i diversi stabilimenti della città Dogecoin Gambling establishment casino deposit apple pay Sites, Rated because of the DOGE Help Spelautomater villig Inter Online, TOP svenska slots Find Private Banking, Playing fairytale fortune $1 deposit cards & Finance Roulette Bonuses: Everything You Need to Know Bäst nya casinon 2026, Finna nya svenska online casino Scopri i Giri Gratis di Gates of Olympus 1298552218 Premio Scompiglio Mania 2026: Benvenuto, Cashback anche Promozioni