/** * 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 The Selling Bras, Underwear, Apparel & Much more Green Money box pokie: Twist to Winnings Large having Novomatic Play Columbus Deluxe Totally free Position Lay Cruise to have Larger Victories Online Najbolje web stranice za kockanje u četiri smjera koje treba uzeti u obzir: cijene mobilnih Veza za preuzimanje aplikacije ice casino telefona u 2026. Pharaohs Luck Slots IGT 100 percent free Demonstration Online Ports: Play Local casino Slots Enjoyment Deset ili Promo kodovi za vulkan vegas dvadeset online pozicija Wazdana Better Free Spins No-deposit 2026 Winnings A real income Finest £29 100 percent free No-deposit Local casino Bonuses Greatest 2026 Uk Now offers Svi predlažu senzualno dobro svježe ice kasino bonusi voće Slot Komentar Klađenje Potpuno besplatno sada Spend Dirt Demonstration Harbors from the RTG Review & Free Enjoy Best Australian On the web Pokies » Free Incentives! Najbolji ice casino prijava na mobitel Amex kasinoi u SAD-u 2025. Gamble Online Pokies Slot machines: The newest & Popular Games Crazy Pandait’s a cracker Online Pokie 100 percent free Gamble Position Online game. 7 Finest Real money Video poker Web sites 2026 Enjoy Owl Eyes Totally free Light & Question Free Trial Enjoy Far more Chillies Pokies Machine the real deal Money Better Casino slot games inside the 2026 No deposit gambling enterprise incentives Totally free gambling enterprises Potrošnja od strane je li goldbet stvaran mobilnog kockarnice Plaćanje zbog troškova mobilnog telefona kockarnica u 2026. godini Greatest No-deposit & 100 percent free Signal-Right up Gambling enterprise Bonuses August 2026 fifty 100 percent free Revolves No deposit Best 2026 membership also offers Brokerski rulet u stvarnom vremenu i poslovni rulet za kockanje u stvarnom vremenu: vulkan spiele Hrvatska prijava resurs iz 2026. Free online games from the Poki Gamble Now! Gamble Large Finest Harbors Online Bolja poduzeća za kockanje nude kazino Aplikacija vulkan spiele za android igre i zarađujete pravi novac Centurion Megaways Slot Trial Motivated Betting Finest a real income online slots games Play slots the real deal currency al com On the web Pokies Australia Finest A real income Pokies Web sites 2025 Top Local casino Gaming Publication to own 31+ Ages Besplatni online Promo kodovi vulkan spiele elektronički poker 2026 Gamble 180+ video igra bez registracije Real money Pokies Australia Enjoy On line Pokies the real deal Money in 2026 100 posto besplatni Revolves bonusi goldbet stara verzija prijave Najbolji 100 posto besplatni Revolves kasini u 2026. godini Greatest PayID Casinos in australia for 2026 Better PayID Pokies paysafecard kockarnice online verde casino prijava kockarnice koje možete isprobati na paysafecardu 2026. Trenutno Gamble Diamond Exploit because of the Strategy Playing 100percent free to your Local casino Pearls Craps On the web Laws, Variations & Approach Besplatne Aplikacija ice casino internetske igre na Poki Gamble Now! Finest Payout Casinos 2026: Quickest Commission Large RTP Casinos Gamble Golden Goddess Video slot Free IGT Zero Download Najbolji online Blackjack kasinoi za vulkan vegas kasino HR pravi profit 2026. Trusted Gambling enterprise Betting Guide to have 29+ Years Totally free Spins No-deposit Gambling enterprises NZ 2026 Real cash Victories $one hundred No-deposit Gambling enterprise Bonuses August 2026 No-deposit Added bonus #step one Best No deposit Bonus Gambling enterprises 2026 Bonus kodovi za Uptown Pokies za kolovoz 2025. Izvrstan popust od 20 kasino bez depozita vulkan spiele 2026 USD bez depozita How to Move from Free Play to Real Money at Cashed Casino Usa No-deposit Gambling enterprises & Incentives 2026 Gambling establishment Wikipedia No-deposit Bonuses NZ ️ Score $5 at no cost