/** * 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 Craps On line Us Ideas on how to Play & Better On line Craps Casinos 1bet Casino Mobile Application apple’s ios and Android os people approved Dragon Spin Position Comment 2026 Enjoy Free Trial Voor Spins 2026 Liefste gokhuis in Noppes Spins Zonder Deponeren Cash Cauldron Position: Review and Rating Better 15 All of us Online casino Incentives & Offers August 2026 Boobs The bank Demonstration Play Totally free Ports at the High com $5 Put Online casinos Score step 1,000+ Added bonus Spins for $5 Guide out of Ra ð“‹¹ Certified Website to try out for real Money Greatest Lowest Put Online casinos Turn $5 To your Fun time Free spins casinos wegens Nederlan 3846x gratis acteren Better Casinos on the internet the real deal Money 2026 Blood Wikipedia 5 amount Apice 10 dei Casa da gioco Online I Italiani Lista dei Migliori Casinòs Blackjack On line Public Gambling establishment Constantly Liberated to Play 21+ Finest Bitcoin and Crypto Gambling enterprises and Gaming Internet sites Usa 2026: Better Selections! Big Panda Trial Enjoy Position Video game one hundredpercent 100 percent free 23 000+ giochi da casa da gioco gratis online Enjoy Online casino games Everywhere Pay by the Mobile Sportsbooks 2026 Better Pay by the Cellular Bookies Better Web based casinos having $one hundred No deposit Extra Greatest Online casino Profits in the 2026 Highest Investing Sites 98percent+ Offerte Attive anche Giri Gratuiti Play 24,000+ Online Online casino games No Download Finest Real cash Ports for all of us Participants in the 2026 Around 2 hundred + eight hundred Revolves Jeu de Machines a dessous Désintéressées quelque peu Finest Casinos on the internet The real deal Currency Publication in the August 2026 Roulette Free Play: Every Little Thing You Need to Know Just what Local casino Video game Gets the Better Chance to have a payout within the 2026? Appareil Pour Sous Gratuites 1000+ Gaming Casino Un tantinet Better Casinos on the internet for real Currency 2026 Internet casino Designed for United kingdom Courses Casino 150 espaces gratuits sans nul conserve , ! telles Better On the web Black-jack Internet sites 2025: The best places to Play Blackjack On the internet Casino De monaie Effectif : Empocher Un tantinet Avec des Prime À l’exclusion de Conserve Your International Destination for Gambling establishment and Wagering Salle de jeu un peu offert à l’exclusion de écrit sans avoir í téléchargement battlestar-galactica-complete-series-1978 index listing Roulette un peu Monnaie Effectif Meilleurs Situation de Fraise Appoint Palpable Best Microgaming Salle de jeu For 2026 Top Termes conseillés & Bonuses Finest No deposit Incentive Gambling establishment and you may Promo Offers August 2026 Aztec Silver Megaways Slot 2026 Wager Free Right here Megawin Salle de jeu Commentaire 2026 Pourboire de 3000 + 100 FS Online casinos Usa 2026 Checked & Rated Caractères Prérogative Pour Salle de jeu Un brin , ! Bookmakers 2026 Évaluez Salle de jeu Fraise en direct Hollande 2026 The best Aquarium Simulation Video game To try out