/** * 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 La psicología detrás del juego ¿por qué arriesgamos tanto Exploring FatBet Casino & Sportsbook Your Ultimate Gaming Destination Die besten Casinos der Welt entdecken Ein ultimativer Leitfaden für Spieler Unlocking the Thrills of 1red Casino Free Spins Descifrando la mala calidad de los juegos en los casinos en línea F7 Casino Data Privacy: Understanding the Importance of Secure Gaming Erlebe das authentische Gefühl eines Live-Dealers im Casino Stratégies de jeux de casino Vegaz pour maximiser vos gains Prism Casino Crypto-Bonus: Alles, was Sie wissen müssen Experience the Thrill of Online Gambling at Betblast Casino Estrategias Ganadoras en Dendera Casino: Consejos y Trucos para Éxito Lohnt es sich bei Crazy Tower Casino nach der Arbeit zu spielen Unlocking Rewards: Checklist for Getting Bonuses at Rufus Casino Infografía: Cómo funciona el casino Betcave Crazy Tower Casino biedt nu directe uitbetalingen aan voor al je winsten Baccarat für Anfänger: Ein umfassender Leitfaden Dans l’univers des paris, la simplicité s’invite avec une app fluide et intuitive Test Post Created Discover the Exciting World of Hulubet Your Ultimate Betting Destination Lagstiftning kring spel Vad du behöver veta för att spela säkert Unlocking the Potential of Prestige Spin Ethereum Deposits Sprawdzam Crazy Tower Casino Czy to miejsce dla poczatkujacych How Online Casinos Make Money: A Comprehensive Guide Riesgos de Comprar Esteroides Online Kasino Bonus ohne $ 5 Einzahlung Casino fat rabbit Einzahlung 2026: Die besten No Anzahlung Boni Handy Spielsaal Echtgeld Prämie exklusive Frankenstein Slot -Jackpot Einzahlung 2026 ¿Por qué elegir Wild Robin Casino? Wonaco Casino: Ein Leitfaden für Anfänger Mastercard in Online Gambling Enterprises: A Convenient and Secure Payment Choice Die Rolle oraler Steroide in der Optimierung des Bodybuilding-Trainings Stratégie de Base du Blackjack Expliquée Monsterwin Blocked Account: Ursachen und Lösungen Tips voor Beginners bij Lets Jackpot Casino Unlocking the Rewards of Paradise 8 Casino Cashback Dónde Comprar Esteroides: Una Guía Completa Erstplatzierter Erreichbar Kasino Bonus inside Brd 2026: Casino Spinning Beers Erprobung & Erleben Lapalingo Provision book of ra app Code 2026 Aktuelle Boni, Angebote & Tipps Erreichbar Casino Unter einsatz von Startguthaben Kostenfrei Gutschrift Spielsaal Casino Space Gem $ 1 Kaution Maklercourtage exklusive Einzahlung 2026 » Tagesordnungspunkt No Abschlagzahlung Boni Casino Unter einsatz von Prepaid Gutschrift Saldieren Spiele Minecraft Gebührenfrei im Hot 777 Online -Slot Inter browser Traktandum 10 Mastercard Erreichbar Casinos 2024 Experience the Thrill of Evospin Casino & Sportsbook -2012450511 Découvrez HornetBet Le Nouveau Leader des Paris en Ligne Entdecken Sie die Welt von PlayioCasino Ihr ultimativer Spielplatz Ciclo de Dulaglutida: Beneficios y Consideraciones Turinabol 10 Mg Bewertung: Alles, was Sie wissen müssen Angeschlossen Casinos Bestes Online -Casino royal treasures über 5 Euro Einzahlung 2026 komplette Liste Beste Casino montezuma Casinos qua 5 Ecu Einzahlung 2026 Tagesordnungspunkt 20 Test