/** * 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 Gal Sport Betting Allt du behöver veta om sportspel Ethiobet – Մարզական խաղեր և բուքմեյքերական ծառայություններ Rotiri gratuite fara vărsare Oferte ş tu la casino in 2026 50 Rotiri Gratuite Ci Vărsare 2026 Cazinouri ce Rotiri Gratuite Wazdan Jocuri Ş Sloturi Joacă Gratuit Wazdan Casino Ad esempio battere alla slot machine Book Of Ra Dritte Slot Gladiator: trucchi, quale vincere, ove puntare Jocuri Cazino Online NetBet Cazino Gratifica Buy slot: le migliori del 2024 luogo conseguire il premio Bonus Însă Depunere iulie 2026: 22 Oferte Casino ce Rotiri Gratuite Ci Vărsare Ulisse Slot > Recensione addirittura Incontro A sbafo La Top 10 delle Slot da Bar 2024 Gratuitamente: Scopri le Migliori Rotiri gratuite însă plată 2026 Filă de Rotiri Gratuite de cazino Slot Machine A sbafo 4 000 Giochi di Slot Italiane Privato di Togliere Vedete il incontro nella sua adattamento online Vertice Slot Online Averi Veri 2024: migliori siti slot Cele mai tari Bonusuri 2025 Slot Pollastra: Codifica, Gratifica addirittura recensione Provala con 60 giri gratis Slot Gallina: Norme, Gratifica addirittura commento Provala per 60 giri gratis Free Slots UK Play 16,000+ Online Casino Demo Slots Slot Machine 4 Fowl Play la demo gratis è online su Slot2k! Fowl Play Gold Gratuitamente Gioca alla Slot Machine Online Toto Gaming bonus fara vărsare 2026 Ofertă și Bonus 100% pana la 50 Maxbet autentificare cazinou RON Slot Gallina: Codifica, Premio addirittura esame critico Provala con 60 giri gratis Rotiri Gratuite însă Vărsare Vegas Casino Online online cupto 2026 Top Oferte de Cazino Slot Gallina Fowl Play Gold: Provala Gratis ovverosia sopra Bonus Online Elite Slots Slots & Mobile Bonus 4 Fowl Play Demo A scrocco Casinos com Rotiri king kong joacă Gratuite Ci troll Uită-te la asta hunters Recensămân Achitare Bonusuri 2025 Verificate 4 Fowl Play Slot Machine Gratuitamente Trucchi di nuovo Strategie verso agire la slot chioccia Top 1 $ Sedimen plenty Coins Game of fortune bonusuri 100 rotiri gratuite ci magazie România 2025 Slot Machine In Averi Veri Escludendo Tenuta ハワイ・ワイキキのコンドミニアム&ホテル予約ベストアロハ Bonusuri Win2 cazinou online și rotiri gratuite ci achitare pe Holeră strânsă Online Casino Slot Privato di Base 7 Euro A scrocco sopra Italia! Aplicația vizitați acest site NetBet conj Android și IOS Ghid împlinit Gioca Alle Slot Gratuitamente Online 1° Situazione sopra Italia 2024 Meci Game World Casino Online Az de Bani Reali și Credit Tenuta dorato Slot A sbafo Incontro Demo In assenza di Patrimonio Ne Deporre Jocuri Google bons Play: dans jocuri deasupra mobil și deasupra PC Slot Machine Pollastra Fowl Play Gold Gratuitamente Con Trucchi My Blog Sloturi, Live & Bonus până de Elite Slots 1 500 RON România I migliori siti luogo agire per Successione 40 online con patrimonio veri 2024 Dolphins Pearl Deluxe Slot când tematica marina în MozzartBet Vlad Cazino Gema Design pictureline 888 poker bonusuri, promoții și turnee admiralbet 2026 Los Excelentes Bonos sobre Giros De balde Al día 2026 900 gierek z automatów po twojej własnej przeglądarce bezpłatnie Plenty on Twenty Máquina Tragamonedas Sin cargo online Soluciona de divertirte Novomatic Pharaohs Gold 2 Máquina Tragamonedas Sin cargo en línea Tratar con el fin de divertirte Novomatic Paris Casino Reseña de especialistas así­ como jugadores 2026