diff --git a/wp-thumbor.php b/wp-thumbor.php index 0f0fc57..4805105 100644 --- a/wp-thumbor.php +++ b/wp-thumbor.php @@ -165,6 +165,9 @@ function wp_thumbor_extract_dimensions_from_url($url) { * Si le paramètre "Chemin local Thumbor" est renseigné, l'image est référencée par * ce chemin suivi du chemin (PATH) de l'URL d'origine. * + * IMPORTANT : Si l'URL contient une taille (ex. "-1024x764"), on la retire AVANT de + * générer le hash_hmac afin que la signature soit calculée sur l'image en pleine taille. + * * @param string $url L'URL originale de l'image. * @param int|null $width La largeur souhaitée. * @param int|null $height La hauteur souhaitée. @@ -182,8 +185,7 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { if ( wp_thumbor_should_skip_transform() ) { return $url; } - - // Si l'URL ne semble pas complète (ne se termine pas par une extension image attendue), on la laisse intacte. + // Vérifie que l'URL se termine par une extension image attendue if ( ! preg_match('/\.(jpg|jpeg|png|gif|webp)(\?.*)?$/i', $url) ) { return $url; } @@ -194,18 +196,19 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { return $url; } - // É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; - } - - // Si aucune dimension n'est fournie via les attributs, tenter d'extraire depuis le nom du fichier - if ( empty($width) && empty($height) ) { - $dimensions = wp_thumbor_extract_dimensions_from_url($url); - if ( $dimensions ) { - $width = $dimensions['width']; - $height = $dimensions['height']; + // Gestion de la taille intégrée dans le nom de fichier : + // Si l'URL contient un pattern "-WIDTHxHEIGHT" à la fin avant l'extension, + // on l'extrait (si aucune dimension n'est fournie) et on le retire de l'URL + if ( preg_match('/-[0-9]+x[0-9]+(?=\.(jpg|jpeg|png|gif|webp)$)/i', $url) ) { + if ( empty($width) && empty($height) ) { + $dimensions = wp_thumbor_extract_dimensions_from_url($url); + if ( $dimensions ) { + $width = $dimensions['width']; + $height = $dimensions['height']; + } } + // Retire la taille du nom du fichier pour que le hash soit généré sur l'image en pleine taille + $url = preg_replace('/-[0-9]+x[0-9]+(?=\.(jpg|jpeg|png|gif|webp)$)/i', '', $url); } // Préparation de la partie redimensionnement @@ -222,14 +225,13 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { $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. + // Par défaut, on utilise l'URL complète (qui est maintenant dépourvue de la taille si présente). $image_path = $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; // par exemple "home/wp-content/uploads/..." + $path = parse_url($url, PHP_URL_PATH); + $image_path = $local . $path; } // Construction de la chaîne d'options à signer @@ -247,7 +249,7 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) { $final_url = $thumbor_base_url . '/' . $endpoint . '/' . $path_to_sign; wp_thumbor_log("Transformation de l'URL : $url en $final_url"); - // Méthode 1 : Encodage manuel des parenthèses pour éviter que esc_url tronque l'URL + // Encodage manuel des parenthèses pour éviter que esc_url tronque l'URL //$final_url = str_replace(['(', ')'], ['%28', '%29'], $final_url); return $final_url; @@ -322,12 +324,10 @@ function wp_thumbor_output_buffer_callback($buffer) { // Traitement des éléments pour les images de background $allElements = $dom->getElementsByTagName('*'); foreach ( $allElements as $element ) { - // Ne pas traiter les