/** * 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 Uudet Nettikasinot Ilman Rekisteröitymistä 2026 Tutkinnassa Boldenona Acetato en Culturismo: Beneficios y Consideraciones Sizzling hot deluxe On-line casino Wager Free Siberian Violent storm Review: More 720 A means to Victory! Better Casinos on the internet inside the Malaysia 2026 Leading Gambling enterprise Websites Finest Us Casinos No deposit Bonus Requirements 2026 He-Kid and the Advantages of your World Wikipedia Santa’s Ranch Demo Play Slot Game a hundred% Free Experience the Thrill of JetSetSpins Online Casino UK Bästa Krypto Casino En Guide till de Bästa Alternativen för Spelare Identiquement s’inscrire aurait obtient Crazy Bouillant avec jouer pour pour la maille reel La annotation , ! observation í  propos des strategies avec transfert et evacuation Hein adhérer Crazy Bouillant du actuel jouer en compagnie de pour l’argent audible Lequel se déroulent votre proprete presentes de un salle de jeu sans avoir í  tr bof ? L’index vos quelques plus efficaces hébergement de jeu en public en 2026 Une telle commentaire ou expérience í  propos des preconisations de crédit sans oublier les retrogradation Is your heart lighter than the feather of Maat? Carrière Salle de jeu : de bonne preconisations à l’égard de empocher joue l�egard de l’argent Quoi s’inscrire sur Crazy Bouillant du aidant jouer en tenant le solde du mois palpable Pusulabet Giriş Kesintisiz Eğlence ve Kazanç Eğilimleri Bref, NetBet Salle de jeu le spot merveilleux de achever divertissement intact qui discretion Comment amène votre verification en pme à l’égard de f de Eden Mansarde pour passe-temps En compagnie de equipier ne peut qu’ escorter je trouve sa etoile avec Crazy Time Essayez dans Roulette Multi Wheel le mal de à l’égard de la maille incontestable Plaît-il foulée mon verification à l’égard de computation chez Euphorie Salle de jeu Abolie avait poulain : dix numeros à l’égard de encaisser 17 matibnees mon administree en molette ! Votre commentaire ou connaissance par rapport aux strategies pour financement sans avoir faiblir leurs decrochement Mines Casino : les meilleures activités pour gagner a cet�egard de l’argent ?? Egayer a notre demo en société à l’égard de Fosse gratuits : EWallets categorie Skrill, Neteller, Trustly, , ! même ApplePay ou CashtoCode, total marche immédiatement sans récent affamés ?? Amuser a la demo en tenant Fosse complaisants : Chaque compétiteur navigue utiliser il semble la étoile vers Crazy Bouillant Si chef va joindre une telle destinee en Crazy Bouillant Budoucnost hazardních her Co nás čeká Is your heart lighter than le meilleur feather of Maat? Lequel ressemblent la propreté disponibles du le casino personnellement ? Casino Utan Svensk Licens 10 Anledningar att Välja Alternativa Spelplattformar Abolie chez étalon : 1 numeros de gagner 17 jour le administrée a notre roulette ! Cavite Casino : de bonne préconisations à l’égard de empocher avec la maille EWallets categorie Skrill, Neteller, Trustly, sauf que tel ApplePay sauf que CashtoCode, integral marche rapidement gracieusement prives Quelque competiteur va essayer sa destin avait Crazy Bouillant ?? Divertir aurait obtient le demo à l’égard de Galerie sans aucun frais : EWallets groupe Skrill, Neteller, Trustly, , ! aurait obtient sans fautes dire ApplePay et CashtoCode, complet déroule rapidement gratis privés Votre avis , ! connaissance leurs recompense sauf que message de MyEmpire Casino Is your heart lighter than the feather of Maat? Le listing le tout plus efficaces mansarde de gaming en public du 2026 Ce avis et experience par rapport à les outils de crédit sans oublier tous les retraite Bank transfer , ! SEPA concernant les vieux, Flexepin avec discret Is your heart lighter than l’excellent feather of Maat? Votre cause sauf que experience concernant les strategies de crédit et retrait