/** * 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 200 Totally free Revolves No-deposit Biggest 2 hundred+ Free Spins to possess 2026 Gamble Přihlašovací počítač gate777 Starburst Změňte omezený formulář na nebo na váš počítačový systém YouTube kasino bez vkladu goldbet YouTube Let Sunrays Castle Gambling verde casino apk вход Enterprise Бонус без депозит 105 безплатни въртения юни 2026 г. Washington Bonus za přihlášení gate777 Diamondbacks Jesu li Stacked legitimni? Otkrijte šta kažu recenzije u 2026. Jack kao i Beanstalk Slot Gamble 96 dvadeset osam% RTP, 7100 xBet Maksimalna pobjeda Risk vulkan vegas мобилно казино Easy English Wikipedia, новата 100 процента безплатна енциклопедия Pregled pozicije Lobstermania: RTP i probni period i dobit ćete informacije Čak 18.100.000 bonusa i povrata novca u online kazino igrama Gamble Online Harbors Ultimate Center besplatno Portovi bez preuzimanja Recenzija igre Queen of your own Nile Demonstration od Popiplaya i potpuno besplatni slot Cashwin CZ 2026 – Registrace Vše, co potřebujete vědět 1460555453 Srećni Larryjeva manija jastoga: Uživajte u portovima online za zabavu Igranje Cat Sparkle Position Potpuno besplatni IGT slot aparati na internetu স্টারবাকস অনার অ্যান্ড হ্যাপিনেস গেম আইজিটি ঘোস্টবাস্টার্স স্থানীয় ক্যাসিনো বিটল ফ্রেঞ্জি পোকিস চালু করেছে Thunderstruck Nuts Super Position Remark 2026 100 процента безплатно Играй демото كازينو 21 Dukes المحلي * 80 رمز مكافأة مجاني 100% بدون إيداع Най-добрите онлайн казина в Съединените американски щати за 2025 г. Реален доход, стимули и най-новите сайтове. Най-добрите онлайн казина за 2026 г. Анализ отгоре по отпред. Играйте Wished Lifeless или неопитомена игра на залози от VIP крипто хазартно заведение Вход за goldbet Hacksaw Gaming Казина Zimpler 2026 Вижте най-добрите verde casino регистрация за вход казина, които да предприемете Zimpler Неактивна vulkan spiele бонус за добре дошли или активна позиция $250 добавен бонус Промо кодове без депозит за казино goldbet за рендериране на новото членство в 360 Examining Бонус кодове и отстъпки hitnspin бонус код днес за местното казино Zodiac юни 2026 г. حوافز كازينو ريغال سوايب 2022 ZeelandNet, startpagina опасност високо напрежение slotvrije revolves vulkan spiele вход в казино vanuit Zeeland Най-добрите hitnspin казино бонус кодове онлайн казина за всички нас за 2026 г. – проверени, оценени и рецензирани RTP на слот машина Промо кодове verde casino Chain Mail, Extra и хазартни предприятия във Великобритания Дизайн на членството в Slottica Casino стъпка по bombastic casino бонус код 2026 стъпка Най-добрите слотове без депозит 2026 По-добри портове без депозит казино без депозит vulkan vegas Също така предлага ألعاب مجانية عبر الإنترنت خلال فعالية بوكي بلاي توداي! ما هو نطاق بكرة الوضع A تحديدًا؟ إجابات على أسئلتكم 83 أحدث قواعد إضافية بدون إيداع، سيتم تحديثها يوميًا حتى يونيو 2026 تجربة لعبة Phoenix Sunshine المجانية Kosteloos Spins gedurende Aanmelding 2026 ⭐ 150+ Casino PrimeBetz promotiecodes Free Spins Noppes gratis Ash Gaming gokkasten geen download met bonus Gokkasten Spelen Proefopname Slots Buitenshuis Inschrijving Vinnig kosteloos online gokkasten Casinomeister slot Niemand downloa ofwel aanmelding vereist Gokkasten ervoor genot Eersterangs 5 Eigenlijk Strafbaar Online gokkast Igrosoft Casino’s Speel plusteken bries in geld Vinnig voor gokkasten plus genkele BetPrimeiro mobiel inloggen downloa Nederlands offlin gokspellen Scoor noppes spins Avalon II 3d slot ervoor dit NetEnt gokkast > 2026 Noppes Coyote Cash gratis spins geen storting Spins te Offlin Casinos Speel in Free Spins! Speel Mateloos Tal Offlin Slots Online Gokkasten Kanga Cash gokkast gratis spins Unibet Programma Noppes Spins 30 gratis spins Shoot 2026 Complete Staat Free Spins NL! Monsterwincz CZ 2026 Budoucnost online hazardních her Finest Payment Online Slot Machine for Ultimate Gaming Experience Play for free Slots Online Best two hundred% Deposit Incentive Also offers in the uk to have July 2026 Безплатни слот игри, за разлика от изтеглянето или Промо кодове без депозит за казино hitnspin абонамента Най-доброто казино с лотарии според най-високите разходи Промо кодове за слотове verde casino – в стимула