/** * 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 Мистериозната кралица на вашия Нил с депозит Промоция verde casino от $1 в Shrine Position Canada Demo RTP House Hazard pod telefon komórkowy Maszyny bezpłatnie do nabycia Loaded video game Wikipedia απολαύστε κουλοχέρηδες online χωρίς κόστος Happier Getaways Demonstration Play Position Games a hundred% 100 percent free Darmowa kasa zbytnio rejestracje z brakiem depozytu po kasynie online Pleased Vacations Slot machine game Take pleasure in a free of charge Play Trial Here! Gra hazardowa Highway Owe Hell wyjąwszy depozytu Κωδικός προσφοράς BetOnline & κίνητρα για απόκτηση τον Ιούνιο του 2026 15 Most incredible Towns inside Taiwan to visit Complete 2026 Guide Kasyna spośród błyskawiczną wypłatą w polsce 2024 Kasyno spośród Błyskawiczną Wypłatą Company advice Finest The newest Web based casinos in australia to have 2025 Top Number Gorgeous Shots Slot: Information, 100 percent free Spins and a lot more Κωδικός προσφοράς theScore Bet WTOP: Βαθμολογία $step 1,100000 Κίνητρο για την απόκτηση Αγγλίας-Κροατίας, Παγκόσμιοι αγώνες Glass Gonzo’s Journey Megaways Demo Free Enjoy Slot Comment Najkorzystniejsze Kasyna Przez internet na terytorium polski przy 2024 po Casino com Porównaj Teraz Hot shot Gambling establishment Position 100 percent free Progressive Online game On the internet All of our Lapland British Review, Tips and hints 100 percent free Spins No-deposit Incentives Earn Real cash 2026 100+ Colour out of Silver Color Labels, HEX, RGB & CMYK Requirements Nadprogram bez depozytu w całej kasynie internetowego graj za darmo Hot-shot Ports, Real money Video slot & Free Gamble Demonstration #1a5c2a #fafafa ο φρέσκος βιντεοκουλοχέρης jumanji #0b2c3c MUHAMMAD AMIR Wonderful Goddess Slot Gamble So it IGT Games free of charge Netherowe złoże złota Portugal Community Glass Chance Update: Small Float Once step 1-step one Tie With DR Congo 37 Type of Holly Woods Having Photographs and you can Personality Fantastic Dragon Gambling establishment Sign on Fantastic Dragon gambling enterprise: Formal Webpages Rozrywka przy kości normy Poker, 1000 i Yahtzee Tablica punktacji Παιχνίδι επίδειξης Dragon Shrine με κουλοχέρη εκατό% δωρεάν June 30 The official website of your own Royal Members of the family The brand new Regal Members of the family 100 percent free Revolves Sizzling Hot uciecha hazardowa Zagraj w robot przez internet bezpłatnie High-society Demo Position Online game International Totally free Demonstration Darmowe Gry hazardowe Automaty Hot Spot, Rozrywki Hot Spot Online bezpłatnie Παιχνίδι κουλοχέρη Thunderstruck 2 Forklift Τοπική ενοικίαση Φιλιππίνες Jurassic Playground Wikipedia Brightstar stretches Ghostbusters lotto rights in the five-12 months Sony revival Better 80 Totally free Spins No deposit Bonuses 2026 MONKEY MART Graj darmowo Online! 80 100 percent free Revolves No-deposit Bonuses What is actually an excellent Geisha? The way it is About the newest Lifestyle Co je to vlastně Desatero? Definice položek a příklad Mega Moolah automat do gry przez internet za darmo bez zapisu Video game from Thrones: Kingsroad to the Steam The fresh 50 100 percent free Revolves No-deposit 2026 ️ Done Checklist Enjoy Slots On the internet for real Money United states: Top Gambling enterprises for 2026