Come si può impostare la larghezza massima per le immagini originali?


11

Caso: ho un cliente che non sa molto del mondo digitale. Tuttavia, ciò che sa è come ottenere le foto dalla sua fotocamera al computer e in WordPress. Tuttavia non sa come ridimensionare le foto a dimensioni normali.

Soluzione: mi piace WordPress per ridimensionare automaticamente quelle foto sullo sfondo fino a una larghezza massima di 1024 px.

Problema: anche se posso impostare la larghezza massima nelle impostazioni, posso impostare $ content_width e posso aggiungere nuove dimensioni di immagine con 'add_image_size'. La foto originale è ancora memorizzata nella cartella di caricamento nella sua dimensione originale. Ciò significa che lo spazio sul disco rigido si riempirà facilmente.

Domanda: Cosa devo mettere in Functions.php per consentire a WordPress di ridimensionare l'immagine originale (se è più grande della larghezza massima)?

Risposte:


6

Sono stato in grado di risolverlo utilizzando il seguente codice:

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' );

Il file originale era 3,3 Mb dopo il caricamento, con grandi dimensioni impostate su 2048x2048, il server impiegava solo 375 KB (riduzione del 90% circa!)


1
Ti dispiacerebbe se lo avessi usato in un post sul blog insieme all'altro codice nella mia risposta?
Tom J Nowell

Se lo trovi utile, non mi dispiace, qual è il tuo blog?
Segna il

Il mio sito è tomjn.com, non ho ancora scritto il post, lo farò nella prossima settimana e pubblicherò l'URL qui quando avrò finito
Tom J Nowell

3

Il ridimensionamento è già fatto per creare le dimensioni grandi / medie / del pollice, ma il problema è che l'immagine è troppo grande per ridimensionare, a causa della mancanza di memoria o di tempo.

Quindi il ridimensionamento non è un'opzione, se non lo fosse non avresti il ​​tuo problema. Invece, prova a limitare le immagini, quindi se si verifica un caricamento di 20 MB, viene negato con un messaggio che indica che deve essere ridimensionato.

Limitazione in base all'area immagine / megapixel:

<?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');

Limitazione in base a larghezza o altezza:

/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 limitazione per area consentirebbe immagini alte / sottili o larghe / corte che possono essere ridimensionate, limitare le dimensioni può essere più facile da spiegare


Beh, ho riflettuto molto su ciò che voglio e quello che voglio è che l'immagine originale avrà le stesse dimensioni della dimensione impostata sulla dimensione dell'immagine 'Grande'. Per fare ciò, penso di dover verificare con 'wp_handle_upload' cosa ne pensi?
Segna il

Ah, quindi hai le dimensioni medio / grandi, vuoi solo impedire che l'originale venga utilizzato? Pensavo volessi dire che stava caricando immagini enormi e la versione enorme veniva sempre utilizzata e non generava le versioni più piccole?
Tom J Nowell

1
Ma quel gancio suona nel posto giusto, o anche nel wp_handle_upload_prefilterfiltro usato in quelli che ho elencato sopra, un po 'di codice di ridimensionamento PHP piuttosto che l'aggiunta di un errore potrebbe fare il trucco fintanto che si riscrive nel file originale. Saranno necessari dei test
Tom J Nowell

Hai ragione. Vengono generate tutte le dimensioni corrette. Non capisco perché WordPress manterrebbe l'originale quando le dimensioni sono state impostate nella pagina Impostazioni. O forse fare un'opzione di check-in con "Mantieni originale" che puoi annullare. Solo i miei 2 centesimi ...
Mark

1
perché deve salvare il file per poterlo utilizzare per le altre dimensioni, ed è necessario se vengono apportate modifiche o rigenerazioni
Tom J Nowell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.