/** * 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 Blog Beyond » Casinoer The Invisible Man Video slot 50 Fr Spins På Reaktion Tomhe Forsikring Pr. Danmark A Journey Through Sunset Spins Your Ultimate Online Casino Experience $5 Deposit Gambling enterprises in australia which have marilyn monroe casino $5 Deposit Incentives Dolphin Reef Demo Slot Free Enjoy RTP: 95percent Steri Digger gräv besøg under asfalt som iSoftBets nya jagtslot 5$ Minimal Put Gambling enterprises ️ 5 dragons slot Better $5 Deposit Gambling establishment Internet sites 2026 No-deposit Bonus Requirements United states Confirmed Now offers August 2026 Free Spins Medmindre Indbetaling: Få vulkanbet download af login-app Fr Spins dags dat Instadebit casino Spin no deposit bonus Casinos The fresh 100 percent free Spins 2026: Current No-deposit Also provides Spillemaskiner på Nettet Idrætsgren 1221 reel kings $ 1 depositum Slots på SlotsUp Prompt, Safe & No-Financial slot online 88 Fortunes Dumps CasinoWow 100 percent free Slots Better Demonstration Slots and Free Slots 2026 Online casino Lucky88 slot sites Recommendations Tried & Checked out inside De bedste starburst Rigtige penge online slots, hvor fungere kan boldspiller fr eller foran rigtige knap 5 put bingo websites for United kingdom professionals 2026 Best Shell out Because of the Mobile phone Casinos 2026 Put because Bodog casino of the Cellular Statement Codeta Gambling establishment Review: Online game, Bonus, Financial and Assistance Fr amatic backgammon inferno jagtslot vulkanbet velkomstbonus ingen indbetalingsbonus Slots På 박지희심리상담센터 Better MachBetter Gambling enterprises in the 2026 casino Desert Nights bonus 270+ Respected MuchBetter Local casino Sites Transall Wikipedia Idræt fruit mania Spil slot Vederlagsfri Trolls Spil kort 2 Spilleautomat Super thunderstruck slot cheat Moolah Slot Online game Demonstration Gamble & Totally free Spins An informed Mastercard Casinos Best You Put Websites inside the 2026 Coyote Moon Spelautomat av IGT Spela gladiator slot Vederlagsfri Gratis Slots 2025 Web based casinos You to free cleopatra slots no download definitely Undertake Jeton Usa Real cash Internet casino 5,100 Welcome Extra! Real money Casinos to possess 2026 Play during the new casino slot games Real cash Casinos Free spins indtil spillemaskiner Idrætsgren high Mobilspil casino high societ slots plu slotmaskiner 2024 PlayOJO Gambling establishment Remark 2026 Is it Secure and Can it Spend Quick? Nye online spillemaskiner Idrætsgren fr nye ice casino tilbagetrækning spillemaskiner inden for 2025 20+ Best Bitcoin BTC Gambling enterprises and Playing Websites 2026: Recommendations and Reviews Idrætsgren $100 000 Pyramid slotspillet siden IGT gratis raging rhino Rigtige penge på Charge card Casinos 2026 Web based casinos You Queen Play casino online to Deal with Mastercard Megaslot Gambling enterprise Opinion 1000 Bonus, 77 FS Nye på spillemaskiner Idræt gratis nye spillemaskiner 50 ingen depositum spins dracula pr. 2025 Better United states of america Web based casinos August 2026: Greatest All of us Casinos Wicked Jackpots online casino bonus Rated Skuespil informativt indlæg fr herre-aktualitetsstof slot maskiner ved hjælp af ingen downloads Ignition Gambling enterprise Offers: Latest Bonuses and Exclusive Offers 2026 Better slot sites with Luna Park On-line casino Put Bonuses August 2026 Jack And The Beanstalk slots Online baccarat spil Jack And The Beanstalk slots Greatest Online casino games in order to Enjoy the real deal Profit 2026 Wager Free or Real money lost slot no deposit bonus 2026 Bingo Video game Arrival play slot Australian continent Enjoy A real income & Earn Big Jackpot Slots Online: Idræt I kraft af Ingen depositum casino bonusser Mulige Mega Rise Gevinster Obtain Samsung Odin Thumb Unit ladbrokes no deposit promo code All of the Types to own Windows 2026 CasiGO Gambling establishment Review 2026 2,800+ Game to experience! Pinterest 100 free spins no deposit casino sieger Wikipedia No deposit Bonus Gambling enterprises inside Canada 2026 Kasinobonusser 2025: Ingen indbetalingsbonus party line Hvordan determinati fungere den bedste udbetalingsbonus?