/** * 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 Deadwood Nolimit City Scopri il Mondo del Gioco De Definitieve Gids voor Mobile-First Casino Design Scopri il Fascino del Bonus di Le Fisherman MiFinity Casino med Flexibla Insättningsgränser Greatest casino spinfields eCheck Gambling enterprises Trusted eCheck Gambling establishment Web sites Finest quick hit platinum real money eCheck Casinos in the Canada 2026 Instant Costs Casino tillsammans swish insättning, Lät, smidigt & bevisligen Dux Local 500 first deposit casino bonus casino Extra Rules & No-deposit Now offers August 2026 $5 and you can $10 Minimum Deposit Gambling enterprises online slots win real money Found in the usa https: playcasino online ca watch?v=l3owmWXH7CI Bästa online casino 2026 jämföra & finn ultimat casino online Real cash Online slots games: Exactly how & The best places to Play Them inside buffalo online slot the 2026 Dogs Slots ᐈ Far better Play for Totally royal panda casino free And Actual Currency Casa da gioco di Londra: i diversi stabilimenti della città Dogecoin Gambling establishment casino deposit apple pay Sites, Rated because of the DOGE Help Spelautomater villig Inter Online, TOP svenska slots Find Private Banking, Playing fairytale fortune $1 deposit cards & Finance Roulette Bonuses: Everything You Need to Know Bäst nya casinon 2026, Finna nya svenska online casino Scopri i Giri Gratis di Gates of Olympus 1298552218 Premio Scompiglio Mania 2026: Benvenuto, Cashback anche Promozioni Diamond Mines have a glimpse at this site Betsoft Online casino games Playtech Wasteland Value Position Hoot Loot slot machine Comment, Incentives & Free Gamble 97% RTP Ultimata svenska språke casinon 2026, 100+ casino jämförda Superb inom försöka Latest Industry & tiki torch casino game Federal Reports & Statements Nya Casinon 2026, Topplista kungen all nya casino april rot hyperlänk 2026 Ortak Akıl Politika Geliştirme Scompiglio Non AAMS con Premio Privato di Base ᗛ 2026 Nota 100 percent free Revolves Gambling enterprise jammin jars slot free spins Also offers for all of us Players Nya Casino april 2026 Förtecknin tillsamman allihopa nya casinon inom Sverige Spend Because of the Cellular Local casino Uk August jungle wild slot 2026: Mobile phone Costs Deposits Finest Spend Because of the Cellular telephone monopoly slot machine real money Gambling enterprises United kingdom 2026 Fonix & Cellular Billing Ultimat casinosidor i Sverige 2026 Casinon tillsamman svensk koncession Spend because of the Cellular telephone Gambling establishment 2026 Best Shell out by pachinko game the Cellular Local casino Web sites $ten zeus symbols min deposit casino ᐈ Best bet for gamblers to test the brand new online casinos to own ten bucks Casino inte med Svensk perso Koncessio Nya Casinon inte med Spelpaus 2026 Top Large Ranked villento casino no deposit code Casinos gioca al casinò di nuovo scommetti sullo passatempo in Italia Finest $10 Minimal Deposit Gambling enterprises to pokies for real money own United states of america within the 2026 Best £5 Deposit Gambling enterprise casino games with twin British 5 Deposit Local casino Sites 2026 Free spins, Få ultimat freespins inte me insättning eller omsättning 2026 Finest All of us 15 free no deposit casinos On-line casino Incentives Finest Also offers to possess 2026 Casino extra inte med omsättningskrav Topplista 2023 Better fat santa online slot No-deposit Free Spins Bonus Requirements August 2026 Best 100 50 free spins on Chicago percent free Revolves Uk 2026 No-deposit & 500 Revolves Also provides DeepL Translator casino lucky nugget withdrawal World’s Extremely Accurate Translator Casino Bonusar inte me Omsättningskrav 2026 Lista med alla bonusar Online Mucchio 3000+ Slots Bonuses twelve Greatest Bank Campaigns & Added bonus Offers source hyperlink to have August 2026 Ultimata online casino 2025 Komplett guide innan svenska lirar Totally free Revolves Gambling enterprises Victory Real cash to slot Epic Ape the No deposit Slot Video game