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
* 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 <script>
if ( strtolower($element->tagName) === 'script' ) {
continue;
}
// Traitement du style inline pour les background-images
/**$style = $element->getAttribute('style');
/*$style = $element->getAttribute('style');
if ( ! empty($style) ) {
$newStyle = preg_replace_callback('/url\((["\']?)(https?:\/\/[^"\'\)]+)\1\)/i', function($matches) {
$url = $matches[2];
@@ -335,9 +335,7 @@ function wp_thumbor_output_buffer_callback($buffer) {
return 'url("' . $transformed . '")';
}, $style);
$element->setAttribute('style', $newStyle);
}
**/
// Traitement des attributs data-image et data-src pour les backgrounds
}*/
if ( $element->hasAttribute('data-image') ) {
$dataImage = $element->getAttribute('data-image');
if ( preg_match('/^https?:\/\//', $dataImage) ) {
@@ -350,13 +348,12 @@ function wp_thumbor_output_buffer_callback($buffer) {
$element->setAttribute('data-src', wp_thumbor_transform_url($dataSrc));
}
}
// Traitement pour l'attribut data-bg
/*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 <head>