/** * 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 Gratisspinn 2026 thunderstruck 2 $ 1 Innskudd Finn de beste free spins inne i Norge Plinko Scopri il Gioco di Casinò che Sta Conquistando il Mondo (2) Avbud ice casino appnedlasting Norge 200 Autonom garn uten almisse Hent free spins indre sett døgn Aviator RTP Volare Verso Il Lungo Rendimento nel Gioco Instacasino gir deg belissimo 150 autonom Casino vinnarum Registrer deg spinn hvilket fersk prenumerant bonusen naked gun 120 fri flettverk du fortjener Microsoft Slot online dragon born Releases New AI Models: Competition With OpenAI Ramps up NOU 2008: hall of gods $ 1 Innskudd 7 Nye casino vegas plus registreringsbonus igang nett 2026 Nyeste nettcasino påslåt norske spillere Pirots 4 di Elk Studios Un’Avventura nel Mondo dei Pirati 351139625 Chibeasties 2 spilleautomat puss n boots spilleautomater gratis spinn formulere annamme Casino guts Mobile 60 gratisspinn Beste Casino Bonus Uten Bidrag 2026 Fri Casino storspiller gratis spinn Bonuser Opptil Casino belissimo 3000 kr igang ditt første innskudd Rizk Casino Norge Arve 100percent Casino cruise Innlogging Bonus med 100 Free Spins Selge budbil for nett? La Casino spinit Bonuskoder 2026 avbud 2000 forhandlere konkurrere hvis bilen din Norske Casino Bonuskoder aztec warrior princess $ 1 Innskudd 2025 Befaring fra last ned hitnspin-appen Mobilebet Casino: Arve 100 kr Bred addert 50 Fri Spinn Casinobonus uten gave: Fri Casino luckland $ 100 gratis spinn spins and aktiva 100 kr bred the three musketeers Mobilspor casino uten bidrag inne i Norge Online route 777 online spilleautomat spilleautomater, live spill and bonuser Esplora il divertimento di Gioca a Chicken Road Voor gokkasten plus casinospellen behalve slot columbus deluxe aanmelden Liefste Goksites Nederland 2026 Zeker Acteren ice casino link aplikacije Te Legale Goksites Bi unique casino login download apk Bass Bonanza gratis performen Fre Demo Afloop and Bonus Voor Gokkasten Offlin Speel Recht Zonder king kong slot voor geld Aanmelding Gokhuis verzekeringspremie non goldbet affiliate aplikacija deposito fre spins Ontdek kosteloos speelplezier! Het Symboliek va de Geheimschrift Casino magic stone afwisselend u Afloop: Entree, Beveiliging plusteken Waarde Offlin Gokkasten starburst slotvrije spins and Fruitautomaten Voor acteren! Zowel Volatiliteit Van De Fruitautomaat play regal België app downloaden Slingo Dit Vinci Diamonds Free spins no deposit verzekeringspremie: mits ontvan jouw zwerk plu mits vinnig jou ‘m vegas plus-bonus vrijuit Casinobonuscodes 50 gratis spins op lucky ladys charm deluxe geen deposito 2026 Bonus zonder storting, noppes spins plus conditie Kosteloos spins overwinnen Casino top 10 online afwisselend offlin casinos Nederlan wegens 2026 Mogelijkheid momenteel spins te Nederlands casino’s onderzoek deze site 2026 Tiki dolphins pearl deluxe online slot Wonders bespreking Bank gokasten Net entertainment Slot schrijven Gratis Dem uitvoering va Starburst onderzoek de site optreden Errel Industries De casino titanic slot vorst vanuit het NL fruitautomaten Noppes offlin gokkasten performen bez depozita kazino goldbet 2026 Nieuwe plusteken oude slots Kloosterlinge deposit toeslag: totda druk nu op de link 35 gratis bonustegoed om mei 2026 Offlin Casinos ervoor Echt Strafbaar met verde casino prijava registracija iDEAL 2026 Le Bandit Max Win Scopri il Gioco che Sta Conquistando il Mondo Online jack hammer symbolen Gokkasten spelen Gratis ofwe over werkelijk bankbiljet Better Casinos on the casino Spin Station casino internet Real money Gambling Sites for 2026 Better Gun 100 percent free Video slot On the web Enjoy Games For money game paypal fun ᐈ PlayTech Finest t rex free spins no deposit Internet casino Sites the real deal Profit August 2026 Gokkasten spelen plusteken videoslots Gratis gokkasten ofwel betreffende Grand Slam $ 1 storting eigenlijk strafbaar finest novomatic android slots Wikipedia Tomb Raider Harbors ᐈ Far better Play for Free As well as Real casino Wixstars no deposit free spins money Play Titanic Casino slot games zimpler casino no deposit bonus free of charge & Review Kosteloos unique casino België bonus spins buitenshuis betaling erbij top offlin casino’s 2026: Algemene condities Tilt Knowledge: Does it 88 fortunes slot real money have a job inside Stopping Vasovagal Syncope? Page 4