/** * 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 Totally free Revolves & Award Multipliers Wolf Work at Position 100 percent free Play On-line casino Harbors No Download The Ultimate Guide to Free Spin Casino Sites Discovering the Best Online Gaming Website: An Ultimate Guide Ramses 2 100 percent free Casino slot games On the internet Play Games, Greentube Instantaneous & On the web Cleopatra Position Comment 2026 100 percent free Enjoy Demo Play Thunderstruck Slot Free Revolves No-deposit Acceptance Bonus 50 Free Revolves On the Registration No deposit Southern Africa 2026 Free Spins No deposit Bonuses Most recent Offers July 2026 Observe Free Movies On the web that have Plex Greatest Casinos with one hundred Free Spins No-deposit Incentives within the SA Lord of one’s Sea Position Opinion, 100 percent free Revolves & Mythical Victories Free Slots Zero Download Zero Registration: Free Slot machines Quick Play 100 Totally free Revolves No-deposit having Quick Distributions inside the 2026 Free internet games during the Poki Enjoy Now! Free Slot Online game On the web Dr Bet Extra Code 2026 Better Indication-right up Render to possess July Gamble Countless Free Pokies NZ Online Slots You to Shell out Genuine Honours: ten Video game To use Play 19,350+ Totally free Position Games Zero Obtain Free Slots Playing Off-line Online Pokies to have Aussies: Play Best Online slots without Membership The current Coin Learn 100 percent free spins and you will coin website links Score 10B 100 percent free Gold coins Totally free Online casino games 31,000+ Ports to experience Zero Obtain Bonus Revolves Campaigns No-deposit Necessary: Newest Also offers Finest 100 percent free Slot Game July 2026 Demonstration Ports Fairy Door A knowledgeable Harbors Computers from the OneCasino Fantastic Four 50 traces Position because of the Playtech RTP 91 99% Play for Free Mighty Fu Casino Slots Online game Programs on the internet Gamble Play Middle Legal Free Gamble 100 percent free Demonstration Video game International Zodiac Gambling enterprise Review 2026 Slots, Online game & Sign up Bonus Now offers Better Online casinos for real Money Usa 2026 Specialist Ratings You Bitcoin Casinos on the internet 2026 10+ Internet sites Taking Bitcoin No deposit Gambling establishment Incentives 179+ To possess July 2026 100 percent free Gamble Said at the Slottyway Local casino Are Risk-Free 100 percent free Revolves No deposit Bonuses Victory A real income 2026 Texas Teas Slot machine Have fun with the Games On the internet 100percent free Tumbling Reels – a feature included in the game enables you to enhance your profits. For those who assemble five or higher spread signs, earnings will be given. The fresh spread out and wild symbols inside the Da Vinci Diamonds support professionals in the broadening its profits. Club Bar Black Sheep Slot Free Trial, Video game Remark 2026 R250 Totally free, R11,five hundred Red dog Casino No deposit Extra Requirements July 2026 Have the best Casino Extra Rules and Bonuses within the July 2026 Best No-deposit & Free Indication-Right up Casino Incentives July 2026 No-deposit Added bonus Casinos Finest Gambling establishment No-deposit Bonus Rules inside the July 2026 Greatest No deposit Local casino Incentives for all of us Professionals July, 2026 No-deposit Gambling establishment Bonuses 100 percent free Revolves to possess On line Participants 2026 Most recent Community & Federal News & Headlines USATODAY com Score fifty No deposit Spins N1Bet Local casino Bonus Password FREE50 2026