/** * 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 Trusted Reviews and Reviews mBit Local casino Signed up Crypto Site and no Deposit Give Experimented with & Tested 3 Aztec Temples Demo Gamble Position Game one hundred% Free Play 19,350+ 100 percent free Position Game Zero Install Cudownie Jackpot Party slot zagraj darmowo bądź na finanse Mayan Princess Winners, Analysis and better Casinos Greatest $5 Minimum Put Gambling enterprises Us 2026 Slottyway Instantaneous Play: Prompt Internet browser Use of Greatest Games Τα Καλύτερα Διαδικτυακά Καζίνο για Απίστευτη Διασκέδαση 7Bit Bitcoin Gambling establishment: Play Greatest Online Crypto Gambling establishment which have BTC Bitcoin Betting Finest On the internet Pokies in australia Real cash 2026 Darmowe spiny wyjąwszy depozytu TOTALbet w polsce Kwiecień 2026 Online slots games the real deal Currency Greatest Online slots games 2026 100 percent free Harbors during the Harbors Empire Claim Trial Revolves & Incentives Bezpłatne bonusy Nitro Casino online Free spiny wyjąwszy depozytu w całej kasynach przez internet Finest Free Spins Casinos July 2026 No-deposit Ports Demo Immortal Romance od chwili Games Jackbit Global Zagraj w wykonywane Bezpłatne AutomatyImmortal Romance to uciecha, która pozyskała wielką moda pośród zawodników dzięki swojej wciągającej fabule oraz wyjątkowym funkcjom bonusowym Stock exchange Look Zacks Money Research Zodiac Gambling enterprise: Punctual and you will secure payments to have Canadian people Greatest PayPal Gambling enterprises in the united kingdom Summer 2026 Checked & Affirmed Australia Gaming Legislation 2026, Au Betting Regulations Echtgeld Casinos 2026: Top Anbieter mit echtem Payout im Test Explore Love Casino 4 Your Ultimate Casino Experience On-line casino Ratings Better Top On-line casino Sites 2026 by Getb8 Rickycasino ️ Authorized On the web Сasino Gratis spins inschatten Starburst buiten stortin Land van no deposito free spins Playing, Sounds, and Eating in the Miami Gardens, Fl No-deposit Bonus Finest Casinos on the internet Australia: BitStarz Crowned Since the Best Real money On-line casino Site Within the 2025 to possess Aussie People WMS bank games Carousel Kosteloos performen! ScratchMania Incentives: Welcome Extra, 100 percent free Spins & Much more Ariana Position Review 95% RTP Microgaming 2026 Slovenské Online Kasína Vaša cesta k zábave a výhram -2103498375 Allen offlin casino’s over Casino Magic eigenlijk poen ervoor performen om NL Greatest Online casino Australia » Au A real income Casinos 2026 Check in so you can Red dog Gambling establishment: Unlock Incentives & Best Ports Today Better Casinos on the internet 2026 Finest 5 slot games super duper cherry Real money Websites Analyzed Die Synergie von HGH und Steroiden: Ein Blick auf ihre Kombination Luxor from $15 Las Vegas Albergo Deals & Reviews Bingo Offlin Scooore Acteren voor Strafbaar met uitbetalin? JACKS NL Greatest Casinos on the internet Australia Best Aussie Internet sites to own 2025 JasmineSlots 100 Free Revolves No deposit Gemini Joker July 2026 Online 40 free spins no deposit bonuses casino Slot machines Play for Totally free Ariana Casino Video game Comment BetMGM Where you can Play Online Roulette the real deal Currency No deposit Incentive Codes 100 percent free Potato chips & Spins Dizionario Dei Termini Da Bisca Contro Guidagiochicasino com trovi le migliori codifica sui giochi da casa da gioco! Dunder Local casino Extra Codes Incentive Codes 2026 Verified Invited Now offers enjoy Ports on the internet at no cost Gioca, Vinci alla Intenso anche Goditi un RTP del 98%