This commit is contained in:
2025-03-05 17:15:03 +01:00
parent 486aded0e4
commit a51bd0b8c9

View File

@@ -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 * 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. * 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 string $url L'URL originale de l'image.
* @param int|null $width La largeur souhaitée. * @param int|null $width La largeur souhaitée.
* @param int|null $height La hauteur 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() ) { if ( wp_thumbor_should_skip_transform() ) {
return $url; return $url;
} }
// Vérifie que l'URL se termine par une extension image attendue
// 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) ) { if ( ! preg_match('/\.(jpg|jpeg|png|gif|webp)(\?.*)?$/i', $url) ) {
return $url; return $url;
} }
@@ -194,12 +196,10 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) {
return $url; return $url;
} }
// Évite une double transformation uniquement si aucune dimension n'est demandée // Gestion de la taille intégrée dans le nom de fichier :
if ( empty($width) && empty($height) && strpos($url, $thumbor_base_url) === 0 ) { // Si l'URL contient un pattern "-WIDTHxHEIGHT" à la fin avant l'extension,
return $url; // 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) ) {
// Si aucune dimension n'est fournie via les attributs, tenter d'extraire depuis le nom du fichier
if ( empty($width) && empty($height) ) { if ( empty($width) && empty($height) ) {
$dimensions = wp_thumbor_extract_dimensions_from_url($url); $dimensions = wp_thumbor_extract_dimensions_from_url($url);
if ( $dimensions ) { if ( $dimensions ) {
@@ -207,6 +207,9 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) {
$height = $dimensions['height']; $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 // Préparation de la partie redimensionnement
if ( $width || $height ) { if ( $width || $height ) {
@@ -222,14 +225,13 @@ function wp_thumbor_transform_url($url, $width = null, $height = null) {
$filterPart = ! empty($thumbor_filters) ? 'filters:' . $thumbor_filters . '/' : ''; $filterPart = ! empty($thumbor_filters) ? 'filters:' . $thumbor_filters . '/' : '';
// Détermine le chemin de l'image pour Thumbor. // 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; $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 // 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']) ) { if ( ! empty($options['thumbor_local_path']) ) {
// On retire les éventuels slash en début de chaîne
$local = ltrim($options['thumbor_local_path'], '/'); $local = ltrim($options['thumbor_local_path'], '/');
$path = parse_url($url, PHP_URL_PATH); // ex: /wp-content/uploads/... $path = parse_url($url, PHP_URL_PATH);
$image_path = $local . $path; // par exemple "home/wp-content/uploads/..." $image_path = $local . $path;
} }
// Construction de la chaîne d'options à signer // 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; $final_url = $thumbor_base_url . '/' . $endpoint . '/' . $path_to_sign;
wp_thumbor_log("Transformation de l'URL : $url en $final_url"); 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); //$final_url = str_replace(['(', ')'], ['%28', '%29'], $final_url);
return $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 // Traitement des éléments pour les images de background
$allElements = $dom->getElementsByTagName('*'); $allElements = $dom->getElementsByTagName('*');
foreach ( $allElements as $element ) { foreach ( $allElements as $element ) {
// Ne pas traiter les <script>
if ( strtolower($element->tagName) === 'script' ) { if ( strtolower($element->tagName) === 'script' ) {
continue; continue;
} }
// Traitement du style inline pour les background-images /*$style = $element->getAttribute('style');
/**$style = $element->getAttribute('style');
if ( ! empty($style) ) { if ( ! empty($style) ) {
$newStyle = preg_replace_callback('/url\((["\']?)(https?:\/\/[^"\'\)]+)\1\)/i', function($matches) { $newStyle = preg_replace_callback('/url\((["\']?)(https?:\/\/[^"\'\)]+)\1\)/i', function($matches) {
$url = $matches[2]; $url = $matches[2];
@@ -335,9 +335,7 @@ function wp_thumbor_output_buffer_callback($buffer) {
return 'url("' . $transformed . '")'; return 'url("' . $transformed . '")';
}, $style); }, $style);
$element->setAttribute('style', $newStyle); $element->setAttribute('style', $newStyle);
} }*/
**/
// Traitement des attributs data-image et data-src pour les backgrounds
if ( $element->hasAttribute('data-image') ) { if ( $element->hasAttribute('data-image') ) {
$dataImage = $element->getAttribute('data-image'); $dataImage = $element->getAttribute('data-image');
if ( preg_match('/^https?:\/\//', $dataImage) ) { if ( preg_match('/^https?:\/\//', $dataImage) ) {
@@ -350,7 +348,6 @@ function wp_thumbor_output_buffer_callback($buffer) {
$element->setAttribute('data-src', wp_thumbor_transform_url($dataSrc)); $element->setAttribute('data-src', wp_thumbor_transform_url($dataSrc));
} }
} }
// Traitement pour l'attribut data-bg
/*if ( $element->hasAttribute('data-bg') ) { /*if ( $element->hasAttribute('data-bg') ) {
$dataBg = $element->getAttribute('data-bg'); $dataBg = $element->getAttribute('data-bg');
if ( preg_match('/^https?:\/\//', $dataBg) ) { if ( preg_match('/^https?:\/\//', $dataBg) ) {