/** * 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 eCheck Gambling enterprise 2026 Finest Gambling establishment Web sites You to Deal with eCheck Dumps Book from Ra play Aviatrix On the web Slot Free Trial & Bonuses BonanzaGame Gambling enterprise Comment 2026 Ports, Royal Joker casino Bonuses & Analysis 2026’s Best Ukash Casinos Lucky Jet on the internet Cash Wizard World Book of Ra Deluxe Position Remark 2026 Try the brand new Games Of Bally Today 100 Rotiri Gratuite ONJN 2026 Cazinouri Online printre România 100 Rotiri Gratuite ONJN 2026 Cazinouri Online dintr România Winmasters Bonus Fără Depunere 300 Rotiri Gratuite Cod Bonus King Casino însă vărsare exclusiv 300 Rotiri Rotiri gratuite dar depunere 2026 Foai de Rotiri Gratuite în cazino Game World Bonus însă 50 rotiri gratuite crystal forest Vărsare 2026 100 Rotiri Gratuite Bonus Însă Vărsare cupto 2026: Betmen 22 Oferte Casino care Rotiri Gratuite Ci Achitare Recenzii Cazinouri Online, Bonusuri & Rocketpot Ghiduri 20 Oferte Bonus Însă verifica blogul meu Vărsare deasupra 2026 Joc 100% grati Tu Oferte Casino rollino casino autentificare Online România 2026 Bonusuri exclusive Bonus Dar bruno casino Plată iulie 2026: 22 Oferte Casino care Rotiri Gratuite Dar Achitare Top 73 bullsbet Cazinouri Online în iulie 2026 Casino Noi Romania Tu 230+ Oferte de Casino Online România & verifica acest site Cazinouri Noi iulie 2026 Gymboland link util Promenada Bucuresti Cele tocmac puternice jocuri printre 2023: cum le poți roti deasupra calculatorul efbet adânc Bubble Shooter Jocuri Joacă Lucky Kong Grabnic spre Y8 com Top 34 Cazinouri Savaspin Online Licențiate din România 2025 Rotiri gratuite betpanda casino ci vărsare 2026 Filă ce Rotiri Gratuite pe cazino Cân transferi bani spre și poki bonus fără depunere printre exilare neorigina? 3 Metode 2024 Bonusuri Seven Însă Plată în Cazinouri Licențiate România 2026 20 Z brakiem Depozytu Darmowa Lada pharaohs premium dwóch slot W ciągu Rejestrację Bez Depozytu Bonusy bez Depozytu Kasyna Najpozytywniejsze Ogłoszenia 2026 Darmowe Crystal Forest slot internetowego Zagraj bezpłatnie w robot z brakiem zarejestrowania się Najkorzystniejsze Kasyna Sieciowy pod Oryginalne Finanse na terytorium polski 2026 Sizzling Hot Deluxe automat Novomatic zagraj online Najpozytywniejsze oferty bonusów bez depozytu po kasynie w całej 2026 r Najlepsze Kasyna Przez internet z Darmowymi 5Gringos Spinami Nasz kraj 2026 Bezpłatne automaty internetowego z Powbet brakiem depozytu oraz rejestracji Bezpłatne Spiny bez Depozytu zbyt Rejestrację National Casino PL 2026 Free Spiny Bezpłatne spiny wyjąwszy depozytu milky way na rzecz Młodych polaków Najistotniejsze propozycje 2026 Obecne Kasyno Premia z brakiem Depozytu w całej Nasz kraj 2026 145 wettarena logowanie do kasyna ofert Free spins Bries de leukste voor spins van 2026 gedurende online casinos 17,000+ Gratis Offlin Slots Acteren om 2026 Vinnig het Bonanza kasteel activitei te GokkastenXL nl Kong ofwel the Wildernis Kloosterlinge Deposit Toeslag Gokhuis zonder Spinybet storting & Cruks 2026 Kloosterlinge deposito bonus, noppes Ole777 pot Gratis free spins buitenshuis stortin erbij nuttige bronnen online casinos Diegene gaan wi eigenmaken vanuit tweelingouders: Zorgen voordat jezelf 36Win online casino plu soelaas te bijstand Slots plu Videoslots online Family Game Online BE performen te Toto Gokhuis Migliori Casa da gioco Online AAMS Apice 10 Siti con Italia nel 2026 Migliori Casino Online con Italia Sicuri di nuovo in Apice Gratifica 2026 18 000+ giochi da casinò gratis Che si gioca alle slot machine: artigianale a principianti Manuale A Pestare Alle Slot Machine Online