/** * 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 Royal Pine Local casino Greeting Incentive 2026 one hundred% up to $step one,100 Bing Play Store Obtain Android os APK Totally free 52 casino Rainbow Riches 0.21 Navigating King Casino Online feels surprisingly effortless from the first spin Test Post Created 100 Free Revolves No deposit Gambling establishment Incentives 2026 Queen from of those Nile Video slot Discover Our Opinion Totally free Revolves Casinos Winnings Real money to your No-deposit Position Video game Plexian Casino Registration Process Your Guide to Playing Online No deposit Harbors Allege 100 percent free Extra Codes & Winnings Real money! Wolverine On line Position Black-jack On the internet the real deal Currency: Top ten Local casino Internet sites inside 2026 I Price A knowledgeable Pokies On the web To play Today Greatest Zero KYC Wagering Internet sites 2026 Unknown Sportsbooks Greatest Cellular Slot Web sites & Position Programs for all of us People 2026 Most recent Bitcasino io No-deposit Bonus Review 2026 Updated Simple tips to Victory in the Slots On the web: 7 Info That actually work Highest Spending A real income Online casinos 2025 Professional Analysis 96% RTP Video game Better Web based casinos Australia 2026: Real money Gambling & Exclusive Bonuses a hundred Totally free Spins No-deposit 2026 Score one hundred FS To your Membership An informed on the internet pokies in australia to have 2025 Where to enjoy real cash pokies Best No-deposit Incentive Casinos in2026 No-deposit Extra Requirements Eksemestan (Exemestane) – Jak Stosować? A knowledgeable Android os Local casino Apps Playing Pokies Las vegas casino and have recommendations and you can message boards Enjoy Now from the Dual Twist Gambling establishment Finest Online Position Casinos in the us: Better Position Websites to own 2026 Greatest $5 Minimum Deposit Casinos inside the 2026 Ranked and you will Assessed Online slots Play Finest Slots Are Trial & A real income Ports Thunderstruck II Slot Games Trial Enjoy & Free Revolves ⭐Gamble Thunderstruck II Slot On the web the real deal Money or Totally free Finest Gambling enterprises, Bonuses, RTP Best 5 Pokies for real Currency on the High Profits Finest PayPal Online casinos for United kingdom Players Summer 2026 Top Cellular Gambling enterprises in the usa to possess 2026 Simple and easy Easy Finest £step one Lowest Deposit Casinos Uk 2026 Better Low Put Sites Cheats, Teachers and you may Walkthroughs because the 1998 Thunderstruck dos Slot Comment 100 percent free Trial 2026 Titanic Local casino Video game: Play Slot machine game On the web Better Online slots inside 2026 Real cash Slot Games Thunderstruck Demonstration Gamble Totally free Harbors in the Higher com Finest You Mobile Gambling enterprises 2026 Speed & Structure Rated Thunderstruck Insane Super Slot Regarding the deposit 5 rating 25 gambling enterprise 2026 Stormcraft Studios » Review + Demo Game Air-con DC’s Thunderstruck Called Most notable Stone Intro of the many-Day because of the Ancient-Music com Better 20 Web based casinos on the You S. Greatest Courtroom Real cash Gambling enterprise Web sites 2026 Thunderstruck a hundred free revolves no deposit incentives Slots Greatest Local casino Web sites the real deal Currency Rated Because of it Few days The Rise of Offshore Casinos A New Era in Online Gambling 2015896567 The way you use their, theyre there BBC Bitesize Within the , the Rio first started preliminary procedures off an electricity plant which may fundamentally bring forty % of your own property’s electricity CSI Harbors, Real money Casino slot games & 100 percent free Enjoy Demonstration Bei der modernen & zunehmend beliebten Auszahlungsoption Revolut selber hinein drei Stunden