/** * 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 Dunder Spielbank Erprobung: 600 Prämie ferner 200 Freispiele für nüsse! 10 Best Mobile Casinos and Software casino Jack Gold no deposit bonus for real Currency Game 2026 Play Thunderstruck Slot: Comment, Casinos, Added bonus & Video clips RTP, Freispiele & Max Erfolg Dunder Casino Bonus 2026 » Provision Sourcecode 50 Freispiele Provision so weit wie 600 + 200 Freispiele Nachfolgende besten Verbunden Casinos within Brd 2026 Thunderstruck Slot Remark and you will 100 percent free Trial 96 ten% RTP Book of Ra Slot: 50 Freispiele exklusive Einzahlung ausschließlich Angeschlossen Slots Spiele Spielautomaten as part of DrückGlück Spielbanken in Teutonia Verkettete liste aller 65 staatlichen Casinos Top Verbunden Spielsaal Maklercourtage Angebote as part of Deutschland 2026 Casumo Registrierungsleitfaden 2026 Kontoverbindung, KYC & Zahlungen Casino slot games Comment Best Online casinos Canada 2026 Greatest A casino Caesars free spins sign up real income Web sites Angeschlossen Spielhalle qua Slots & Live Potravinári pre Slovákov Kvalitné potraviny z domova 819909032 Verbunden Kasino exklusive Mindesteinzahlung 2026: Nicht vor 1 vortragen Beste Spielsaal Maklercourtage bloß Einzahlung 2026 No vorleistung provision Thunderstruck II Pokie Review 2026 Provides, RTP & Far more Casumo Casino Verbunden Germany: Spaßige Slots, große Boni, einfacher mobiler Einsicht 12 000+ Spielsaal Spiele gratis spielen Bloß Registrierung Online kasíno Slovensko Všetko, čo potrebujete vedieť Casumo Praxis 2026 CasinoMeta Review 300 Provision Play Thunderstruck Slots ᐅ Kasino Bonus exklusive Einzahlung originell No Vorleistung Maklercourtage TOPLISTE Beste Casinos ohne Verifizierung 2026: anonym, schlichtweg & allemal Thunderstruck Nuts Lightning 2026 Review RTP, Icons and you will Added bonus Have Verbunden Spielbank Verkettete liste 2026 Beste Angeschlossen Casinos im Echtgeld Untersuchung Book of Dead Freispiele exklusive Einzahlung erhalten: Traktandum Angebote Freispiele ohne Einzahlung 2026 100% Kostenfrei & Fix Casumo Provision Sourcecode: 100% Neukundenbonus + 50 Freispiele The ultimate Help guide to the newest “Thunderstruck” Consuming Game Best Online casinos around australia for real Red Queen casino no deposit code money gaming inside the 2025 Interessenvertretung 50Plus e V. Sprechweise ihr Lebenskenner Personen via 50 Jahre Traktandum 10+ Bitcoin Casinos 2026: BTC Casino Probe Gamble Thunderstruck Position: Opinion, Gambling enterprises, Bonus & Videos Beste Krypto Casinos Teutonia 2026 inoffizieller mitarbeiter Kollation Beste Krypto Casinos Land der dichter und denker 2026 im Kollation Beste Krypto Casinos 2026: Bitcoin Kasino Abmachung Thunderstruck position by Game Around the world: Trial & Evaluation Freispiele ohne Einzahlung 2026 Für nüsse Freispiele Book of Ra Magic » Kundgebung & Echtgeld Slot verbunden zum besten geben Best No-deposit Paco and the Popping Peppers $1 deposit Local casino Incentives Seemed to have August 2026 Die besten Erreichbar Casinos within Brd 2026 Stormin 7’s Video slot Get involved in it 100percent free On the web Chrome-Browserverlauf untersuchen und auslöschen Computer Google Chrome-Support RTP, Freispiele & Max Triumph Book of Ra Magic Casino: Mobile App iOS & Android Nun biegsam zum besten geben & Prämie beschützen