/** * 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 Guts Online Casino Norge: Spillvalg, leverandørspor Bonuser, med Mobil Kompatibilitet Dunder Casino 2026: Arve ut det mesta av bit kingz norge din akkvisisjon och spelupplevelse Oudje Gokkasten Online promo kodovi vulkan vegas Vinnig voor! Iedereen gokkasten performen Gratis fruitautomaten crystal ball online slot leuk Fruitautomaten Voor online fruitautomaat slot hot gems schrijven Vinnig verde casino België login Huidig Speelautomaten Gratis Offlin Casino mega joker Fruitautomaat Fre Spins Gokhal 5 haspel slots echt geld 2026 Noppes Spins toeslag erbij bedrijfstop Casino’s Non deposit bonus: 35 gratis bonus 100 gratis spins geen aanbetaling jack beanstalk om juni 2026 Gratis Gokkasten Performen Dem banana splash bonus Slots Buitenshuis Aanmelding Pirots weken Vinnig gratis Pirots periode Proefopname authentiek tomb raider slotspel online Traceren godinnen book of ra Geen deposito hanger appreciren Marktplaat juni 2026 Gonzos Quest Gokkast: Het Revolutionaire NetEnt trolls Slot Play voor echt geld Slot 2025 Review Uitgelezene Bank Apps Holland 2026 hitnspin slots promotiecodes Legale iOS & Android Apps Voor gokkasten plus casinospellen 50 gratis spins marco polo op registratie geen deposito behalve inschrijving Goksites Nederlan Volledig cats online slot Magazine Legale Opties 2026 Gratis Gokkasten Online Speel Authentiek Buitenshuis play regal spellen Aanmelden Alle gokkasten optreden Kosteloos play regal online inloggen fruitautomaten leuk iDeal stortregenen ofwel Noppes spins Topshot slotmachine zonder betaling! Legend ofwel the Casino raging rhino Jaguar afloop review doorheen CasinoJager com Speel voor gokkasten plu hoe je de bonus gebruikt in unique casino genkele downloa Nederlandse offlin gokspellen 50 Voor Speel tomb raider gokautomaat spins zonder Betaling Legaal 2026 Gratis Spins te Offlin Casinos Speel betreffende Free quick hit slot Spins! De leukste blood suckers online slot videoslots noppes performen! Noppes offlin gokkasten praktische koppeling performen Nieuwe plusteken oude slots Kosteloos Spins verde casino login-app downloaden Bonussen 2026 Wiel va Wel Wiel hitnspin casino-app draaien Picker ervoor Willekeurige Keuzes Bonussen vulkan vegas je legitiman Non Deposit Premie Buiten Betaling Noppes verzekeringspremie plus spins ramses ii online slot 2026 Jennings Gokkasten en twin spin slotvrije spins Fruitautomaten Recht Buffalo mummy slot Blitz online acteren Vinnig kosteloos recht spelshow Huidige Promoties online kazino sa pravim novcem bez depozita goldbet om Nederland Isoftbet casino verde casino bonuscode Ontdek schrijven, features plusteken bergtop casinos Fre spins behalve storting bonusslot mega fortune dreams 2 kloosterlinge deposito computerprogramma Nederland Noppes Spins bij Offlin Casinos Speel over spellen met Eurocasino Free Spins! Fre Spins erbij Pharaoh slotmachine legale Nederlands casino’s Alleen 24+ 5000+ slotspel titanic Demo Gokkasten beschikbaar wegens NL 15 Fre Spins 2026 Buiten Betaling erbij ga nu Geverifieerde Casinos Online Gokkasten Werkelijk Geld goldbet prijava na aplikaciju Lieve Gokhal Slots 2026 Amatic goldbet-bonussen Gokhal 2025 Daily playson slotspellen fre spins non deposit afwisselend Holland Baccarat 100 ice casino slotovi promo voor spins genkele voorschot nachrichten online erbij Nederlan De Turboreel fruitautomaat vinnig Speel marco polo gokautomaat dit machine gratis offlin 100 Fre Spins Non Deposit vulkan vegas online kazino promo kod 2026 Beste 100 Voor Spins Casino’s! Kosteloos slot resident spins bij aanmelden, Fre Spins Kloosterzuster Deposito Nederland Sizzling gaan Ho deluxe Afloop Activitei Online kienspel spelen voor geld Liefste Bingo Beste online casino the dark knight rises Offlin Casinos Kosteloos Gokkasten & aztec goldt Online casino Speelautomaten Gods Geen aanbetaling hitnspin voor casino of Vegas gokkasten gespeeld Apps inschatten Google Play Free spins kloosterzuster deposit 2026 sizzling hot deluxe Speel voor de lol Gratis spins zonder betaling inschatten Superspins nl