/** * 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 Swimsuit Team Demonstration because of the PlayStar Game Review & Free Position Finest Bitcoin Gambling enterprises play Go Wild slot To experience At the Within the Sep 2025: Greatest Crypto Casino Websites, Checked To possess Security & Protection Free internet games during the Poki Gamble Now! Review: Large Bad Wolf to set up $step one deposit « Take the sun: Hope » The web Place to go for Progressive Tunes! Apple Spend Pokies Australian continent 2026 Immediate Deposit January 2025 Development Archive: List of news reports fromJanuary, 2025 100 percent free $100 Gambling enterprise Processor No-deposit 2026 Better On line Pokies Australia 2026 Best Games to experience Greatest The brand new Online casinos in australia Most recent Casino Web sites 2026 Finest Gambling enterprise 100 percent free Revolves Incentive 2026: Claim 100 percent free Revolves No deposit PayPal Gambling enterprises 2026 Better Web based casinos acknowledging PayPal Better Casinos on the internet Australia the real deal Currency 2026 King of your own Nile Harbors Online Slots Gamble Casino games On the web for the Pc & Mobile Totally free 20+ Best Bitcoin and Crypto Casinos and Gaming Internet sites United states of america 2026 They are Best A real income Casinos on the internet in the Canada In respect to Pros Totally free Slots On line Play 2,450+ Online slots enjoyment at the Slotorama Spilakassar á netinu! 6 Best Support Apps during the Web based casinos July 2026 Ókeypis bónusar án innborgunar hjá Play'n'go spilavítum 2022 Finest Western Along with Games Container 777 No deposit Extra: $ten Totally free Gamble & Sign on Publication Better Online Pokies Websites around australia July 2026, Upgrade The brand new Caesars Castle Internet casino promo code ALCOMLAUNCH: $ten no-deposit incentive al com Better Commission Online casinos to have Highest RTP Online game within the July, 2026 Better gambling games you to pay a real income within the 2026 al com 100 percent free Fire Maximum Apps online Enjoy Finest Commission Casinos https: view?v=gmCZtbKfHQ4 Dunder Local casino Comment and you may Extra Code within the 2026 Finest Casinos on the internet Usa 2026: Real money Courtroom Gambling enterprise Web sites Uk No-deposit Incentives 100 percent free Spins and Sign-upwards Offers 2026 Greatest Slot Games On line Leading Casinos Bhutan Broadcasting Service BBSCL Chance Calculator and Playing Opportunity Converter Bet Calculator Simple tips to Win in the Slots Online: 7 Resources That really work The brand new Religious Meaning of Noah: Understanding the Symbolization Behind the fresh Biblical Tale Noah Metaphysical Meaning PDF Test Novel Items Kinds Online casinos Us 2026 Checked & Ranked Gambling because of the Pond to your Eyes away from Horus Megaways to possess Warm Days 1xbet Pakistan Your Ultimate Guide to Sports Betting and Online Casino Greatest Instantaneous Payment Casinos Australia 2026: PayID & Crypto Harry Kane gambling provide: Score 40-step 1 to possess a shot against DR Congo No-deposit Pokies Incentives July 2026 Finest Live Dealer Casino Websites inside July 2026 Dragon Shrine Slot Forklift Rental Philippines Australia’s #step 1 On-line casino Guide 2026 BetOnline Cousin Web sites: An entire Opinion NDBC and The newest No-deposit Personal Bonuses 2026 350+ Online slots Best Quick Commission Online casinos Australia 2026 Immediate Detachment Websites Top 10 Sports betting Software 2026 Provides, Bonuses, & Far more Enjoy 21,750+ Free online Gambling games Zero Install