/** * 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 Syndicate Gambling establishment Incentive Codes August 2026 To A good$1,three hundred, two hundred Free Revolves More twenty five totally free spins for the registration no deposit British casinos Totally free Spins Casinos Win Real money to your No-deposit Position Games Totally free Revolves No deposit Said, Checked & Ranked to have 2026 Finest Free Revolves Gambling enterprises 2026 Valhallacasinoofficial DK 2026 Din Ultimative Spiloplevelse -1864663718 100 percent free Spins No deposit Best United kingdom Ports Incentives Greatest Totally free Spins Incentives inside the SA 2026 Allege No deposit Spins twenty-eight The new No deposit Added bonus Rules For Aug 2026 Upgraded Every day Better 100 Totally free Spins Bonuses 2026 No-deposit & Quality Also offers Opdag Magien ved Mrplaydk DK – Din Ultimate Spilleoplevelse Opdag Magien ved Mrplaydk DK – Din Ultimate Spilleoplevelse Top ten United states of america Web based casinos the real deal Currency Playing within the 2026 Slottyway Local casino Added bonus Codes August 2026 Up-to-date Everyday Slottyway Casino Greeting Extra: 200% Match, 60 Revolves United states No-deposit Incentive Casinos on the internet August 2026 The fresh Incentive Slottica Gambling enterprise: 50 Totally free Revolves No-deposit Gamble Online slots games & Gambling games United states No-deposit Incentive Casinos on the internet August 2026 The newest Incentive 100 percent free Harbors 100 percent free Gambling games On the internet Entire world 7 Casino No-deposit Bonus Rules & Promotions 2026 Get your No-deposit Codes No deposit Added bonus Rules August Monthly Competitions Play Now On the web 100 percent free Pokies That have Bonus Cycles Exclusive Cellular App Ports Enjoy Raging Rhino because of the WMS free of charge to the Casino Pearls Twin Twist Position Online game Demonstration Gamble & Free Revolves Slot Globe Gambling establishment Opinion 2026 Incentive & Get Globe 7 Casino No deposit Bonus Codes & Promotions 2026 FaFaFa Slot Play Online 100percent free or Real money Phoenix Sunlight Position: Tips, Free Spins and much more ten Greatest Online casinos Real cash Us Aug 2026 Totally free Harbors One to Shell out A real income 2026 Enjoy Free online Harbors FaFaFa Slot Play On the internet 100percent free otherwise Real money 10 Greatest Real money Casinos on the internet to have United states Players inside 2026 Play twenty-four,000+ Online Gambling games No Download Gold Oak Gambling enterprise Bonus Requirements for August 2026: 260%, 35 Totally free Revolves Gamble 24,000+ Online Casino games Zero Download Local casino Sieger Local casino Remark Scam or not? Casino Added bonus Codes 2026 Greatest Casino Coupons Heavens Vegas Casino Bonus August 2026: Get 200 Totally free Revolves & fifty No-deposit Totally free Spins Play Safari Sam Online in the Las vegas Aces Gambling establishment Insane Crazy SAFARI Position Game play On line the real deal Currency Claim $step 1,two hundred & Daily Revolves A knowledgeable Real cash Online casinos 2026 Local casino FreeSpins & No-deposit Bonuses January 2025 Effective People Online gambling Community forum Best Paysafecard Casinos 2026 Paysafecard Places Better Web based casinos for real Currency: 10 Sites playing Online casino games Casino FreeSpins & No deposit Incentives January 2025 Productive Participants Gambling on line Message board ten Better Casinos on the internet A real income United states Aug 2026 Enjoy Free Position Games On line no download, zero membership Orient Share Casino Remark $ten no deposit added bonus, 150 Totally free Spins