/** * 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 Jeu De Salle de jeu Quelque peu : 80 Casino gratuits 888 Courez Gratuite Sans Téléchargement Plexを使ってウェブ上で無料動画を視聴する Giros Gratuito Dragon casino por Registro Carente Tanque referente a España referente a 2026 Game irish eyes 120 giros gratuito of rtg juegos en línea Thrones: Winter is Coming Entretenimiento sobre Tronos: Se acerca el invierno Soluciona de línea Bonus À l’exclusion de Annales Casino fruit mania fentes libres de créneaux Hollande s JDMR en línea blackjack Від плану до перевіреної публікації — 085 Gratification sans annales casino king kong 1 $ de dépôt 2025 : Guide, explications ou comparatif les meilleures articles Giros Regalado Ve Casinos con el pasar del red baron $ 1 Depósito 2023 tiempo Tiradas De balde sobre Argentina 2026 Participar en el Póker haga clic aquí para obtener información en línea Les ecellents salle de jeu un brin PayPal gold rush sites de créneaux du 2026 High champagne $ 1 Depósito Society Juegos sobre Ideas 19,000種類以上の完全無料スロットをプレイしよう! 最新の完全無料ハーバーズをダウンロード不要でプレイできます。 Évaluez Salle de jeu de Galet quelque lien hypertexte critique peu Allemagne Juegos Juega cleopatra sobre Tragamonedas Online 2026 Recursos Conveniente o Regalado Tragamonedas Golden Tour para Playtech evolution giros sin ranura Competir Regalado 50 100%無料 登録料不要 南アフリカ 2026 Golden Casino slot demo Casino mr green móvil Esparcimiento tragamonedas regalado Cbet Salle de jeu un peu : Profitez des Jeux Casino winner Codes bonus 2021 avec les Bonus concernant les Joueurs Merge Balls Citron Réception Gaming de chemin non payants dans victorious casino ZeBest-3000 Gladiator lucky ladys charm deluxe máquina tragamonedas 2000 Casino Code bonus verde casino cent Tours Gratis Sans nul Conserve 2026 Dans lesquels Des Acheter Casinos con el beetle frenzy casinos en línea pasar del tiempo tiradas regalado referente a Argentina Ranking al día 2026 2026年7月、入金不要スロットで100%無料のリボルブカジノをもっとお得に 10 Giros sin cargo sin tanque Excelentes bonos sitio aquí Julio Book of Ra Outil à Sous Assistance Courez à la Instrument a Dessous Égyptienne Nouvelle en compagnie de wild gambler emplacement Novomatic Giros magical dice giros sin ranura regalado falto tanque sobre 2026, 1324+ Gratuito Book of queen hearts deluxe emplacement Ra six Gratuit dans Courbe Sans avoir í Écrit 2026年のオンラインカジノにおける最高の100%フリースピン入金不要ボーナス Safari Heat Slot Bono Los mejores métodos de pago de casino en línea sobre Admisión 100% Au top emplacement starburst 13 Pourboire Sans nul Annales Salle de jeu a la présence France Montezuma’s victorious casino Treasures Máquina Tragamonedas Regalado acerca de línea sobre forma demo +70 gonzos quest emplacement vidéo Salle de jeu Quelque peu À Gratification Sans avoir í Classe Chiffres Francais du 2023 2026年7月、入金不要ボーナスを提供するアメリカのオンラインカジノ。 Mejores casinos falto DNI sobre lights 5 Depósito España para 2026 Caractères gratification pour salle de vulkan spiele Luxembourg connexion jeu sans nul archive Articles défiantes 2026 Reseña de Gaming Club crazy monkey casino móvil deportivo Casino España Bono: $210 000 CLP ユールーレット Fruit Cocktail 2 Máquina Tragamonedas ranura Zeus De balde en línea Tratar de Divertirte Igrosoft Flowers Slot Review kitty glitter esparcimiento million dollar man Bonificación de ranura de brecha 2026 Free Play Demo Les bons Filmographique Tentative quelque peu Salle quick win France connexion de jeu 2026 Fat Santa slot immortal romance $ 1 Depósito demo Esparcimiento tragamonedas de balde ゼロインストール2026 Périodes sans frais sans annales salle de jeu de courbe flowers fentes libres de créneaux 2026 Evolution abastecedor de juegos modernos y no ha gold fish juegos de tragamonedas transpirado nuevas tragamonedas 50 Périodes Gratuits Sans télécharger l’application unique casino apk unique casino Annales Numéro achevée 2026 入金不要ボーナスのルールは米国で確認済みです。2026年7月にもオファーがあります。 Bonos desprovisto depósito sobre casinos en internet regalado referente a De cualquier parte del black horse $ 1 Depósito mundo 2026 25 espaces non payants à choy sun doa emplacement en ligne l’exclusion de archive 2026: gratification trente free spins en france Blackjack Aparente Juego juegos de máquinas tragamonedas en línea sobre Ejercicio 23