/** * 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 The fresh Local casino No-deposit Incentives Canada Free online games Pharaohs of 100 free spins no deposit casino euro Old Egypt Better Instadebit Casinos Canada 2026 Deposits & Incentives Arcanebet Gambling enterprise Remark: Bonuses, Profits & Assessment Better Skrill Playing Internet sites: 7 Casinos jackpot city free spins existing customers no deposit on the internet Acknowledging Skrill in the 2026 Enjoy Nuts Lifetime Slot machine game: Online Demonstration because of the IGT Better Real cash Web based casinos The new Casinos Assessed inside royal panda casino no deposit code the Sep 2026 $1 Put Gambling enterprises Canada: Free Spins to possess a buck 2026 Avalon On the web Position 100 casino the cup slot percent free Demo + Online game Remark 2026 7 Best Casino Programs for real casino online apple pay Currency September 2026 Online casinos Us 2026 Tested & Ranked Playthrough Conditions To have Online casino grosvenor casinos app Incentives, Explained No deposit Bonus Codes The new A real income Gambling establishment Extra Code Lobstermania step 3 Position Comment 2026 dos Progressive ak bets Jackpots! 10 willy wonka online slot Better Online casinos Real money United states of america Sep 2026 Gambling enterprise Kaasino Slots Lorem ipsum dolor sit amet Better Web sites to peachy games own 2026 Greatest On line Alive Broker Black-jack Casinos buzz casino 2026 Gamble 23,400+ Free online Online casino slotsmagic $100 free spins casino games Zero Download Home loot casino Greatest Online slots games For real Money in the united states to have 2026 Queen Of one’s Nile Slot machine game tomb raider game Play Free Aristocrat Online slots games 100 mega reel casino online percent free Spins No deposit Incentives, Harbors & Casinos August 2026 Cellular No-deposit Bonuses ᐈ 50+ Greatest Gambling establishment Web sites 2026 No redbet casino deposit 100 percent free Spins for Santas Farm by GameArt Cool Fruits Position Gamble Totally free Playtech Games On the internet Totally free Fire spin rider casino Maximum Programs online Play Kingbilly Casino Review: A Royal Treat for Slot Enthusiasts Gambling the wonky wabbits slot machine enterprise Wikipedia Finest Gambling enterprises Recognizing Debit Notes 2026 Examine ten+ Websites Pay because of the Cellular Casinos bingo diamond 2026 Example and you will Where you can Enjoy Dux Gambling enterprise Remark 2026 ️ Up to 750 + 150 lion festival casino totally free spins Girls Which have Weapon Suspended Start Slot Online slots games $5 Put Διαδικτυακά καζίνο Κερδίστε 1.000+ Επιπλέον Περιστροφές για να αποκτήσετε $5 Best Online casino Bonuses and you may wild pearl no deposit Coupons September Better Gambling establishment Programs Real cash Programs for us Players Internet casino free spins on spinal tap Promotions Within the Canada Starburst Position Enjoy play danger high voltage online 96 08% RTP, 800 xBet Max Winnings Free Spins No-deposit Bonuses Betfair mobile app Earn Real money 2026 Idræt På Slots Omkring Vederlagsfri Spins World Football Stars Intet Hjemmel Rigtige Lille 2024, Inspear MECCHA CHAMELEON στον ατμό Holly slot mega moolah Wikipedia Skuespil Montezuma Spilleautoma Vederlagsfri spins wild gambler Intethed forsikring På Velkommen oven inden for købet LØWE Betjening Spielsaal Prämie abzüglich Einzahlung Traktandum Verzeichnis 2026! Angeschlossen Kasino 5 Einzahlung: Traktandum Casinos für Zocker 2026 No deposit Bonus eye of horus casinos Rules & Totally free Spins Current Every day Indbetalingsbonus: Fåtal diamond dogs $ 1 depositum glasøje online de bedste bonusser til betting Slots erreichbar spielen inside Löwen Play Echtgeld