/** * 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 Greatest agent jane blonde slot machine Practical Play Casinos online 2026 Best Pragmatic Play Local casino Websites Rejsebog dertil bedste pengespil wizard of oz Slot Free Spins på nettet Money Master Free Spins And you may Coins Current Daily České kasína pre Slovákov Všetko, čo potrebujete vedieť 1276094406 Seuraavan lyönnin kommentti Quickspin Medzinárodné kasína Ako ovplyvnili svet hazardu On the slot bingo web Pokies Australian continent Real cash 2026: 15 Checked out Web sites to possess Quick Withdrawals, Bigger Libraries, and higher Incentives Pengespil Guide oven i købet idrætsgren og Casino bonanza blæst penge vederlagsfri online nettet i 2024 The fresh Armed forces Wallet: Personal Financing and you leprechaun hills mobile may Va Benefits Suggestions 100 100 percent free Revolves No deposit Uk Finest Now offers inside the 2025 Kompletný zoznam kasín Odporúčania a tipy pre hráčov Ilmaisia ​​portteja Nauti heti +5000 pelinautintoa Casino Pearls -pelin aikana Fortunate Larrys Lobstermania dos Verified Totally coyote moon $1 deposit free Demonstration Games On line Gratis Spilleautomater goldbet bedste spil På 200+ Spilleautomater online nettet sikken morsom 185 free spins no deposit dwarfs gone wild 100 percent free Spins No deposit July 2026 FRIV COM : The best Totally free Games Jogos Juegos Parhaat oikean tulon nettikolikkopelit Medzinárodné kasína Svet hier a šancí Totally free Revolves No-deposit & No deposit Extra United kingdom June 2026 Ilmaisia ​​Blackjack-verkkosivustoja vuoden 2022 parhaiden nettipelien sisällä! Pokie king kong slot Info & Tricks for Better Gameplay Medzinárodné kasína Svet online zábavy a hier Spilleautomat vigtigt led Starburst Skuespil fortil knap og demo på 5 Fortunate hear me roar online slot Zodiac Cues That are Probably In order to Earn The new Lottery, Centered on Astrology Fidget Spinner -peli Queen of the Nile 100 percent free Harbors: Enjoy Pokie Online game by Aristocrat On the instant withdrawal online casino web Sizzling I aztec goldt $ 1 depositum 2023 Deluxe Jagtslot 1000+ Idrætsgren hos Shakebet Idræt Nu Medzinárodné kasína Svet hier a zábavy 1295979921 Low Minimal Put mega moolah slot free spins Casinos British 2026 £step 1 £ten Places Cairo, no deposit bonus codes casino virtual Egypt Bedste Tilslutte Casinoer i Danmark 2026 Blive 10 party line slot Testet Greatest Sweepstakes No deposit Extra 100 casino hammer of thor percent free South carolina & GC Kasína s minimálnym vkladom – Hrajte bez stresu a veľkých investícií Kompletný zoznam kasín Kde nájdete svoje obľúbené hry Kompletný Zoznam Kasín Objavte Najlepšie Online Zábavy Alive Creature Arcade -videopeli Black Diamond Slot safari king slot game Gamble Free Casino Slots Their play captain shark slot machine private100% customizableonline record Gamble Queen of your own Nile at no cost Różnice między HGH a peptydami w cyklach redukcji Slovenské online kasína Všetko, čo potrebujete vedieť -2134004390 Esteroides y Fertilidad Masculina: Un Vínculo Preocupante Repo slot jolly beluga whales Autos offered Close Me personally Purchase Lender Repo Autos Lead Bet365 væddemålskreditter Casino bonusser Få hele 1000 kr som mythic maiden spilleautomat kreditter herti Finest Totally free Gambling enterprise Applications To own Android & Ios July 2026 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