web-dev-qa-db-fra.com

Générer une vignette pour des images de même taille que des vignettes

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.

4
Jack Johansson

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().

2
birgire

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;
}
2
MR0