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

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 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 bien 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)?

    
posée Mark 19.12.2012 - 15:07

2 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 3,3Mb après son téléchargement. Ses grandes dimensions étant définies à 2048x2048, il ne lui fallait que 375 Ko sur le serveur (environ 90% de réduction!)

    
réponse donnée Mark 19.12.2012 - 16:29
3

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, soit par manque de mémoire, soit par manque 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. Ainsi, si un téléchargement de 20 Mo a lieu, un message indiquant qu’il doit être réduit est refusé.

Limitation en fonction de 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:

enlace

<?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 permet de redimensionner des images hautes / minces ou larges / courtes. La limitation par dimensions peut être plus facile à expliquer

    
réponse donnée Tom J Nowell 19.12.2012 - 15:27

Lire d'autres questions sur les étiquettes