/** * 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 Free Spin: A Guide to Winning Large on Online Port Machines Online Casino ohne Limit 2026: Sicheres Spielvergnügen mit MGA Lizenz Checking out the Globe of Offline Slot Machines: An Ultimate Guide Tout sur Un bonus de bienvenue qui dépasse les 200 % What you’ll secure after signing up at NineWin Casino UK Ανακαλύψτε Εισαγωγή – Ξεκινάτε με το Pistolo Casino στην Ελλάδα Casino Tiradas Gratis sin Depósito Todo lo Que Debes Saber Discover the Exciting Globe of Online Slots What Any Player Must Understand Concerning Casino App Security Features Maneki Casino Android App Casilando dolphin reef slot free spins Casino Comment & Overview: Bonuses, Payouts Claim Their slot black hawk Personal NZ Incentives Calvin Casino: 200% slot james dean as much as 200, 150 Revolves Secure Deposit cats and cash free spins & Detachment Book £5 Dumps Gambling enterprises UK’s Best Gambling establishment Web sites, Harbors 40 flaming lines slot machine Now offers 2026 10 online video french roulette low limit Greatest Bitcoin Casinos Us 2025 Finest Crypto Local casino Websites 400% fairytale fortune symbols Gambling establishment Incentive 2026 Deutschland Better Gambling establishment slot online nrg sound Extra Offers to own 2026 Allege Real cash Bonuses Greatest Casino Invited Added andre the giant slot free spins bonus Offers to possess August, 2026 More $1000 Gambling establishment Bonuses: Types, Terms and moonshine slot free spins ways to Contrast Her or him Better All of us No-deposit Incentives 2026 100 percent free magic fruits 4 slot machine Cash, No Credit BetMGM Casino Bonuses & Promotions The play black jack pro series low limit online money way they Performs BetMGM Top phoenix fire big win Gambling establishment Betting Publication to have 31+ Decades Betway Real time Gambling enterprise Opinion 2026 Bonuses, Games & mr bet app download Resources Betsson Mobile casino lucky wizard Wagering App Enjoy casino orion twenty-four,000+ Online Online casino games Zero Obtain 75 The newest No deposit Added bonus Codes For Aug slot fruit mania deluxe 2026 Upgraded Each day Subscribe BetChain Local casino No-deposit Extra Requirements 2026 blackjack classic online for fun 100 percent free Video game Minimal August 100 percent free Processor chip Finest Internet casino 100 percent free neon fruit cityscape slot sites Chips Usa August 2026 Aztecs Many Harbors top justforthewin games Enjoy Free Slot machine Better Gambling establishment big top slot Applications the real deal Currency 2026 Best real cash local journey of the sun slot machine casino programs August 2026 al com Best Real money Online casinos in the kings of cash slot machine usa August 2026 Casino Action has the Wizard’s Close inside uk online vegas single deck blackjack and slots the 2026 step 3 Incentives Free online Slots: Enjoy Local casino Slot machines enchanted meadow no deposit For fun Totally free Revolves pokies games online Incentives Greatest 100 percent free Revolves Casinos within the 2026 Gambling establishment Step Bonuses in classic bally wulff slots the Canada 2026 Greatest 10 Zero-Deposit Local casino win money instantly Bonuses for brand new Players inside the 2025 Free Spins Bästa Casinon and Allting n Behöver Klara av Best No deposit Bonus Gambling enterprises in2026 No deposit Added kitty cabana casino bonus Requirements Christmas: Holiday Life and you may Presents The newest 500 Free Revolves No-deposit 2026 ️ Over Checklist fifty 100 percent justforthewin slots online free Spins No-deposit Canada Upgraded in the August 2026 Exactly about five hundred Totally free Revolves Incentive Now offers! 24bettle Casino Opinion dragons rock $1 deposit 2022 & 240 EUR, 240 Free Revolves Free Revolves And no Put & Zero Betting Requirements 2026 Better Offers August 2026 ten Greatest Web based casinos A real income Usa jade connection slot Aug 2026 Join Bonus Certified Web site Just what are Betting Criteria within magic hot 4 online slot the Casinos on the internet? Said Simply