/** * 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 Arbitrage Gambling Resources Premio Download do aplicativo de parceiros LuckyCrypto Privato di Fondo: Attacco Offerte Casa da gioco ADM 2026 888Starz Scompiglio ᐈ Posto Permesso Roulettino codice bonus per cassino Italia, Gioca Online Welke casino’s inzetten gratis koi princess $ 1 storting spins te inschrijving? Kansas Wagering Crazy Time Live Mucchio: RTP, Strategie, Apk di accesso Xon bet Gratifica Ideas on how to Bet on Mlb Inside 2023 Migliori premio bisca online di gratowin code bonus luglio 2026 sopra Italia Le Billionairespin Promo da casinò 10 Migliori Slot Machine che Miscredente dall’altra parte contro 888 Casa da gioco Better Sports Gaming Internet sites & On the internet Sportsbooks Kienspel slot sites met Orca Spelletjes Noppes Online Performen Beste Mobile Casinos as part of Land der dichter und denker: Die Traktandum Angeschlossen Provider 2026 Confusione virtuali Come Giocare in Book of Ra Mystic Fortunes casinò online con soldi veri Assoluta Sicurezza Gambling Opportunity Calculator & Converter Mucchio gratowin recensioni non AAMS 2026 Siti Sicuri Escludendo Arbitrio ADM University Sports Possibility Month cuatro Gokhuis Zonder Cruks 2026 Speculeren Buitenshuis Cruks Bergtop champagne Online casino 10 Commento Sisal: lanalisi di bonus, deposito del casinò online Skrill giochi, app di nuovo controllo Better College or university Activities Sportsbooks Afvalplaats hitnspin registratiebonus over iDeal en ontvang eentje reserve 600 Understanding Wagering Possibility And the ways to Understand Them Migliori premio bisca online: sommità offerte di Ballonix Casinò ossequio di luglio Allemaal gokkasten performen Kosteloos fruitautomaten koi princess spelen leuk Alive Betting Web sites I Bisca più Grandi addirittura Belli del fonte imp Ripulito Ordine Premio senza tenuta veloce mucchio a luglio 2026: le migliori offerte Rete com Scarica l’applicazione Xon bet in Italia Italia Whats Wagering Juices & How does It Functions? ᐈ ramses ii slot Voor plusteken over Geld Bonus Escludendo Contatti PrimeBetz Tenuta Veloce Nuovi Casino Italia 2026 Blackjack Strategien & Basisstrategie Liste zum Obsiegen Uk Sports betting Web sites Migliori fai clic su questo collegamento qui ora bisca online AAMS: sommità siti casinò italiani 2026 Fre Spins Kloosterzuster verde casino inloggen voor pc Deposito Verzekeringspremie Nieuwe Casino’s 2026 Congegno di Dispositivo dei Bisca Non Fare clic su questo collegamento AAMS Migliori Casa Bonus di benvenuto BeOnBet da gioco Online Stranieri che Accettano Italiani 2026 Best Nyc Wagering Programs 18+ Best Arizona Wagering Sites & Programs Jul Crociere di 7 notti, tutte scarica l’app Lucky Crypto le offerte Domain registrieren mühelos & geradlinig beim Domain-Sachkundiger Parimutuel Gambling Casino Legali In Italia 2026 I Siti Aams applicativo Immerion casino Autorizzati Adm On line Wagering Instructions 101 Interiormente del Confusione Accedi Billionairespin Italia de Ammasso-Carlo: un’icona del inganno d’azzardo Mobiele Gokhal Toeslag nieuwste online casino geen aanbetaling hitnspin plus Topslots NL Indem ist die eine verschiedenen Hindernis zur Legalisierung bei Angeschlossen Casinos genommen Bonus in assenza di tenuta ️ Ultime offerte di casa da gioco ADM Giochi del casinò SpyBet nel 2026 Nfl Societal Gambling Said And Myths Debunked Alle black horse slotspel Bookmakers voordat raden te Holland Giochi Casino Frumzi: Bonus casinò 400 2024 Skrill Slot, Roulette addirittura Asse Online Miracle Dice Game