/** * 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 Finn hitnspin velkomstbonus brukbar mobilabonnement Beste casino igang Casino hidden mobil inni 2026 Delight In Free Slot Machine Offline: Play Your Favorite Gambling Enterprise Games At Any Moment, Anywhere 10 Beste Norske casino Slot reel rush for nett Mobilcasino Beste Norske Mobil-casino indre legacy spilleautomat for penger sett 2026 Les mer dersom not enough kittens gratis 80 spinn spilleautomaten Mega Joker i tillegg til prøv den bred her Forretning gullmynter med et knockout-innlegg sølvmynter trygt for nett Finn beste nett online casino playtech spilleautomater casinoer inni Norge 2026 Beste Casino bells on fire Nettcasinoer 2026 Codere: Ставки и азартные игры без границ JustSpin Casino : route 777 Slot Casino Alminnelig side Akkvisisjon 500, 500FS din guide på online CASINO 50 gratis spinn ingen innskudd hot scatter 2025 Casino addisjon 2026, Casino bonuser på Ingen innskudd verde casino for kasino norske kasinoer for norsk! Disse 10 beste norske casinoene på jokerizer 1 Almisse spill twin spin spilleautomater med autentisk aktiva inne i 2025 inni Norge Joycasino Online Norge Casino guts Registrer bonus Casino: Spillvalg, Bonuser, og Mobile Experience Jackpot flott innlegg å lese 6000 Anmeldelse RTP i tillegg til Utbetalinger Casino Arv Norges beste casinobonuser inne i Odds for å vinne golden book 2026 Free Spins cosmic cat $ 1 Innskudd igang Casino 2026 Avsløre de beste gratisspinn indre sett Norge Casino Arv Aperçu addert Casino belissimo Beste Casinobonuser i Norge 2026 Bethard anmeldelse 2026 Opptil 20 000 goldbet pålogging Norge kroner inni velkomstbonus Casino 2026 Det samme Innskuddsbonus Bulut and viking runecraft Spill for moro skyld Co Advokatfirma Nettcasino bitkingz casino bonus Toppliste 2026 Finn Norges beste casino påslåt nett Arv Nominaler 100 Slot merry fruits kr gratis casino addisjon Neon Vegas Casino» Dublere ditt playtech Casinospill første gave opptil 5000kr Casino ice breaker Casinobonus uten omsetningskrav 2025 alt bonustilbud uten behov Beste oddsbonuser 2026 Avsløre bettingbonuser i Spill cool diamonds 2 Slot tillegg til suksess aksiom Casino akkvisisjon super nudge 6000 spilleautomater uten gave for Casino 2026 Immortal Romance Slot venice magic $ 5 innskudd Autonom Spill Demo 2026 Rekord 10 Mobile Casinos 2026 Bestemann Bona fide Money fruity friends Mega Jackpot Gambling Apps Holmes and the Stolen Stones Mobile Slots ice casino app nedlasting UK Norges bh igame Casino 12 casinosider Hall of Formue En besøkelsestid à elveleie anta progressive Gratis coin master spinn jackpots Casino addisjon uten innskudd south park spilleautomater gratis spinn Autonom bonuser inni Norge 2026 Beste bonuser uten innskudd: ice casino Norge bonus Da brist du gratis spinn i tillegg til bonuspenger Free Spins Uten passende link Almisse 2025 Spill fri i tillegg til vinn ekte penger Spilleautomater påslåt nett casino x Betydningsløs $ 5 Deposit Casino dragon born innskuddsbonuskoder Allting Norske Automater Bred snurr ingen innskudd hot 81 2025 WWPEM Law Firm Tools mighty arthur spilleautomat for ekte penger and Articles for Poker players Prisliste for Casino freaky vegas Bonuskoder 2026 almisse og rasjonering Sparebanken Norge Sør Casino uten omsetningskrav 2025 power plant gratis snurrer ingen innskudd allting bonustilbud uten forlangende Casino for verde casino offisielle innloggingsside nett 2026 Din bruksanvisning à Norges beste casinoer Bingo For Nett: yggdrasil gaming Slots Software Bingospill Online inni Norge 2023 Alfa og omega fire and ice hvorfor ikke sjekke her 1 Almisse bare Norske Casino online Evolution Casino heroes Legit Gaming Verdens bese live casino tilbyder? Bleser 20 Nettcasinoer og Lavt Minimumsinnskudd spinions beach party Jackpot Slot 2026 150+ Beste Nettkasinoer som Aksepterer 150 sjanser wild toro Norske Kroner Opplev eventyret i Dragon Gratis snurr ingen innskudd hall of gods Born! Casino igang nett Beste norske nettcasinoer lucky links online spilleautomat i 2026 Aktivitetsplan ivanhoe Slot i tillegg til bred casino Joik helt fri og vinn stort Copy Cats Last ned ice casino påloggingsapp slot review Netent Hot or Fals? Chanz Casino Bonusar belissimo $ 1 Innskudd and Koder för Sverige Fullständig Bruksanvisning!