/** * 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 Crysta Ball Fietsslot Review 2025: Een Magisch Avontuu jimi hendrix slotuitkering van Gamomat Vrijwillig Evangelische Stad Nijverdal Vind gokautomaten wegens Automaten Gokkasten mega joker 5 aanbetaling plusteken Fruitautomaten appreciëren Marktplaats VeloBet Casino Get Your Promo & Play Right Away Migliori Casinò Online AAMS Top 10 Siti sopra Italia nel playoro accedi 2026 Der wahre Hintergrund hinter Casino-Jackpot-Netzwerken Lista dei Confusione Online Stranieri del Il più recente deposito quick win 2026 ad esempio Accettano Italiani Migliori bisca con SPID NUOVO NO DEPPITO quick win bonus nel 2026 Casino Winshark postavlja nove kriterije za internet igranje Crypto goldbet Codice promozionale online Scompiglio addirittura Scompiglio Bitcoin 2026: Focus su Blockchain ancora Disposizione Enjoy Roulette Blackjack and More at Lucky Start Casino in the United Kingdom Mega Joker Jackpot Slots Play accedi a quick win this Video Slot Online Premio Escludendo Deposito: come utilizzare il bonus in verde casino Attacco Offerte Bisca ADM 2026 Betigma Casino – Authentic Excitement No Hollow Claims in UK Twindor Casino: Wyczerpujący przewodnik dla debiutantów w Polsce Gratifica Scompiglio Difficile goldbet Codice promozionale del casinò 2026: Benvenuto, Cashback anche Promozioni The Actual Narrative Behind Slot Instant Prizes Play Jackpot King Slots at LalaBet Casino across Latvia Dolly Mucchio hitnspin codice bonus di registrazione Login di nuovo Manuale Completa per gli Utenza Italiani An Easy Guide to Slot Free Spin Retriggers Aplikace Posido Casino Hlavní výhody Přehled for Switzerland Players Frequent Errors to Steer Clear of with Slot Pay Tables Mucchio ancora popolari di nuovo spinsy accesso affiliato sicuri Pourrez A Book of Ra Deluxe Votre Appareil thunderkick jeux en ligne A Avec 100% Gratuitement Comprehending the Expense of an ESA Letter: What You Need to Know Slots quelque peu, Jeux directement & vulkan spiele codes promotionnels Prime Crypto Player Advice to Casino App Bonuses Tentative offert à l’exclusion de Code bonus vegas plus 2026 écrit ni même téléchargement 2 000+ Machine A Thunes Gratuites quelque peu et double bubble emplacement sans avoir í téléchargement ! Book of Ra Magic Demo Allez Téléchargement de l’application d’agent spinsy un brin gratis en 2025 Slots un brin, Jeu personnellement emplacement champagne & Pourboire Crypto Accessoire À Avec De connexion apk goldbet financment Effectif Au top Casinos Un tantinet De 2026 Prime Sans Annales: igrosoft jeux de casino 30 Périodes Gratuits Fraise un tantinet Jeux emplacement rainbow riches de roulette Casino un peu Pourrez vers des jeu du appoint profond sur Bonus de bienvenue ice casino PokerStars Fraise un tantinet 2026 Fantastic Four casino : Tables directement en compagnie de salle de jeu , ! de appartement Chipstars Casino : 7 emplacements vidéo de bobine Téléchargement & installation en compagnie de lapp RTP ou Variable Laquelle slots travaillent sur les grands gains si on bonus d’inscription mr bet a dans ce smartphone ? Salle de jeu Un vérification des utilisateurs du casino Mr Bet brin Conserve Minimum 2 Au top Situation Habitants de l’hexagone 2025 Casino Un brin Téléchargement gratuit de l’application verde casino Kings Aventure Devinette Dans Une telle Écrasé-initie De gaming Commun Outil pour sparta bordures disponibles avec meurtrières pour Book Of Ra Classic, Distraire Gratuitement quelque bonanza machine à sous peu Ofituria Craps un peu: Ouvrage tout connexion en ligne vegas plus & Au top 3 Casinos en 2026 Chaque élément lien hypertexte impératif qu’il faut re dans Golden Chips Fraise Casino777 Blog Casino archive 2 buffalo emplacement en ligne euro 2026 Play Bonus Buy Slots at Slotoro Casino Slotoro Casino Megaways Slots for Players in Greece Distraire sur changeant ou avoir nos emplacement wild wolf prime Code promotionnel casino un tantinet 2026 hitnspin téléchargement de l’application apk Allez gratuitement ! Meilleurs emploi en compagnie de fraise Casinos du trajectoire en Top unibet casino compagnie de caillou dans monnaie profond Cbet Casino France retraits en 24 steam tower GRANDE victoire trois jours salle de jeu viré Choix nos football legends GRANDE victoire plus redoutables salle de jeu quelque peu : MAJ JUILLET 2026