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


11

Caso: Eu tenho um cliente que não conhece 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 o tamanho das fotos 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 a largura máxima nas configurações, posso definir a $ content_width e adicionar novos tamanhos de imagem com 'add_image_size'. A foto original ainda está armazenada na pasta de upload em seu tamanho original. Isso significa que o espaço no disco rígido será facilmente preenchido.

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

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 tinha 3,3Mb após o upload, com grandes dimensões definidas para 2048x2048, foram necessários apenas 375Kb no servidor (cerca de 90% de redução!)


1
Você se importaria se eu usasse isso em um post do blog ao lado do outro código na minha resposta?
Tom J Nowell

Se você acha útil, não me importo, qual é o seu blog?
Mark

O site tomjn.com, ainda não escrevi o post, farei isso na próxima semana e postarei o URL aqui quando terminar
Tom J Nowell

3

O redimensionamento já foi feito para criar os tamanhos grande / médio / polegar, mas o problema é que a imagem é muito grande para ser redimensionada, devido à falta de memória ou tempo.

Portanto, o redimensionamento não é uma opção, se não fosse, você não teria o seu problema. Em vez disso, tente limitar as imagens; portanto, se um upload de 20 MB ocorrer, 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:

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

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


Bem, eu tenho pensado muito sobre o que eu quero e o que eu quero é que a imagem original tenha o mesmo tamanho que a dimensão definida para o tamanho da imagem 'Grande'. Para fazer isso, acho que tenho que verificar com 'wp_handle_upload' o que você acha?
Mark

Ah, para você ter tamanhos grandes / médios, você só quer impedir que o original seja usado? Eu pensei que você queria dizer que ela estava carregando imagens em massa e a versão em massa estava sempre sendo usada e não estava gerando versões menores?
Tom J Nowell

1
Mas esse gancho soa sobre o lugar certo, ou mesmo o wp_handle_upload_prefilterfiltro usado nos listados acima, algum código de redimensionamento do PHP em vez da adição de um erro pode resolver o problema, desde que você escreva de volta no arquivo original. Testes serão necessários
Tom J Nowell

Você está certo. Todos os tamanhos adequados estão sendo gerados. Só não entendo por que o WordPress manteria o original quando as dimensões foram definidas na página Configurações. Ou talvez faça uma opção de check-in com "Manter original", que você pode desativar. Apenas meus 2 centavos ... #
21712 Mark #

1
porque ele precisa salvar o arquivo, a fim de usá-lo para os outros tamanhos, e é necessário se quaisquer modificações são feitas ou regeneração
Tom J Nowell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.