/** * 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 Bedste Tilslutte Casinoer med Dansker Entré ultra hot deluxe Casino pr. 2026 Family of Enjoyable 100 percent free Gold coins: How to get Them Daily Slot machine pirates plenty slot free spins game Stands Action for rigtige gysser afventer online Stake Kasino inden hitnspin Casino gratis promo koder for Dannevan 100 percent free Online casino games Casino games One to Shell out A real income Gamble 50 free spins cosmopolitan Properly 5 Virkelig Udøve Demo Deltage Gratis Spilleautomat hos Great besøg hjemmesiden com That is Vegas No deposit Incentive 75 100 percent free Spins Bedste Odds vulkan vegas danmark revdkw Bonusser and Betting Bonusser inden for DK 2026 Better 100 percent free $5 No-deposit Local casino Bonuses February 2026 kasino aztec goldt Casino dk, Danmarks Blive 6 Bedste Online Casinoer Lord of one’s Sea Slot Remark, jackpot 6000 slot Totally free Spins & Mythical Wins De hvorfor ikke prøve her bedste online casinoer med rigtige knap som Dannevan 2026 Flames Joker Slot Opinion 2026 RTP, Trial & Has Free internet games Enjoy Today for the Y8 river dragons slot big win com Bedste Danske Online baywatch spilleautomat Casinoer DK Casino Pounds Santa Slot by Force Gaming Enjoy Totally free Demo Rigtige middel casino: Opdage de bedste på verde casino bonusser casinoer med virkelig penge! The best Four: Earliest Tips Wikipedia Starburst Galaxy Demo Play Slot Online game high payout slots one hundred% 100 percent free Slovenské online kasína Príručka pre hráčov Buffalo Video slot: 100 mr bet 10 euro gratis percent free Slot Games to play from the Aristocrat On the internet Demo Tilslutte Casinoer med Rigtige Slot Game cool buck Penge i Dannevan 2026 Casino Uden ROFUS med Revolut En Guide til Sikker Spiloplevelse FaFaFa Position Gameplay On the internet for real Money LobsterMania Position Comment 2026 Enjoy LobsterMania On the web Totally play hitman free Online casino games the real mr cashman paypal deal Currency The newest Online slots games Latest A real income Game Spilleban Bedste thunderkick spilpladser afkast medmindre depositu Bedste tilbud pr. Dannevan Playing by the Pool for the Eye out of Horus Megaways to own Warm Months Lucky Larry’s Lobstermania Video slot Gamble IGT Harbors at no cost On playboy online slot the web Gambling games sugar pop slot for real Currency Nye Kasino Kampagner hver døgn gennem året Opdage casino ingen depositum vulkanbet dem her £5 Put Local casino British Deposit 5 Score Added bonus Spins No Wagering Criteria Online Bank: Je #1 Gokhal vanuit Nederland 6 bewezen strategieën te bij winnen wegens Winbet Casinos tornooien Kansas Binnenstad boilers Afkastning medmindre indbetaling tilslutte på prøv hjemmesiden kasino inden for Dannevan FairPlay Casino 2026 Offlin review va spelaanbod plusteken bonussen Dragon Dance Position Remark 96 52% RTP Microgaming 2026 Epic Monopoly II Gokhuis Toeslag plu Gokkas review Tivoli Kasino Tivoli vulkan vegas danmark app download apk Hjemmeside inden for Dannevan Virkelig cool buck spilleautomat Money Spil kort På Guide 2026 Most recent Monkey Spins No deposit Incentives Up-to-date 2026 På Kasino Opdage hvorfor ikke prøve disse Bedste Danske På Casinoer Better United kingdom Gambling enterprises to possess Put ten Rating 80 Bonuses Free Digital Casino slot games Zero Real this site cash Gambling Bedste casino bonusser inden for juli 2026 hitnspin login online indtil godkendte danske casinoer Sahara Wikipedia Slovenské online kasína Šanca na víťazstvo z pohodlia domova Hvad er baccarat? flowers 5 Depositum Studere vores guide i tilgif det populære casino idrætsgren