diff --git a/wp-thumbor.php b/wp-thumbor.php index 19867bf..672cf26 100644 --- a/wp-thumbor.php +++ b/wp-thumbor.php @@ -18,12 +18,30 @@ function wp_thumbor_get_options() { 'thumbor_base_url' => '', 'thumbor_filters' => '', 'thumbor_secret_key' => '', - 'thumbor_local_path' => '', // nouveau paramètre pour le chemin local + 'thumbor_local_path' => '', + 'thumbor_debug' => false, // Option ajoutée pour le mode debug ); $options = get_option('wp_thumbor_options', $defaults); return wp_parse_args($options, $defaults); } +/** + * Fonction de log pour le mode debug. + * Les messages sont enregistrés dans un fichier situé dans le répertoire wp-content. + */ +function wp_thumbor_log($message) { + $options = wp_thumbor_get_options(); + if ( ! empty($options['thumbor_debug']) ) { + // Définir le chemin du fichier de log + $log_file = WP_CONTENT_DIR . '/wp-thumbor.log'; + // Préfixer le message avec la date et l'heure + $date = date('Y-m-d H:i:s'); + $log_message = "[$date] WP Thumbor Debug: $message" . PHP_EOL; + // Ajoute le message à la fin du fichier + file_put_contents($log_file, $log_message, FILE_APPEND); + } +} + /** * Vérifie si la transformation Thumbor doit être désactivée pour l'appelant. * Par exemple, si l'appel provient du plugin Optimize More. @@ -68,6 +86,7 @@ function wp_thumbor_settings_page() { $options['thumbor_filters'] = isset($_POST['thumbor_filters']) ? sanitize_text_field(trim($_POST['thumbor_filters'])) : ''; $options['thumbor_secret_key'] = isset($_POST['thumbor_secret_key']) ? sanitize_text_field(trim($_POST['thumbor_secret_key'])) : ''; $options['thumbor_local_path'] = isset($_POST['thumbor_local_path']) ? sanitize_text_field(trim($_POST['thumbor_local_path'])) : ''; + $options['thumbor_debug'] = isset($_POST['thumbor_debug']) ? true : false; update_option('wp_thumbor_options', $options); echo '

Les paramètres ont été mis à jour.

'; } @@ -107,6 +126,13 @@ function wp_thumbor_settings_page() {

Optionnel. Si renseigné, ce chemin sera préfixé au chemin de l'image sur le filesystem local de Thumbor. Par exemple, si vous indiquez "/home", alors au lieu de transmettre l'URL publique, le plugin transmettra "home/wp-content/uploads/…".

+ + Activer le mode Debug + + /> +

Active l'enregistrement des logs dans un fichier.

+ + @@ -149,7 +175,7 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { if ( is_admin() ) { return $url; } - // Ignorer le fichier favicon.ico + // Ignorer le favicon if ( basename(parse_url($url, PHP_URL_PATH)) === 'favicon.ico' ) { return $url; } @@ -157,14 +183,19 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { return $url; } + // Si l'URL ne semble pas complète (ne se termine pas par une extension image attendue), on la laisse intacte. + if ( ! preg_match('/\.(jpg|jpeg|png|gif|webp)(\?.*)?$/i', $url) ) { + return $url; + } + $options = wp_thumbor_get_options(); $thumbor_base_url = isset($options['thumbor_base_url']) ? rtrim($options['thumbor_base_url'], '/') : ''; if ( empty($thumbor_base_url) ) { return $url; } - // Évite une double transformation - if ( strpos($url, $thumbor_base_url) === 0 ) { + // Évite une double transformation uniquement si aucune dimension n'est demandée + if ( empty($width) && empty($height) && strpos($url, $thumbor_base_url) === 0 ) { return $url; } @@ -188,22 +219,17 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { // Préparation de la partie filtres à partir des réglages $thumbor_filters = isset($options['thumbor_filters']) ? trim($options['thumbor_filters']) : ''; - if ( ! empty($thumbor_filters) ) { - $filterPart = 'filters:' . $thumbor_filters . '/'; - } else { - $filterPart = ''; - } + $filterPart = ! empty($thumbor_filters) ? 'filters:' . $thumbor_filters . '/' : ''; // Détermine le chemin de l'image pour Thumbor. // Par défaut, on utilise l'URL complète. $image_path = $url; - // Si un chemin local est configuré, on remplace la partie "https://votredomaine/wp-content/…" par - // le chemin local suivi du chemin de l'image (extrait avec parse_url). + // Si un chemin local est configuré, on remplace la partie de l'URL par ce chemin local suivi du chemin de l'image if ( ! empty($options['thumbor_local_path']) ) { // On retire les éventuels slash en début de chaîne $local = ltrim($options['thumbor_local_path'], '/'); $path = parse_url($url, PHP_URL_PATH); // ex: /wp-content/uploads/... - $image_path = $local . $path; // Résultera par exemple en "home/wp-content/uploads/..." + $image_path = $local . $path; // par exemple "home/wp-content/uploads/..." } // Construction de la chaîne d'options à signer @@ -218,7 +244,10 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { $endpoint = 'unsafe'; } - return $thumbor_base_url . '/' . $endpoint . '/' . $path_to_sign; + $final_url = $thumbor_base_url . '/' . $endpoint . '/' . $path_to_sign; + wp_thumbor_log("Transformation de l'URL : $url en $final_url"); + + return $final_url; } /** @@ -235,6 +264,7 @@ function wp_thumbor_output_buffer_callback($buffer) { if ( empty($buffer) ) { return $buffer; } + wp_thumbor_log("Début du traitement du output buffer."); libxml_use_internal_errors(true); $dom = new DOMDocument(); $html = mb_convert_encoding($buffer, 'HTML-ENTITIES', 'UTF-8'); @@ -316,6 +346,12 @@ function wp_thumbor_output_buffer_callback($buffer) { $element->setAttribute('data-src', wp_thumbor_transform_url($dataSrc)); } } + if ( $element->hasAttribute('data-bg') ) { + $dataBg = $element->getAttribute('data-bg'); + if ( preg_match('/^https?:\/\//', $dataBg) ) { + $element->setAttribute('data-bg', wp_thumbor_transform_url($dataBg)); + } + } } // Traitement spécifique pour les liens preload d'image dans le @@ -329,7 +365,6 @@ function wp_thumbor_output_buffer_callback($buffer) { } } - // Renvoyer le document HTML complet, préservant , et return $dom->saveHTML(); } @@ -338,6 +373,7 @@ function wp_thumbor_output_buffer_callback($buffer) { */ function wp_thumbor_start_output_buffer() { if ( ! is_admin() && ! defined('DOING_AJAX') ) { + wp_thumbor_log("Démarrage de l'output buffer."); ob_start('wp_thumbor_output_buffer_callback'); } }