Comment définir la largeur maximale des images originales?

11

Cas: J'ai un client qui ne connaît pas grand-chose au monde numérique. Cependant, ce qu'elle sait, c'est comment récupérer les photos de son appareil photo sur l'ordinateur et dans WordPress. Cependant, elle ne sait pas comment réduire la taille des photos à une taille normale.

Solution: j'aime WordPress pour réduire automatiquement la taille de ces photos en arrière-plan à une largeur maximale de 1024 pixels.

Problème: bien que je puisse définir la largeur maximale dans les paramètres, je peux définir la $ content_width et je peux ajouter de nouvelles tailles d'image avec 'add_image_size'. La photo d'origine est toujours stockée dans le dossier de téléchargement dans sa taille d'origine. Cela signifie que l'espace du disque dur sera facilement plein.

Question: Que dois-je mettre dans functions.php pour permettre à WordPress de réduire l'image d'origine (si elle est plus grande que la largeur maximale)?

marque
la source

Réponses:

6

J'ai pu le résoudre en utilisant le code suivant:

function my_handle_upload ( $params )
{
    $filePath = $params['file'];

    if ( (!is_wp_error($params)) && file_exists($filePath) && in_array($params['type'], array('image/png','image/gif','image/jpeg')))
    {
        $quality                        = 90;
        list($largeWidth, $largeHeight) = array( get_option( 'large_size_w' ), get_option( 'large_size_h' ) );
        list($oldWidth, $oldHeight)     = getimagesize( $filePath );
        list($newWidth, $newHeight)     = wp_constrain_dimensions( $oldWidth, $oldHeight, $largeWidth, $largeHeight );

        $resizeImageResult = image_resize( $filePath, $newWidth, $newHeight, false, null, null, $quality);

        unlink( $filePath );

        if ( !is_wp_error( $resizeImageResult ) )
        {
            $newFilePath = $resizeImageResult;
            rename( $newFilePath, $filePath );
        }
        else
        {
            $params = wp_handle_upload_error
            (
                $filePath,
                $resizeImageResult->get_error_message() 
            );
        }
    }

    return $params;
}
add_filter( 'wp_handle_upload', 'my_handle_upload' );

Le fichier d'origine était de 3,3 Mo après son téléchargement, avec de grandes dimensions définies sur 2048x2048, il ne prenait que 375 Ko sur le serveur (environ 90% de réduction!)

marque
la source
1
Cela vous dérangerait-il si j'utilisais ceci dans un blog à côté de l'autre code dans ma réponse?
Tom J Nowell
Si vous le trouvez utile, ça ne me dérange pas, quel est votre blog?
Mark
Tomjn.com de mon site, je n'ai pas encore écrit le post, je le ferai la semaine prochaine et posterai l'URL ici quand j'aurai fini
Tom J Nowell
3

Le redimensionnement est déjà fait pour créer les tailles grandes / moyennes / pouces, mais le problème que vous rencontrez est que l'image est trop grande pour être redimensionnée, soit en raison d'un manque de mémoire ou de temps.

Le redimensionnement n'est donc pas une option, sinon, vous n'auriez pas votre problème. Au lieu de cela, essayez de limiter les images, donc si un téléchargement de 20 Mo se produit, il est refusé avec un message indiquant qu'il doit être réduit.

Limitation basée sur la zone d'image / mégapixels:

<?php
/**
 * Plugin Name: Deny Giant Image Uploads
 * Description: Prevents Uploads of images greater than 3.2MP
 */

function tomjn_deny_giant_images($file){
    $type = explode('/',$file['type']);

    if($type[0] == 'image'){
        list( $width, $height, $imagetype, $hwstring, $mime, $rgb_r_cmyk, $bit ) = getimagesize( $file['tmp_name'] );
        if($width * $height > 3200728){ // I added 100,000 as sometimes there are more rows/columns than visible pixels depending on the format
            $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536';
        }
    }
    return $file;
}
add_filter('wp_handle_upload_prefilter','tomjn_deny_giant_images');

Limitation basée sur la largeur ou la hauteur:

/wordpress//posts/67110/revisions

<?php
/** Plugin Name: (#67107) »kaiser« Restrict file upload */

function wpse67107_restrict_upload( $file )
{
    $file_data = getimagesize( $file );
    // Handle cases where we can't get any info:
    if ( ! $file_data )
        return $file;

    list( $width, $height, $type, $hwstring, $mime, $rgb_r_cmyk, $bit ) = $file_data;

    // Add conditions when to abort
    if ( $width > 2048 )
        $file['error'] = 'Error statement';

    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'wpse67107_restrict_upload' );

La limitation par zone permettrait de redimensionner les images hautes / minces ou larges / courtes, la limitation par les dimensions peut être plus facile à expliquer

Tom J Nowell
la source
Eh bien, j'ai bien réfléchi à ce que je veux et ce que je veux, c'est que l'image d'origine obtienne la même taille que la dimension définie sur la taille d'image «grande». Pour ce faire, je pense que je dois vérifier avec 'wp_handle_upload' qu'en pensez-vous?
Mark
Ah donc vous avez les grandes / moyennes tailles, vous voulez juste empêcher l'original d'être utilisé? Je pensais que tu voulais dire qu'elle téléchargeait des images massives et que la version massive était toujours utilisée et qu'elle ne générait pas les versions plus petites?
Tom J Nowell
1
Mais ce crochet sonne au bon endroit, ou même au wp_handle_upload_prefilterfiltre utilisé dans ceux que j'ai énumérés ci-dessus, du code de redimensionnement PHP plutôt que l'ajout d'une erreur pourrait faire l'affaire tant que vous réécrivez dans le fichier d'origine. Des tests seront cependant nécessaires
Tom J Nowell
Vous avez raison. Toutes les tailles appropriées sont générées, je ne comprends tout simplement pas pourquoi WordPress conserverait l'original lorsque les dimensions ont été définies dans la page Paramètres. Ou peut-être faire une option d'enregistrement avec "Keep Original" que vous pouvez désactiver. Juste mes 2 cents ...
Mark
1
car il doit enregistrer le fichier pour pouvoir ensuite l'utiliser pour les autres tailles, et il est nécessaire si des modifications ou une régénération sont effectuées
Tom J Nowell