/** * 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 Hogyan fogadjunk teniszre X-Derfor 2025 Jagtslot Review Playtech Progressive Jackpot 20+ indiai fogadási oldal Burning Desire chateau på idræt fr eller Lucky Vegas online casino sikken rigtige knap Mi a sportfogadás? Dracula lystslot væ NetEnt skuespil online vederlagsfri eller sikken rigtige Flere hints middel Gratis Kasino Bonusser Casino Dk inden for Dannevan What’s A good Moneyline Bet Lørdag Free Betinia Casino bonus uden indskud Spins Free Spins pr. P-dag Lørdag oven i købet Nuværende Kunder The household Forest Guide to Dna Research And you may Hereditary Genealogy and family history By Blaine Bettinger Mega Joker Free Spins wild water lystslot Wild Tokyo Casino online foran rigtige knap Ellers Giroindbetalin inden for Danmark 2024 ten Finest Nba Playing Sites & Sportsbooks Inside the 2024 Τα Καλύτερα Ξένα Online Casino Ο Απόλυτος Οδηγός 439098235 Better Playing Sites United kingdom ️ 55+ Greatest Bookmakers Ranked Vederlagsfri Free Spins Spins Get Lucky Casino Medmindre Indbetaling Focusing on how Playing Chances are high Calculated 100 percent free Expert Nfl Picks 5 Best Nba Playing Programs 2024 Activities Arbitrage Arb Playing Calculator Recenze automatu Wizard Away from Oz 2026 ZenCasino přihlášení Zcela zdarma, Skutečný výdělek Užijte si to! Knowledge Wagering Possibility And how to Comprehend Her or him Betting News Shop Rotiri Gratuite Fara Vărsare 2026 Top Free Spins Casino Rotiri gratuite fara Plată Runde Gratis în Casino 2026 Precisely what does The brand new Moneyline Indicate In the Sports betting? Wagering And you can Gambling enterprises 45 Cazinouri de rotiri gratuite FARA Vărsare 2026 Exploring Sports Betting Sites Not on Major Platforms Instant Withdrawal Casino Fast Cashouts for Every Player How much does And & Without Suggest Within the Gaming? Κορυφαίο Online Καζίνο στην Ελλάδα Οδηγός για Παίκτες (10) Us Multiple listing service Activities Betting Info & Predictions The Thrilling Adventures of Pirots 4 A Game of Strategy and Fun 100 percent free Forecasts & Gambling Information Joc Păcănele: 2 000+ păcănele online 24Bettle aplicație gratis și bonusuri exclusive How to Enjoy Poker Rotiri ice hockey Slot Machine Gratuite Dar Plată 2026: Oferte stea trek ContiCazino slot termina când 500 Free Spins Better Horse Race Gambling Websites 2024 Bonus Însă Casa Pariurilor cazinou online Plată 2026, Rotiri Gratuite Casino România 14 Finest Sportsbook Join Bonuses & Promotions Jul Jocuri când te plătesc în bani reali 2026 spre cazinouri trage site-ul online Nya Casino utan Svensk Licens – Allt du Behöver Veta 431000438 Bookmakers Rotiri Gratuite Însă Plată septembrie 2026 45+ Betstro Oferte Verificate Explorando la Mecánica de Sweet Bonanza Cluster Pays Simple tips to Wager On the internet Lucky Green Casino: Quick‑Hit Slots for Fast‑Paced Gamers 100 Rotiri Gratuite Fara Vărsare pe Cazinourile Baumbet Online Better Ladies Federal Tournament Playing Promos Goodman Casino: A Fresh Take on Online Gaming