web-dev-qa-db-fra.com

Comment définir une largeur maximale pour les images d'origine?

Cas: J'ai un client qui ne connaît pas grand chose au monde numérique. Cependant, elle sait comment obtenir la photo de son appareil photo sur l'ordinateur et dans WordPress. Cependant, elle ne sait pas comment réduire la taille de la photo à une taille normale.

Solution: J'aime que WordPress réduise automatiquement la taille des 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 $ content_width et 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 disque dur sera facilement saturé.

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

11
Mark

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 original faisait 3,3Mb après son téléchargement. De grandes dimensions étant réglées sur 2048x2048, il ne fallait que 375 Ko sur le serveur (environ 90% de réduction!)

6
Mark

Le redimensionnement est déjà fait pour créer les tailles large/moyenne/pouce, mais le problème qui se pose à vous est que l'image est trop grande pour être redimensionnée, par manque de mémoire ou de temps.

Donc, le redimensionnement n'est pas une option, sinon vous n'auriez pas votre problème. Au lieu de cela, essayez de limiter le nombre d'images. Ainsi, si un téléchargement de 20 Mo a lieu, un message indiquant qu'il doit être réduit est refusé.

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:

https://wordpress.stackexchange.com/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' );

Limiter par zone permettrait de redimensionner des images hautes/fines ou larges/courtes, la limitation par dimensions étant plus facile à expliquer

3
Tom J Nowell