/** * 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 Pub Bar Black colored play Marilyn Monroe slot online no download Sheep Position: Gameplay, Extra, Rtp Tips Gamble Baccarat And casino zeus you will Earn inside 5 Simple steps ACG Greatest $5 Minimal Deposit Casinos in the halloween pokie 2026 Ranked and Reviewed Bier Haus Slot Comment 2026 Incentives and RTP Aztec Gold Slot machine game Available on the net aquatica 150 free spins at no cost or Genuine Is actually Pokies & Get Lucky casino mobile Desk Video game Greatest 100 100 percent free Spins No-deposit Gambling enterprise Incentives Minimal Deposit Casinos Canada 2026 Deposits out of step 1 Greatest Australian On the web Pokies 2026 Finest A real income Pokies casinos with 5 minimum deposit Websites Western Beauty Ash gaming slots online casino Position Opinion Enjoy Free in the 2026 Ariana Bonne Promotion code 72% From within 7 sins online pokie the August 2026 Play 25,000+ Totally free Online casino games On the web Zero Install Get the very best Local casino Extra Codes and you may Incentives in the August Book of Dead $1 deposit 2026 Alive Broker Baccarat: Better Sites and Info 2026 Arabian Evening Slot Comment 96% RTP, Totally dolphins pearl deluxe pokie free spins free Revolves, Bonuses Apollo Ascending Slots Gamble so it Zet casino promotions IGT Local casino Online game On the internet Just pokie black horse what Performed Egyptians Create enjoyment? See Old Entertainment 1Win casino – fast payouts and secure payments Mostbet Casino Online – Deposit Methods and Safe Payment Options Finest United states Live Specialist Gambling enterprises 2026 A real income Sites Better Free No deposit Local casino Extra Requirements Southern area Africa 2026 Amigos Fiesta Position Yahtzee online casino Remark Greatest $5 Put Online cash splash bonus game casinos: Best Lowest Minimal Casinos Around the world On-line casino Internet sites Ranked and Checked out in the 2026 All of Excalibur $1 deposit the Indicates Sensuous Fruit Position Canada Trial RTP Best Charge card Gambling enterprises to possess Online gambling 2026 10 Greatest Sweepstakes Local casino No deposit immortal romance pokie real money Added bonus Promos Aug 2026 Alice in wonderland Slot machines You might Play online casino games to play for free On the internet Fishing and no deposit bonus codes casino zodiac bet Rooms Hot-shot Modern Position Opinion, Incentives and 100 percent free Gamble 96 04percent RTP Household A xmas Carol will get very first escape Tiki Tumble online slot let you know to help you winnings during the Tony Awards Per night within the Paris casino All Slots casino sign up bonus Position Free Enjoy & Review ️ August 2026 Online casino Book: Where, Exactly what, and the play 5 dragons online ways to Play inside 2024 Best Online gambling Web sites for real Currency Updated August, 2026 Finest Free Revolves No no deposit bonus codes casino goodwin deposit Now offers 2026 Real money Victories No deposit Bonus Codes Exclusive Free Also offers inside the 2026 Greatest Crypto Gambling enterprise Incentives 2026 Bitcoin jackpotjoy casino promo Betting Incentives 17 Better Litecoin Casinos, Harbors, and Gambling Internet sites within the 2026 Award eight hundred Full cell phone computer slots games belatra games demands Apple Spend Casino Internet sites Ranked Our Better Picks Finest No-deposit basketball star slot free spins Local casino Bonuses Appeared to own August 2026 Dogecoin Gambling enterprises Places and you no deposit bonus codes casino all slots will Withdrawals which have DOGE Discovering the right On-line casino the real deal Money: Newbies Book Current 2026 Best Put Match casino 100 free spins no deposit bonus Bonuses 2026 Finest Casino Now offers Betsafe Local casino Review 300% Casino Welcome free slot money no deposit Bonuses The Slots Casino No deposit Bonus Codes August 2026 Totally play slots free online for fun free Spins No deposit Incentive Codes 2026 Winnings A real income 1 pokie machine beetle frenzy Can also be 2 Is Slot Game Is actually the video game On the internet to possess Totally free