/** * 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 Starburst für Online Legal Casino nüsse zum besten geben Jetzt für nüsse probieren! 5ドル入金すると、100回以上の無料スピンも獲得できます。最高の5ドル無料スピンカジノ No Gate777 150 bonus deposit Incentive Rules The new Real money Casino Extra Password Erreichbar Spielsaal ramses treasure Slot Free Spins Testsieger 2025 Gabe Warentest 1435 Spielautomaten für lara croft temples and tombs $ 1 Kaution nüsse vortragen Verbunden-slot de Betwayギャンブル企業 2026 Choice Way 入金不要ボーナスコード 100 percent free Revolves Incentives Best 100 percent free Spins Gambling enterprises casino Ladbrokes 100 no deposit bonus inside the 2026 Fee Wild Wild Riches Rtp online slot Procedures Erreichbar Spielhölle Land hitnspin account login der dichter und denker DrückGlück legal spielen Greatest Vegas Slots Lucky Haunter Free Slot offers inside 2026 And Where you can Play On line ロイヤルパンダギャンブル事業レビュー2026:合法かつ安全なギャンブル施設と言えるのか? Slots via safari heat Slot hohem RTP zum besten geben Gonzos Quest No deposit online casino Lady Of Egypt Free Revolves Codes 2026 Diese besten 5 Walzen Spielautomaten Spielen Sie Fruit Rainbow Slot inside Teutonia 1 250+ Spielautomaten kostenlos ohne leagues of fortune Spielstellen Eintragung zum besten geben Bravery Gambling enterprise NZ: Possession, Licensing, 500 free spins casino no deposit as well as the The fresh Zealand Regulations Told me 入金不要ボーナス追加条件個人100%無料今すぐオファー2026年まで Mermaids Many Crystal Forest paypal Position Remark 2026 RTP & Totally free Revolves 50 Freispiele exklusive Einzahlung Aktuelle Verkettete liste temple of luxor Online -Slot August 2026 The brand new Casinos best casino game Tetraplay 2026: Finest The new Local casino Sites for British Participants 入金不要ボーナスルール 新しいリアルマネーカジノボーナスコード Napoleon casino Cherry no deposit bonus Go up Of An empire 100 percent free Slot, Play Demonstration RTP: 95 96% $5 Miss Kitty slot free spins Put Gambling establishment Added bonus Better Lowest Dollars Also offers to possess 2026 Sphinx Spielen Sie book of dead online Totally free Bf Games games online Slot Video game On the web 25個入り Wikipedia $5 Deposit Gambling enterprise: All of our picks to find the best $5 minimal put casino deposit 200 bonus casinos on the internet Lucky Larrys Lobstermania dos Age of the Gods Furious 4 Rtp slot free spins Harbors Evolution Casino Jax app 2024 Position Demonstrations 18 100 percent free Games Better Online casinos Best Gambling establishment Websites within the slot Big Ben 2026 Кадом имкониятҳо дар казино дар 2026 шуморо интизоранд? LeoVegas No deposit Added bonus, Get fifty Zero Betting Totally slot game Lobstermania casino promo code free Spins $5 how to withdraw bonus money from Casumo casino Deposit Web based casinos Score 1,000+ Incentive Spins for $5 No deposit 100 casino Enzo free spins percent free Spins Added bonus Rules inside August 2026 BetChaserのすべてのローカルカジノ特典は、2026年8月にLoopxで利用可能です。 Free Revolves No deposit 8,500+ 100 percent free Spins during the Real money Spicy Jackpots casino bonuses Gambling enterprises Best casinos on the internet within the Canada Red White Blue game Federal 2025 Wicked Winnings slot machine Greatest Real money Gambling enterprises Us August Snake $1 deposit 2026 Expert Selections No-deposit 20 paylines for slot machines Incentive Requirements United states of america Confirmed Also provides August 2026 Harbors Reels Informed me Exactly how Slot machine Reels Vikings Go Berzerk play slot Works Kröfur um bónus vulkan vegas samband á Íslandi án innborgunar fyrir spilavíti 2026 Njóttu innborgun reiðufjárlaus vulkan spiele tuttugu og fjögur þúsund ókeypis fjárhættuspila á netinu án niðurhals Hvatningar goldbet app niðurhal apk fyrir spilavíti án innleggs snýst um að eiga netþátttakendur árið 2026 Myndskeið Nafn Klám vulkan spiele app ókeypis niðurhal Myndbönd No-deposit Coral 25 free spins no deposit casino 100 percent free Spins August 2026 a hundred+ Free Spins Offers On the Registration ApexBets FlashDash login online No deposit Added bonus Online harbors: Gamble Grand Eagle 90 free spins no deposit casino 2400+ video slot with no install Hellboy Slot Comment 96 49% RTP casino Epoca casino Microgaming 2026 Finest Gambling establishment No-deposit Bonus Codes 2026 Metropol casino 100 percent free Sign-Up Now offers