/** * 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 Greatest Sign up Bonuses to have On line Gambling: Your whole Book The fresh 30 Free Revolves No-deposit 2026 Complete Listing DraftKings Signal-Right up Added bonus: Choice $5, Get $150 Incentive In this 2 weeks BetOnline Promo Password: Play with Code SUPERBET to have $250 Totally free Choice BetOnline Coupons to own July, 2026 Sports, Gambling enterprise & Poker BetOnline Promo Password & Bonuses to have July 2026 Better sportsbook promotions: July 2026 sports betting incentives and you may coupon codes BetOnline Casino Extra Rules & Offers 2026 Danger High-voltage II Slot: Shock Your path to help you Huge Wins Better Percentage Procedures Professionals Like in the Online casinos Double Da Vinci Expensive diamonds Ports Enjoy 100 percent free Slot machine game Difference in Float and you may Double Install the newest quick, secure internet browser from Bing Casino Enjoyable Install the brand new APK out of Uptodown Dolphin’s Pearl Deluxe Slot: 100 percent free Enjoy Game Zero Download Novomatic Gamble Double Da Vinci Expensive diamonds Position: Opinion, Casinos, Added bonus & Movies Enjoy Dolphin’s Pearl Slot from the Novomatic 100 percent free Spins, Wilds, and you will Oceanic Incentives Wasteland Value Slot remark Has, RTP, Payouts & Complete Book Dolphins Pearl luxury Online casino Play for Totally free Desert Benefits Slot Video game: Totally free Position to play because of the Playtech Online Jul, 2026 Desert Value Slot Gamble On the internet for real Currency Wilderness Cost Slot Arabian Gold Hunt from the Playtech Wasteland Cost Slot remark Features, RTP, Winnings & Complete Publication Desert Value Slots Gamble Now and no Downloads Greatest No-deposit Harbors 2026 Best No-deposit Harbors Now offers Enjoy Wilderness Value Slot On line the real deal Currency or Free Better Casinos, Incentives, RTP Desert Appreciate Position Remark 2026 97 05% RTP & Totally free Demo Greatest Online casinos in the 2026 Experimented with & Tested Sanctum away from Penitence Mystery Service Dark-red Wasteland Guide NRI FD Calculator Estimate NRE & NRO Fixed Put Focus Betfair Local casino Bonus: 50 No deposit 100 percent free Revolves, Play £ten Score a hundred Totally free Revolves Greatest No-deposit Slots 2026 Better No deposit Harbors Also provides Finest $ten Minimal Deposit Gambling establishment Us 2026 Top ten Buck Put Casinos Put membership Wikipedia William Mountain Local casino Extra Rules & Advertisements 2026 Betfair Gambling establishment Added bonus: fifty No-deposit Free Spins, Play £ten Score one hundred Free Spins $ten Minimum Put Casino Usa for July 2026 Score an advantage! No deposit Gambling establishment Bonuses 2026 100 percent free Incentive Codes 100 percent free Gambling establishment Incentives 2026 No-deposit Extra Rules 2026 Real-Currency Online casinos No deposit Bonus Gambling establishment Real cash 2026 Greatest $10 Minimum Put Local casino Us 2026 Top 10 Dollars Deposit Casinos No-deposit Local casino Extra Requirements Finest Online casino Deposit Incentives July 2026 Finest All of us Casinos on the internet 2026 Real cash Enjoy Checked $10 Deposit Gambling establishment Greatest $10 Minimum Put Casinos United states 2026 $ten Put Gambling establishment: Our selections to discover the best $10 minimal deposit web based casinos The newest Sweepstakes Casinos to own July 2026 Current Bonuses Web based casinos 2026 Best Real money Casinos on the internet