J'ai remarqué que WordPress ne générait pas de vignette pour une image si la taille de l'image téléchargée était identique à celle de la vignette.
Pour que cela soit clair, voici un exemple:
J'ai une image avec une taille de 300x200px
. La taille de ma vignette dans le paramètre WordPress est également 300x200
. Ainsi, lorsque je télécharge cette image, aucune vignette de taille 300x200
n'est générée, car l'image téléchargée elle-même est considérée comme une vignette pour WordPress!
Je l'ai dépisté jusqu'à la fonction wp_generate_attachment_metadata()
, qui décide de ne pas rogner une image si la taille de l'image est égale à celle d'une vignette. Ici est le lien vers le contenu de cette fonction.
Cette fonction a un filtre, comme suit:
apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id );
Comment puis-je faire cette fonction pour faire la vignette, peu importe quelle taille?
Merci.
UPDATE 1:
Suite à la réponse de @birgire, j'ai inclus ma fonction personnalisée multi_resize()
dans la question:
function multi_resize($sizes) {
$sizes = parent::multi_resize($sizes);
//we add the slug to the file path
foreach ($sizes as $slug => $data) {
$sizes[$slug]['file'] = $slug . "/" . $data['file'];
}
return $sizes;
}
J'utilise cette fonction à d'autres fins, mentionnée this question.
Si je comprends bien la question, vous voulez générer
test.jpg
test-150x150.jpg
au lieu de juste:
test.jpg
lorsque vous téléchargez une image appelée test.jpg
, de taille 150x150, identique à la thumbnail size. ( J'ai utilisé la taille 150x150 ici au lieu de votre 300x200 pour ne pas la confondre avec la taille moyenne )
Cette restriction est implémentée dans la méthode multi_resize()
des classes de l'éditeur d'images, telles que WP_Image_Editor_Imagick
et WP_Image_Editor_Gd
qui étendent WP_Image_Editor
:
$duplicate = ( ( $orig_size['width'] == $size_data['width'] )
&& ( $orig_size['height'] == $size_data['height'] ) );
Si la taille est identique à la taille de l'image d'origine, elle n'est pas générée.
Une solution de contournement possible pourrait être d'étendre la classe d'images à vos besoins et de l'ajouter à la liste des éditeurs d'images disponibles via le filtre wp_image_editors
.
Vous pouvez également essayer de vous connecter au wp_generate_attachment_metadata
pour générer le doublon manquant à l'aide de l'éditeur d'images, comme avec la méthode save()
.
Pour résoudre ce problème, je crée un comportement personnalisé dans functions.php limité aux vignettes qui n’ont pas encore été créées et dont la taille est identique à celle de l’image. Comme @JackJohansson l'explique, la fonction fonctionne dans le filtre wp_generate_attachment_metadata.
add_filter('wp_generate_attachment_metadata', 'same_size_image');
function same_size_image($meta){
global $_wp_additional_image_sizes;
$file = wp_upload_dir();
$file = trailingslashit($file['basedir']).$meta['file'];
$info = getimagesize($file);
$image = wp_get_image_editor($file);
foreach ($_wp_additional_image_sizes as $label => $op) {
if (!isset($meta['sizes'][$label])) {
$width = $op['width'];
$height = $op['height'];
$new_file_path = preg_replace('/\.(.+$)/', '-'.$width.'x'.$height.".$1", $file);
if ($info[0] == $width) $image->save($new_file_path);
}
}
return $meta;
}