¿Cómo se puede establecer el ancho máximo para las imágenes originales?

11

Caso: tengo un cliente que no sabe mucho sobre el mundo digital. Sin embargo, lo que sí sabe es cómo llevar las fotos de su cámara a la computadora y en WordPress. Sin embargo, ella no sabe cómo reducir el tamaño de las fotos a un tamaño normal.

Solución: Me gusta que WordPress reduzca automáticamente el tamaño de esas fotos en el fondo a un ancho máximo de 1024px.

Problema: aunque puedo establecer el ancho máximo en la configuración, puedo establecer el $ content_width y puedo agregar nuevos tamaños de imagen con 'add_image_size'. La foto original todavía se almacena en la carpeta de carga en su tamaño original. Lo que significa que el espacio del disco duro se llenará fácilmente.

Pregunta: ¿Qué debo poner en functions.php para permitir que WordPress reduzca el tamaño de la imagen original (si es más grande que el ancho máximo)?

marca
fuente

Respuestas:

6

Pude resolverlo usando el siguiente 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' );

El archivo original tenía 3,3Mb después de cargarse, con grandes dimensiones configuradas en 2048x2048, solo tomó 375Kb en el servidor (¡reducción de aproximadamente 90%!)

marca
fuente
1
¿Te importaría si usara esto en una publicación de blog junto con el otro código en mi respuesta?
Tom J Nowell
Si lo encuentra útil, no me importa, ¿cuál es su blog?
Mark
Mi sitio es tomjn.com, todavía no he escrito la publicación, lo haré durante la próxima semana y publicaré la URL aquí cuando termine
Tom J Nowell
3

El cambio de tamaño ya está hecho para crear los tamaños grande / mediano / pulgar, pero el problema que enfrenta es que la imagen es demasiado grande para cambiar el tamaño, ya sea por falta de memoria o tiempo.

Por lo tanto, cambiar el tamaño no es una opción, si no lo fuera, no tendría su problema. En su lugar, intente limitar las imágenes, de modo que si se produce una carga de 20 MB, se deniega con un mensaje que indica que debe reducirse.

Limitación basada en el área de imagen / megapíxeles:

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

Limitación basada en ancho o alto:

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

Limitar por área permitiría imágenes altas / delgadas o anchas / cortas que pueden ser redimensionadas, limitar por dimensiones puede ser más fácil de explicar

Tom J Nowell
fuente
Bueno, he estado pensando mucho en lo que quiero y lo que quiero es que la imagen original tenga el mismo tamaño que la dimensión establecida en el tamaño de imagen 'Grande'. Para hacer eso, creo que tengo que consultar con 'wp_handle_upload', ¿qué te parece?
Mark
Ah, entonces tiene los tamaños grande / mediano, ¿solo desea evitar que se use el original? ¿Pensé que querías decir que estaba cargando imágenes masivas y que la versión masiva siempre se usaba y no generaba las versiones más pequeñas?
Tom J Nowell
1
Pero ese gancho suena sobre el lugar correcto, o incluso el wp_handle_upload_prefilterfiltro utilizado en los que mencioné anteriormente, algún código de cambio de tamaño de PHP en lugar de la adición de un error podría hacer el truco siempre que vuelva a escribir en el archivo original. Las pruebas serán necesarios aunque
Tom J Nowell
Estás en lo correcto. Se están generando todos los tamaños adecuados. Simplemente no entiendo por qué WordPress mantendría el original cuando las dimensiones se hayan configurado en la página Configuración. O quizás haga una opción de check-in con "Keep Original" que puede optar por no participar. Solo mis 2 centavos ...
Mark
1
porque necesita guardar el archivo para luego usarlo para los otros tamaños, y es necesario si se realiza alguna modificación o regeneración
Tom J Nowell