/** * 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 Quatro Local casino No deposit Bonus Y: 700 Totally free Revolves for Canadian Participants Internet casino Reviews Better Trusted On-line casino computer slots games wazdan Websites 2026 by the Getb8 Mobil portok Paysafecard Casino Sites 2025 Secure, Fast Dumps 2025 Ninja Magic Slots Is your Chance about this Gambling establishment Online game Online Casino inden for Danmark Gratis Spins and 100percent Avance Kasino bonus za registráciu Všetko, čo potrebujete vedieť! Seafood Group slot by Microgaming opinion play on the wild heist online slot internet at no cost! Kompletný zoznam online kasín Hrajte z pohodlia domova Better $1 Deposit Casinos NZ 2026 As much as 80 Spins to own $step one A valódi Madrid CF Wikipédiája Kasína s minimálnym vkladom Ako začať hrať bez veľkého rizika Greatest The fresh Real cash Online Pokies in australia to have July, 2026 Medzinárodné kasína Glóbus hazardu a zábavy The new Full Self-help guide to Local casino Regulations around australia The fresh Casino games You must Are within the 2025 Instant payout casinos that skip the wait and keep the action flowing Test Post Created 100%-ban ingyenes blackjack online, amelyhez a családtagoknak nincs telepítésük vagy regisztrációjuk Medzinárodné kasína Preskúmanie trhu a ponúk Lowest Put Gambling enterprises Uk Better Reduced-Risk Sites 2026 Minimum Deposit Casinos Canada 2026 Lowest Deposit Incentives Játssz blackjacket Kompletný Zoznam Kasín Objavte Najlepšie Online Kasína na Slovensku Finest twenty five Free Revolves No deposit Gambling enterprises inside the Southern Africa franarre med ma 21 bedste som Juli 2026 33874+ Demo Slots sweet 27 slot sites & 100 percent free Online casino games Gamble 100 percent free Ports having Added bonus 100 percent free Revolves: Are in the Trial Form Vex step 3 Kasína s Minimálnym Vkladom Hrajte Bez Rizika Kasínové bonusy za registráciu Využite výhody hneď na začiatku! Why Bodybuilders Need Aromatase Inhibitors Free online Ports Enjoy 5 free no deposit casinos Unique Gaminator Harbors online Greatest A real income Online casinos Top ten In the July 2026 Skip Cat from the Aristocrat Free Position Play Demonstration Guide Away from Ra Slot: 100 percent free Play sun of egypt hold and win slot free spins Demo & Review Online bridge 2026 Idrætsgren kortspil online nettet i kraft af vores guide Finest $5 Minimal Put Casinos Australian continent 2026 Reduced Deposit Internet sites Internet casino Analysis Greatest Trusted Online casino Websites 2026 because of so much candy slot bonus the Getb8 Not so long ago Mobile Slot Comment Betsoft Super Moolah Slot Comment ️ Best Super Moolah Internet sites 2026 Former Sparks Advisor Became Wings GM Trolls Once Profitable Paige Bueckers Sweepstakes Mayan Princess Opportunity Wikipedia Enjoy 19,350+ 100 percent free Slot online live craps casino Online game No Obtain Tilslutte Bank Spil Bingo på nettet hvis rigtige skattefrie middel Cryptocurrency & Bitcoin BTC Paying Investigation Gonzo’s Journey Position Opinion 2026 Have, RTP & Free Play Online casinoer ved hjælp af rigtige knap 2026 kan virk sno knap inden for Dannevan? Cleopatra Keno Greatest Approach, Incentives & Gambling enterprises