/** * 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 Dr Bet Casino Comment 2026 Analysis, Bonuses go & Game Lucky Days Casino Deutschland 1 000 + 100 Freispiele Finest Free Spins No-deposit Bonuses to possess 2026 Win Real money 2 000+ Spiele, Bonus & Sicherheit Greatest Online promo code for betfred casino slots games 2026, Guide to the best Slot Video game Lizenziert and Vertrauenswürdig Aufführen White Lion Casino Diese damit Echtgeld Better No-deposit Extra Pokies around n1 casino australia 2026 Lucky Days App Brd Gebührenfrei ausrollen Internet casino Bonuses Greatest Incentive Internet sites August 2026 Best Pokies Web sites 2026 Real money Sites casino cryptowild sign up Checked Jackpot Piraten Casino Deutschland Boni & schnelle Auszahlungen Better No deposit Totally free Spins buffalo free 80 spins Added bonus Requirements August 2026 UL 60335-step no deposit 200 free spins 1 De Immerion casino iphone app bedste betting og kasino sider 60 Freispiele Book of 24 Casino login app download Dead bloß Einzahlung Traktandum Angebote 2026 Finest Web based casinos casino Wild Chase the real deal Cash in 2026 17 Greatest Totally free Spins Casinos No Put Extra Requirements 2026 The brand new Casinos on the internet August 2026 Dunder Spielsaal Erfahrungen 250 Bonus Die besten Bitcoin Casinos verbunden Traktandum 10 2026 Book from Deceased Harbors Free Enjoy 135 Totally free Spins No deposit Best Real cash Casinos on fa fa fa slot android the internet in the August 2026 As part of diesen Live Blackjack Casinos auf jeden fall & dem recht entsprechend online zum besten geben Her kan man anbelange trinocasino casino spillemaskiner eksklusiv indbetaling Best Internet casino Analysis 2026: lobstermania slot machine Leading Casinos on the internet 100% Deposit Added bonus Also offers August 2026 Hot Number LeoVegas Review 2026 10 Best Invited Extra Panda King slot free spins #step one Best Welcome Bonuses 2026 Bedste Tilslutte Casinoer inden for Dannevan Bruce Bet kampagnekode 2026 Top 10 Testet Spielbank Maklercourtage exklusive Einzahlung 2026 Beste No Anzahlung Boni 100 percent free Revolves Gambling enterprises Winnings Real cash to the No-deposit casino Wish Bingo mobile Slot Games Better Online slots games & Uk Position Web sites to have 2026 KLICKEN Deutsches Rechtschreibwörterbuch PONS £step 1 Minimal Put Casinos British 2026 Real £step 1 casino loki no deposit bonus Gambling enterprise Sites Beste Paysafecard Casinos via 400 Prozentzahl Willkommensbonus Rigtige gevinster hver afregningsdag kritisk link Idræt banko 10 Finest Casinos Big Red online on the internet Australian continent the real deal Currency Playing inside the 2026 10 Finest Online slots games the real deal Money Gambling enterprises playing inside 2026 Süddeutsche Nun unser knabe Magazin das Süddeutschen Zeitung Bonanza Slot video poker online games Remark 2026 Enjoy Demonstration Games free of charge Best A real income Online casinos Top Inside the August 2026 das die das Schreibung, Begriffsbestimmung, Bedeutung, Wortherkunft, Synonyme, Beispiele fifty Totally free Revolves No deposit Necessary Promotions inside treasure nile slot machine the 2026 Online bonus Ybets Casino Find Bedste Danske Tilslutte Casinoer 5 Best Mobile Web based casinos inside the 2026 Minibagger kaufen & liquidieren innovativ und gebraucht within Österreich Deposit casino fafafa £5 get Added bonus Web based casinos Us 2026 Tested & Rated Casinos via hohem RTP 2026: Beste Auszahlungsquote Duffspin Casino Adds Five New Live Dealer Blackjack Tables To Its Lobby