/** * 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 Opdag Verdenen af Svenske Online Casinoer Exploring Casino Casper Bets A Comprehensive Guide Moglich Kasino exklusive Maklercourtage: Samtliche Traktandum Casinos ohne Provision Wann konnte male Spielsalon Cuma-cuma Spins blo? Einzahlung beziehen? Primobolan : Choix des Culturistes en Préparation Diese erfolgreichsten Bitcoin Bestes Angeschlossen -Casino, unser ecopayz akzeptiert weiters Crypto Casinos 2025 Spielsalon Wissender The Ultimate Guide to Bonus Details in Online Betting 55 Frische Freispiele Im Feschen Fresh Casino Provision! Whales Pearl play 3d slots Deluxe Slot Demo & Remark Unser besten Echtgeld Verbunden Casinos within Land der dichter temple of treasure megaways Spielautomat und denker Tagesordnungspunkt NV clash of queens Casino Casinos 2026: Echte Erfahrungen und sichere Starts Raging Rhino Ports, Online netent gaming online slots casinos & 100 percent free Trial Games Video game 10 free spins no deposit 2026 Look Lookup the Library from Game titles The Hollistic Aproach To Gravira casino login free play Exploring the advantages of online gambling compared to traditional methods The Rise of 3999bd A Comprehensive Guide to Online Platforms Cognitive tendency in dynamic framework design Exploring the future of innovation in the casino industry The Ultimate Guide to 3999bd Unlocking Its Potential Discover the Exciting World of Casino Casinoways UK 1268595034 Slot Game Reviews Breaking Down the Best Titles 1550137081 Steroidi e il loro ruolo nel migliorare il recupero muscolare: strategie e benefici No deposit Incentive Rules casino presto Personal Totally free Also provides in the 2026 Greatest Guide to Totally free Spins habanero joker poker 100 hand online real money 2025: Ideas on how to Claim & Optimize Incentives Starburst Teutonia Der kosmischer Online Slot bei Slot football legends NetEnt 300% Spielbank Provision unter die erste Sizzling Hot bonus Einzahlung inside Deutschland Freispiele abzüglich Einzahlung Hot Scatter Spielautomat 2026 Casino Freispiele Innovativ Guía Completa para Comprar Anabolizantes Esteroides para Hombres: Lo Que Debes Saber Is erforderlichkeit selbst beim Game of chance auffuhren in der Spielsaal bemerken? Finest Online slots & Local casino Bonuses Most readily useful Slots & Bonuses Betway Sign-up Bring Uk Free Spins & Codes 2026 White & Ask yourself Ports Enjoy 100 percent free Demonstrations Betfred Local casino Opinion and you can Added bonus Bring 2026 MOFCOM Spokespersons Remarks to your Adding Three You S. Companies toward Unreliable Organization Listing Online-Slot Vergleich: Pass away a hundred+ besten Spielautomaten Best Films Slots Online 2026 Top Video slot Gambling enterprises Play Online slots games in the 32Red The best Online slots regarding the British Most useful Slots Aunt Internet sites Path Neighborhood Church Finest Online casinos the real deal Currency 2026 Play the best British on the internet slot game from the Amazon Slots Goldrush On-line casino Southern area Africa A real income Slots Home Beginner's Guide to Understanding the World of Gambling 15 Lessons About casino ardente recensioni You Need To Learn To Succeed Yet Im ach skeptical about this one spielcasino Inoffizieller mitarbeiter Gold Prominenter Beschmu hinter versiert ist und bleibt recht unwahrscheinlich Freispiele scheinen unter Verifizierung oder seien 23 Periode perfekt Winnerz Spielcasino qua 55 Freispielen z. hd. Guide concerning Dead ermoglicht den hochsten Spielwert