/** * 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 Casino Inte med Svensk Koncessio & Utan Spelpaus » Topplista 2026 Ultimata insättningsbonus casino >> Jämföra svenska språket insättningsbonusar 200 % casinobonus 2026 » Uppräkning på 200% insättningsbonusar Allt ifall free spins på svenska språke casinon Ultimata casino med Swish 2026 Uttag & Insättning Topplista Casino inte med konto 2025 Testa superb casino inte me inskrivning️ Betalning casino Dom ultimat casino betalningsalternativ 2026 Nätcasino inom Sverige 2026 » All casinon gällande webben 80+ listade Bästa casino tilläg inte me omsättningskrav 2026 » Topplista Slots med störst maxvinst inom Sverige Kika topplista närvarand! Casino tillsammans Swish 2025 Topplista tillsammans Svenska språket Casinon Casino tillsammans Swish 2026 Snabba insättningar sam uttag Casino Extra Uten Innskudd Nye Casino tillsammans Kostnadsfri Bonuser Casino med ledsen insättning » minsta insättning 50 kry , 25 frisk & 10 sund Ultimata Online Casino: Top 10 Casino Sverige 2026 Casino Extra inte med Insättning: Topplista 2025 Casino Extra 2026 Jämför Sveriges ultimata casinobonusar! Casino utan omsättningskrav 2026 Omsättningsfria bonusar Casino inte med Svensk Koncession » Bästa Betting inte me Spelpaus 2026 Lista �kreation Sveriges by�ledning casino bonusar 2026 Skattefria Casinon Förteckning för 2026 Casino utan omsättningskrav Alla omsättningsfria bonusar Bingo online » testa bingo på nätet tillsammans välkomstbonus 2026! Kreditkort i Mobilen: Linne 5 Foto ino Telefonen Jul, 2026 Bilbingo ino Sverige finn drive-in bingo 2026 Alla Casinon inom Sverige Full förtecknin 120+ casinon Ultimata insättningsbonus casino >> Jämför svenska språke insättningsbonusar Casinon Online Ultimata svenska språke casinon kungen nätet 2026 Nätcasino inom Sverige 2026 » All casinon villig webben 80+ listade Utländska casino 2026 Mäta allihopa ultimat casinon utomlands Genom ger de suverän casino spel på näte 【2026!】 Prova blackjack online 2026 Jämföra topp 10 casinon Ultimat rörlig casinon & appar före svenska lirare 2026 Casino Online » Sveriges Ultimat Online Casinon 2022-2026 Casinotopplistan Din vägledning mo ultimat casinon online i Sverige Casino app Ultimata casino appar bland svenska språke casinon 2026 Ultimat online casino 2026 jämför & finn ultimat casino online Casino på Webben Topplista ovan Svenska språke Casinon Online 2025 Tröja 10 ultimat casino utan koncession Ultimat online casinon allihopa Svenska språke casino villig inter 2025 Topplista: Ultimata Online Casino 2026 för Svenska språket Spelare Bäst casino i Sverige Lokalisera Sveriges bästa online casinon Suverä casino inom Sverige Finna Sveriges ultimat online casinon Suverän Casino med Rapp uttag april 2026 » Topplista Ultimata Svenska språke Casino: Topplista över populära lockton sam bonusar 2026 Casinospel på näte 2026 Ultimat casinospelen ino Sverige Lista Casinospel villig näte » Ultimata svenska språket casinospelen 2026 Casino villig nätet » Ultimat Svenska Casinon Online 90+ uppräkning Casino Bonus: Ultimata CasinoBonusar ino Sverige 2026 Saken där kompletta guiden till nätcasinon 2026