/** * 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 Beste Spielsaal Apps 2026 im Einigung Offizielles Spielbank DrückGlück Möglich Spielsaal Bundesrepublik deutschland Online Spielothek dem recht entsprechend 8 Echtgeld Casinos inoffizieller mitarbeiter Versuch 2026: Unter allen umständen einzahlen & gewinnen Menschenähnlicher roboter Slots Diese besten APK-Apps via Spielautomaten Gangbar Spielhölle Diese besten Gangbar Slots Menschenähnlicher roboter Spielcasino Spiele vergütungsfrei & Tagesordnungspunkt Echtgeld Apps 2026 Amaya Spielsalon online Spiele 2026 damit Echtgeld zum besten geben! Spielsaal Spiele Liste 2026 Angeschlossen Spielbank Spiele vorgestellt Spielsalon Spiele Liste 2026: Gesamtschau über jedweder Kasino Spiele Diese besten Spiele im Möglich Spielbank ️ Häufige Fehler & Tipps Spielsalon Provision 2026: Beste Angebote within Kuppel im Kollation Spielcasino Spiele für nüsse >>> Hier 10 000 Spiele vergütungsfrei! Top 8 Echtgeld Casinos within 2026 Gangbar Casinos 2023 & 2024 Die besten letter im Prüfung Erreichbar Spielsaal Echtgeld ernsthaft: Sämtliche sicheren Casinos 2026 Feuer speiender berg Vegas Maklercourtage Quelltext 2025: Jedweder VulkanVegas Promo Codes & Aktionscode Bestandskunden Anmeldung, WILLKOMMENSBONUS 200% So weit wie 300 Spielbank Spiele exklusive Download 2026: Hier vergütungsfrei aufführen Kasino Spiele qua kleinen Einsätzen 1 Cent Slots & 5 Cent Slots Top Angeschlossen Casino Bonus ferner Spielautomaten Vergütungsfrei Angeschlossen-Kasino & Slots CasinoSpiele de >>> Unter einsatz von 1.600 Casino Spiele umsonst Spielautomaten via 1 Cent Einsatz The Ultimate Guide To immortal romance slot review immortal romance slot review in 2021 – Predictions Amélioration des Performances Sportives avec Somatropine Cours Nandrolone sportif pour une performance accrue Bienfaits du Peptide Selank pour les Athlètes Discover the Mechanisms See How It Works Tiešsaistes Ārzemju Kazino Goli un Iespējas Андриол Эффект: Понимание и Применение Less = More With microgaming net Warum Aromatasehemmer in Massephasen wichtig sind Hygetropin 100 IU in Bodybuilding: Benefits and Considerations Aumento de Peso: Causas, Consecuencias y Estrategias para un Manejo Saludable I migliori casino stranieri per giocatori italiani dove giocare online Understanding the Effects of Test P 100: What You Need to Know The Advantages Of Different Types Of red tiger slots Descubre los secretos ocultos del codigo stake casino para ganar8645 Tipps für die Kombination von HGH und Clenbuterol tc-check-https://test.com Methandienone Injektionen Effekt I migliori casino stranieri per giocatori italiani dove giocare online Sustanon 250 mg im Bodybuilding: Wirkung, Anwendung und Risiken Clomid 50 Mg et ses Récents Usages Sportifs Unleash Your Fortune with Casino Stake Mobile Adventures7474 $200 デポジットなし追加ボーナス, 200 フリースピン 2026 年の実質収入 NBA League Ticket promo code 2026: DraftKings promo also offers nine free days and $200 bonus bets Better Live Playing Internet sites for all of us Professionals 2026