web-dev-qa-db-fra.com

Comment ajouter plusieurs tailles d'image de la même taille avec add_image_size

J'utilise un filtre en niveaux de gris sur toutes les images téléchargées dans mon installation WordPress. Cependant, je veux à la fois l'image en niveaux de gris et l'image en couleur sur mon site Web (en survol). La façon dont j'ai essayé de faire cela a été de créer un groupe de add_image_size () comme ceci:

add_image_size( 'gho-small', 100, 0, true ); // Used for small images
add_image_size( 'gho-small-grayscale', 100, 0, true ); // Used for small grayscaled images
add_image_size( 'gho-medium', 200, 0, true ); // Used for medium images
add_image_size( 'gho-medium-grayscale', 200, 0, true ); // Used for medium grayscaled images
add_image_size( 'gho-large', 400, 0, true ); // Used for large images
add_image_size( 'gho-large-grayscale', 400, 0, true ); // Used for large grayscaled images

Et puis je ferais un filtre sur les images et ne prendrais que les ID * -grayscale et les enregistrerais:

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
    $dir = wp_upload_dir();
    $file = trailingslashit($dir['path']).$meta['sizes']['gho-large-grayscale']['file'];
    do_grayscale_filter($file);
    return $meta;
}

Cela fonctionnerait bien, mais apparemment add_image_size () examine les arguments width et height et lorsqu'une taille est déjà définie avec cette combinaison, la taille n'est pas ajoutée. Je peux comprendre que, puisque la fonction consiste à ajouter de nouvelles tailles, et si la taille est une copie, il est normalement préférable de ne pas l'ajouter à nouveau pour gagner du temps de traitement. Mais maintenant, je veux deux images avec la même taille, mais une avec un filtre appliqué et l’autre à l’original.

Comment puis-je atteindre cet objectif?

J'ai essayé d'ajouter une autre taille qui est juste un pixel plus large, comme:

add_image_size( 'gho-small-grayscale', 101, 0, true ); // Used for small grayscaled images

Et puis redimensionner l'image plus tard, après le filtre, à 100/200/400 que ce soit. Mais cela ne semble pas bien, et cela gâche également les appels get_the_post_thumbnail() car on pense toujours que la dimension de l'image est 101x$height. Il n’est pas aussi simple que de redimensionner l’image de 1 pixel horizontalement et verticalement, car les ratios pourraient faire en sorte que la hauteur soit > 1px plus grande lorsque vous avez une largeur supérieure à 1 px.

8
Coen

Gee, je continue à résoudre mes propres problèmes tout le temps. Voici comment je l'ai résolu à la fin. J'ai découvert que add_image_size n'ignore pas les dimensions identiques de la taille de l'image, mais pointe plutôt le nom du fichier vers le même fichier dans le répertoire uploads. Une fois que j'ai su cela, je pouvais simplement sauvegarder l'image en niveaux de gris sous un autre nom, renvoyer ce nom dans le tableau $ meta, et WP prend cela comme information à stocker dans la base de données. Toutes les fonctions get_thumbnail () fonctionnent toujours comme elles le devraient et je peux simplement demander l'ID -grayscale.

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
$file = $meta['sizes']['gho-large-grayscale']['file'];
$meta['sizes']['gho-large-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-medium-grayscale']['file'];
$meta['sizes']['gho-medium-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-small-grayscale']['file'];
$meta['sizes']['gho-small-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
return $meta;
}


function do_grayscale_filter($file)
{
$dir = wp_upload_dir();
$image = wp_load_image(trailingslashit($dir['path']).$file);
imagefilter($image, IMG_FILTER_GRAYSCALE);
return save_modified_image($image, $file, '-grayscale');
}

function save_modified_image($image, $filename, $suffix)
{
$dir = wp_upload_dir();
$dest = trailingslashit($dir['path']).$filename;

list($orig_w, $orig_h, $orig_type) = @getimagesize($dest);

$filename = str_ireplace(array('.jpg', '.jpeg', '.gif', '.png'), array($suffix.'.jpg', $suffix.'.jpeg', $suffix.'.gif', $suffix.'.png'), $filename);
$dest = trailingslashit($dir['path']).$filename;

switch ($orig_type)
{
    case IMAGETYPE_GIF:
        imagegif( $image, $dest );
        break;
    case IMAGETYPE_PNG:
        imagepng( $image, $dest );
        break;
    case IMAGETYPE_JPEG:
        imagejpeg( $image, $dest );
        break;
}

return $filename;
}
9
Coen