/** * 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 Golden Gals Demobån Play secret of the stones online slot Free Jagtslot Game Rigtige Knap Gryphons Steri Ingen gold fish vulkan vegas kontakt i danmark 120 Gratis spins Indbetalingsfrie Spins Slots 2024 Guidebog Napoleon: Go up away from a toki time mega jackpot kingdom Position Read All of our Opinion and you will Gamble so you can Earn Larger Nye bier haus WIN Casinoer 2024 lobstermania 150 Gratis spinsanmeldelser Pro Danmark Matex farvetone d. Banja Luka Medbringe free spins plu gratisspinn uten Bedste ingen depositum hitnspin 2026 innskudd tilslutte casino Greatest Crypto & Bitcoin Sweepstakes Gambling enterprises from inside the August 2026 19 Top Crypto & Bitcoin Gambling enterprises in 2026 Idræt på spillemaskiner foran ganske middel: Opdage det slot vulkan vegas casino danmark casino herti! Καζίνο Χωρίς Χρήματα Διασκέδαση και Ευκαιρίες Online Casinos Approving Neteller: A Convenient and Secure Alternative Διεθνή Καζίνο με Διαφορετικούς Κανόνες Ανακαλύψτε την Ποικιλία Discover the Thrill of Gaming with the BC.Game App Night Win Casino Review: Why the 40x Wagering Rule Kills the Bonus Value Scopri la Magia della Slot Machine Sphinx 1357677782 Experience the Thrill of Aviator Casino Game Discover Strategies and Gameplay Scopri il Fascino del Casino Aviator Gioco, Strategia e Divertimento Demo Big Bass Splash La Aventura de la Pesca en Línea Greatest 3 Online casinos One to Undertake Dollars App 2024 Most readily useful Bitcoin Casinos during the 2026 Top internet casino web sites you to deal with Bitcoins Casino utan svensk licens En djupdykning i spelvärlden Candyland casino login – what UK players need to know Candyland Casino UK – Full Review, Bonuses, Payments & Mobile Guide Candyland casino no deposit bonus steps and methods Candyland casino promo code app and mobile guide for UK players Candyland Casino Online Guide – Bonuses, Payments, Mobile App & UK Licensing Avantgarde Casino reviews – security guide for UK players Avantgarde Casino Review: Bonuses, Payments, Mobile App & UK Player Guide Avantgarde Casino App steps and methods for UK players Betti Casino UK app and mobile guide: play on iOS, Android & browser Betti Casino Review – UK Bonuses, Fast Payments, Mobile App & Security Avantgarde Casino Welcome Bonus – Payment Methods, Fast Deposits & Withdrawals for UK Players Avantgarde Casino No Deposit Bonus Code: Account Verification & Claim Guide Avantgarde casino bonus codes – what UK players need to know Rolletto casino review – what UK players need to know Rolletto casino login: overview and options for UK players Code Promo Rolletto Casino – What UK Players Need to Know Rolletto casino online login: what you need to know Rolletto Casino Reviews – How to Register Quickly (UK Guide) Rolletto Casino UK Login Guide: Step‑by‑Step Registration, Security & Bonuses for UK Players Betti Casino Review – Bonuses, Games, Payments & Mobile Guide for UK Players The best Gambling enterprise Internet in Ireland within the August 2026 Better Online casinos Ireland ️ Best local casino internet inside the August 2026 Greatest Casinos on the internet Ireland 2026 Most readily useful 20 Irish Gambling enterprise Web sites Ireland’s Most readily useful Online casinos 2026 An informed Casino Sites Most readily useful Casinos on the internet Indonesia: Top ten Websites 2025 Casinos on the internet into the Indonesia Best A real income Selections to have 2026 Most readily useful Real money Web based casinos inside the 2026 Positions an informed Web based casinos in the us 2026 Most useful Web based casinos inside the Canada having 2026 Top & Tested Usa Web based casinos: 30+ Greatest Gambling enterprise Internet 2026