Como você pode definir a largura máxima para imagens originais?

11

Caso: Eu tenho um cliente que não sabe muito sobre o mundo digital. No entanto, o que ela sabe é como tirar as fotos da câmera para o computador e no WordPress. No entanto, ela não sabe como reduzir a foto para um tamanho normal.

Solução: Eu gosto do WordPress para reduzir automaticamente as fotos em segundo plano para uma largura máxima de 1024px.

Problema: Embora eu possa definir largura máxima nas configurações, posso definir a $ content_width e posso adicionar novos tamanhos de imagem com 'add_image_size'. A foto original ainda está armazenada na pasta de upload em seu tamanho original. Ou seja, o espaço do disco rígido ficará cheio facilmente.

Pergunta: O que devo colocar em functions.php para permitir que o WordPress reduza o tamanho da imagem original (se for maior que a largura máxima)?

    
por Mark 19.12.2012 / 15:07

2 respostas

6

Consegui resolvê-lo usando o seguinte código:

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

O arquivo original era 3,3Mb depois que foi enviado, com grandes dimensões configuradas para 2048x2048, levou apenas 375Kb no servidor (redução de cerca de 90%!)

    
por Mark 19.12.2012 / 16:29
3

O redimensionamento já é feito para criar os tamanhos grande / médio / miniatura, mas o problema é que a imagem é muito grande para redimensionar, seja por falta de memória ou de tempo.

Assim, o redimensionamento não é uma opção, se não fosse, você não teria seu problema. Em vez disso, tente limitar as imagens, portanto, se um upload de 20 MB acontecer, será negado com uma mensagem indicando que ele precisa ser reduzido.

Limitação com base na área da imagem / megapixels:

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

Limitação com base na largura ou altura:

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

A limitação por área permitiria imagens altas / finas ou largas / curtas que pudessem ser redimensionadas, limitando por dimensões, pode ser mais fácil de explicar

    
por Tom J Nowell 19.12.2012 / 15:27