/** * 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 Trendy Fresh fruit Position Strategy to the Ports Would you Increase Possibilities of Jupiter Club 100 100 percent free spins gambling enterprise no-deposit Progress ? Consuming Interest Position by Video game Global Play Free Trial Ramesses II biggest no deposit casino bonuses Wikipedia Crypto Casinos: Ratings and Publication 2026 Book away from Ra Play the Slot for real Money The newest UK’s Finest £5 Put Local casino Sites to have 2026 Drück Glück Gambling enterprise 100% Added bonus Give Crazy Orient Finest On line Slot Ratings inside the Canada 2026 Ramesses isoftbet slot machines games II Wikipedia Top 10+ Bitcoin Casino No deposit Bonuses in the 2026 Lb Sign Icon £ Real cash slots Greatest Crypto Casinos With Quick Withdrawals within the 2026 $5 Deposit Gambling enterprise Incentive Greatest Minimum Money Also provides to possess 2026 Big Bad Wolf Slot machine game Is Quickspin’s Position Demo which have 97 35% RTP Totally free 5 Dragons Slots Aristocrat Online Slots cuatro A means to Defeat the newest Ports Raging Rhino golden ticket $1 deposit Position Video game Trial Enjoy & Free Spins one hundred Free Spins No-deposit Southern Africa 2026 Confirmed Gamble Online casino games within the Pennsylvania which have FanDuel Gambling establishment Casumo Gambling establishment No deposit Free Revolves Incentives 2026 Incentive Get Ports On gate 777 contact in nz line 2026 How Extra Expenditures Performs & Better Online game ten Better Online Pokies in australia Games, Punctual Payment Casinos & Information Greatest Web based casinos Canada 2025: Top ten Canadian Local casino Internet sites Top 10 Internet casino Real cash Websites in america for 2026 High Payment Web based casinos inside the Canada to possess 2026 Wizard Of Possibility ᐈ Self-help guide to Web based casinos & Gambling games Rating 6M 100 gold factory mobile slot percent free Gold coins Greatest Real time Roulette Internet sites 2026 United kingdom Real money Roulette Internet sites Better 10 Money Deposit Casino Internet sites inside 2026 Bally Bet On-line casino bonuses | 4.dos / 5 5 Finest Crypto Casinos: Best Bitcoin Local casino Websites for Fast Payouts & Instantaneous Withdrawals to understand more about in the 2025 Summer Modify Betzest Local casino No deposit Incentives 2026 Finest Meaning, Definition & Synonyms Quick Detachment Casinos 2026 Greatest Punctual Commission Gambling enterprise Internet sites Best United states Online casinos 2026 Tested, Rated & Analyzed Iron man dos A knowledgeable Mobile Local casino Publication On the internet 50 Totally free Spins No deposit Better 2026 Redbet casino games subscription now offers Better Online casinos inside the Canada 2026 Real cash Gambling establishment Picks Absolute Rare metal Slot: Free ice casino app apk download Enjoy in the Trial Form Greatest Gambling establishment Apps you to definitely Pay Real money Better ios & Android Selections Greatest Quick Withdrawal Gambling enterprise around australia Quick Earnings 2026 ten Better Online casinos Real money United states of america Jul 2026 Finest $5 Minimum Put Casinos Reasonable Gaming 2026 Horseplay bar bar black sheep slot free spins Promo Password 2026: SBRBONUS for as much as $250 Opinion and Low Betting Incentives Here! fairly Wiktionary, jurassic world $5 deposit the new totally free dictionary Better 5 Dollar Deposit Gambling enterprise within the NZ inside the 2026 Top 10 On-line casino Real money Internet sites in the us to have 2026 Payid Pokies No casinos4u contact deposit Incentive Australian continent 2026 Allege Hunter Valley Bike Middle