/** * 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 Beste In Geld Cash Coaster $1 storting Gokhuis: Raden over Eigenlijk Poen afwisselend Nederlan Scopri le Recensioni sui Mental Slot Un’Analisi Approfondita Voor gokkasten spelen ️ Ontdek u leukste gokautomaten vanuit Monte Carlo online spelen 2026 Uitgelezene Goksites Van Nederlan 36 betaallijnen gokkast 2026 Veilig Offlin Raden Scopri il Mondo di Book of Kings Gratis Un Viaggio nel Regno delle Avventure Scopri il Mondo di Chaos Crew 2 Slot Un’Avventura di Gioco Irresistibile Free Spins Kloosterlinge Deposito Premie Nieuwe Casino’s casino Cashapillar ️ 2026 Plinko RTP Estrategias y Claves para Maximizar tus Ganancias The Dog House Megaways Il Gioco di Slot che Amanti dei Cani Non Possono Perdere Willekeurig Runner gokkast, kosteloos casino Tiger Vs Bear spelen ofwel over eigenlijk geld Speel kosteloos gokkasten plus genkele Pharaoh’s Fortune online slot beoordeling downloa Nederlands online gokspellen An Easy Guide to Casino Bonus Rounds Best Horse Racing Betting Sites La Cambiamento 4 Fowl Play Gold Online A scrocco I migliori siti di slot del 2024 I migliori siti di slot in patrimonio veri Ulisse Slot A sbafo Artificio Demo Privato di Deposito anche Catalogazione Slot Online Sphinx: Segno Gratuita Premio In assenza di Base Immediato 2024 ️ Stringa Completa Book of Ra Magic Gratuitamente Gioca Online In assenza di Togliere! Migliori Bisca & Slot Online Ricchezza Veri con Italia 2024 Come capire dato che una slot deve versare Europa Salle de jeu, le cabinet des pourboire avec les jeu en compagnie de Mr Bet casino avec 15% cashback casino! Les 12 meilleurs emploi avec commencement fonder un tantinet sans aucun Meilleur sans dépôt RoyalGame frais Starburst Jouer En creuse ça Outil Joue Thunes Gratuitement 2026 Salle de Book Of Ra Magic casino jeu un peu appoint réel : le répertoire bien de repérer le portail sympa Caillou Gaming Book Of Ra 6 emplacement en compagnie de caillou gratuitement Distraire en roulette un tantinet L’excellent Twisted Circus Slot Mybet Book Of Ra 1 $ de dépôt Review Play Free Demo 2026 Free spins casino : Principaux Book Of Dead emplacement prime espaces non payants 2026 ! Casino en public : leurs Eye Of Ra 80 tours gratuits 6 principaux casinos de croupiers personnellement 2026 Casino Prime sans Classe 2026 Jeux de machines à sous i24 : Acheter 50 avec pourboire d’inscription Dure Le Casino Allemagne: Pourboire 3000 emplacement la riviera + 300Free Spins, Jeux de ViveMonCasino Les bons casinos casino Book Of Ra Deluxe Jackpot Edition un brin PayPal de 2026 Wild Ballonix tournures gratuites Dice Casino crypto BTC, ETH rétrogradation en 24 72 journées Les bons condition de machine casino en ligne gratorama pour thunes de 2026 Les grands casinos en compagnie de instrument vers sous 06 nos Unlimluck Code promotionnel colliers externes fiable pour la langue étran française FRMG Wiki Pourboire Pour Free Spins Top Salle de jeu Sans 50 tours gratuits Book Of Ra 6 sur l’inscription sans dépôt avoir í Archive Nov 2025 Hace el trabajo King of the Jungle RoyalGame casino tragamonedas de Bally Wullf Fruit Cocktail slot Bonos Trinocasino demo Entretenimiento tragamonedas regalado Banana Pin Up jugar juegos Splash Freispiele exklusive Einzahlung: Tägliche aktuelle Casino Free Spins im August boku Casino online 2026 Tragaperras sin cargo Hace el trabajo acerca de Slots online regalado y pop por aquí falto retribuir Wunderino Erfahrungen » Auswertung book of ra tipps freispiele & Untersuchung August 2026 Wunderino nights of egypt 150 kostenlose Spins Freispiele Sourcecode 2026 Hier Gratis Free Spins beschützen Los Más grandes Giros Sin cargo falto Depósito y joviales Resident casino Tanque en Casinos España 2025 Wunderino Bonus Sourcecode goldbet deutschland Bonus 2026: Aktueller Promo Code getestet Clases de torneos sobre tragaperras en South Park gran victoria línea: ¿Sobre cómo funcionan? 15 Giros Desprovisto Descarga de la aplicación de afiliado Abu King apk Tanque Bonos De Registrarte ️ 2026 Spielsaal Freispiele » für nüsse Free Spins August Book Of Dead Slot online 2026 7 BONOS desprovisto Depósito: La Relación Jumanji casino en línea más total 2026 Prepaid-Karten, Jungle Jackpots Slot großer Sieg Geschenkkarten & mehr besorgen