/** * 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 Soluciona gratuito en Zombie Slot Deluxe 1xslot Casino en modo demo Gamble Free Harbors Video game for fun Zero Sign up Required 2026 Jackbit Gambling enterprise a hundred 100 percent free Spins No-deposit 2026: Code & Words Read the latest gambling enterprise promotions of BetMGM and you will FanDuel so it sunday #step one Online casino Book to have Players the world over! Boku Casinos online Easy & Safe Deposits Новата хронология от раздялата на Ариана Гранде Промо кодове за казино vulkan spiele и Далтън Гомес е объркана 100+ Different kinds of Fish Brands A z making use of their Pictures No-deposit Incentive 40 free spins at the Europa777 Gambling enterprise July 2026 An educated Totally free-Enjoy Social Casino in the us Cleopatra Extra Thunderstruck 2 juego de bonificación tragamonedas A knowledgeable 100 percent free-Enjoy Social Gambling establishment in america Enjoy Seafood People Free inside Trial and read Remark Play Flame Joker slot the real deal money during the online casinos 123Vegas Gambling establishment No-deposit Bonus Rules: step one 2 step three Why don’t we Go Fats said: over loaded, unsaturated and you can trans fats Avantgarde Casino & Sportsbook Revolutionizing Online Gambling Wild Gambler contacto FairSpin en chile Competir Tragamonedas Gratuito sin Dinero Tokyo Casino Hrat Objevte Svět Online Hazardu Кралят на твоята собствена позиция Nile II от Aristocrat Играй напълно безплатно, RTP: 95 vulkan spiele българия бонуси 86% Monsterwinkasino CZ – Oficiální online 64058921 Fantastic Five Position Review 94 88% RTP Playtech 2026 Great Five Playtech Slot Remark and Demonstration July 2026 Най-добрите онлайн слотове в слот игрите с истински Промо кодове за verde casino пари за 2026 г. The fantastic cuatro: Very first Steps online streaming on the internet Cotas casino 100 Cats sobre Juegos de Casino 2026 Pragmatic Play, Evolution y Mayormente Delight in Fairy Gate free 60 totally free revolves no-deposit in to the Trial and read Advice FA FA FA Demo from the TaDa Betting Online game Opinion and 100 percent free Position Una slot Zombie Hoard: jugar regalado así­ como 150 posibilidades Piggy Riches para dinero favorable Obtain the new APK away from Uptodown Duxcasino Sign on Secure Check in for you personally FaFaFa Slot On the internet Enjoy Gambling games free of charge by the Aristocrat Сто напълно безплатни без депозит Revolves 2026 Също бонус за регистрация verde casino така предлага далеч от най-добрите хазартни компании Casinos Online con Dinero Favorable : casino Mr Green login Las Superiores acerca de 2026 Fa Fa Fa OCGS Бонуси на местното казино Maneki за юни 2026 г., предоставени Промо код за слотове ice casino с Loopx Sky Las vegas Greeting Give July: 70 Definitely 100 percent free Revolves No deposit Dr Bet Review Log in and you will Receive Private Bonus Requirements Dr Wager Wagering Web site & Local casino WorldMatch Slots ve ahora Play Free WorldMatch Slot Game Demos Dolphin´s Pearl Slot Video game Demonstration Play and Free Revolves Dragon Dancing Position by the Game Worldwide Enjoy Free Trial Безплатни завъртания Приложение ice casino за изтегляне на apk без депозит Хазартни компании: Uptown Aces' Най-новото безплатно Revolves Extra Objevte vzrušení ve světě Starcasinokasino CZ 54361703 Why fantasy publishers and you may filmmakers cannot get an adequate amount of dragons Бонуси без депозит със 100 процента безплатни завъртания в Ирландия през 2026 бонус bombastic casino г. An educated Casinos on the internet Philippines with Free Register Added bonus 2026 Cousin Casino Web sites 2026 Sites Just like your favorite List Objevte vzrušení a zábavu na Starcasinohrat CZ 52102421 Soluciona regalado a Multi Descarga de la aplicación PrimeBetz Hot 5 Wild acerca de manera demo