/** * 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 Stippen within Hurghada African Safari Spielautomat Deutsche Tauchschule amplitudenmodulation Roten Ozean Real Cash Ports Online PayPal: A Guide to Safe and Secure Gambling Spiderman Harbors Spiderman Surprise video lejupielādēt lietotni verde casino spēļu automāta apskats Spielhölle ein Birthday online Mirakel Juegos sobre Casino acerca lights máquina tragamonedas de Chile Nachfolgende besten Sonnennächster planet Erreichbar Casinos 2026: Hierbei Provision bewachen Guía para Principiantes sobre los Esteroides Kasino Bonus Kollation 2026 Top10: Verbunden Casino Provision Codes Juegos de World match con pharaohs fortune en línea el fin de Competir Gratuito En internet Freispiele bloß Einzahlung: Tägliche aktuelle Casino Free Spins inoffizieller mitarbeiter Julei golden touch Mobile Slot 2026 CasinoSpiele de >>> Qua 1.600 Kasino Spiele Herr Bet AT Bonus für nüsse Kas padara Starburst verde casino pieteikšanās Harbors tāpēc jautru? Colección de Ranura indian dreaming Casino sobre Preparado Online Seriöse Angeschlossen Casinos 2026: Legale Casinos as part of Deutschland Royalgame Kasino Zugang Fast Access unter anderem ohne Boni Vairākiem Iphone 3gs maciņiem, verde casino izņemšanas laiks Iphone 3gs 12 Pro korpusiem Online Casino Bonus für jedes Julei: Traktandum vulkan spiele login mobile download Willkommensbonus finden Stelldichein buchen Online-Aktion Einstiegsseite HamburgService Winairlines Zeus máquina tragamonedas Casino Sus particulares 500 en SlotsUp and 96 Safety Index Vom Wettschein zum Bimbes unter dem Konto: worauf Fans within Ausschüttung ferner Quoten beachten sollten Pilnīgi bezmaksas griezieni bez lielākais bez depozīta hitnspin depozīta stimuls Nachfolgende größten Streben ein Erde im Stellung 2026 Póker online joviales recursos conveniente: más grandes salas intense casino aplicación para iOS en 2026 Diese eighteen besten seriösen Verbunden Casinos Alpenrepublik Monat der sommersonnenwende 2026 Die besten Spielbank Freispiele bloß Einzahlung inoffizieller mitarbeiter Julei 2026! Descargar indian dreaming máquina tragamonedas Eye of Horus spielen: unter einsatz von Echtgeld, diese Seite Merkur-Klassiker Beste PayPal Erreichbar Casinos: Casinos via PayPal Einzahlung 2026 Spēļu automāti ar papildu tiešsaistes spēli: spēlējiet 100% bezmaksas spēļu automātu hitnspin promo kodi spēli Extra Cycles Juegos Juega victorious Máquina tragamonedas de Casino sobre Chile Unser besten Erreichbar Casinos über Echtgeld 2026 ︎ Online Spielothek via Echtgeld Bezmaksas griezieni We Dag, Spil Gratis Azartspēļu uzņēmums hitnspin kazino bonuss I Juni Neue Angeschlossen Casinos as part of Alpenrepublik Siebenter monat des jahres 2026 Spielen Más grandes lugares Los mejores casinos en línea para baccarat sobre casino en línea sobre Bitcoin para juegos sobre chiripa sobre cripto Safe 2026 two hundred matter Wikipedia Azartspēļu uzņēmums jauns bez depozīta goldbet esošajiem spēlētājiem Nozīmīgs bez depozīta Pievienots bonuss 100 100 procenti bez maksas Atgriežas 2026. gada jūlijā Queen of your own Nile Casino slot games Enjoy Better Commission Video game from the Mr Bet 1 Gambling enterprise Fußballwetten-Bonus exklusive Einzahlung 2026 50 kostenlose Spins unter crystal tanzerei Keine Einzahlung Spielzeit-Angebote Spiele Top-Online-Slots Seite besuchen & Tischspiele within Deutschland Uptown Pokies Gambling establishment No deposit Bonus Requirements 2026 Inform Spiele Crystal Tanzabend inoffizieller mitarbeiter Kasino um Echtgeld & unter einsatz von Prämie šimtas 100 procentų nemokamų sukimų be depozito paskatų 100 nemokamų papildomų sukimų Codeta Erfahrungen » Kundenberichte & Kritik Juli 2026 Beste Angeschlossen Casinos: Tagesordnungspunkt Casino -Slot Lucky 7 10 Verbunden Spielotheken im Abmachung Better On vacation reactors slot the net Zero-deposit Added bonus Carson’s Journey Casumo Provision Kode Siebenter monat des jahres 2026 Aktueller Kupon Beste Verbunden Casino Brd quick win Deutschland Boni 2025 Erfahrungen Ferner Probe 1xBet Gambling establishment Comment 2026 1500 Greeting Added bonus Casumo Spielbank Test SlotsUp Expert Erfahrungen Top 10 The fresh Online slots of 2025 Rated because of the Playcasino