limite tamaño imagenes

Limita el tamaño en píxeles en la subida de imágenes

¿Quien no se ha encontrado alguna vez con algún cliente o colaborador que sube imágenes a máxima resolución y calidad recién salidas de su cámara reflex de un hipermegalón de pixeles?

Este hecho puede repercutir de forma muy negativa en los tiempos de carga de tu web, por ende en la experiencia de usuario e incluso el posicionamiento SEO. Subir imágenes de grandes dimensiones es un error, conocido como Serve Scaled Images.

Debemos pensar en el diseño que tiene nuestro sitio. Si tenemos un diseño en el que las imágenes más grandes tienen un ancho máximo de por ejemplo 1.024 pixeles, subir imágenes por encima de ese tamaño es un error. El navegador cargará una imagen de más peso inútilmente. Por lo tanto, ¿no sería ideal avisar al usuario que sube una imagen grande a WordPress de que está sobrepasando el límite?

Evita el Serve Scaled Image limitando el tamaño de imagen permitido

Vamos a evitar que un usuario pueda subir imágenes superiores en tamaño a unas dimensiones definidas. En este ejemplo limitaremos para que no pueda subir imágenes superiores a 1.024 x 768px. Simplemente añadimos en el functions.php de nuestro tema o en nuestro plugin de utilidades:

<?php

function check_valid_image_size( $file ) {
    $allowed_mimetypes = array('image/gif', 'image/jpeg', 'image/png', 'image/bmp');

    if (!in_array($file['type'], $allowed_mimetypes)){
        return $file;
    }

    $image = getimagesize($file['tmp_name']);

    $maximum = array(
        'width' => '1024',
        'height' => '768'
    );

    $image_width = $image[0];
    $image_height = $image[1];

    $too_large = "Image dimensions are too large. Maximum size is {$maximum['width']} by {$maximum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";

    if ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        //add in the field 'error' of the $file array the message
        $file['error'] = $too_large;
        return $file;
    }else {
        return $file;
    }
}
add_filter( 'wp_handle_upload_prefilter', 'check_valid_image_size' );

Actuamos sobre el filtro wp_handle_upload_prefilter. Lo primero que hacemos es establecer un array de mime-types, y en caso de que el archivo a subir no corresponda a una imagen, siga el proceso por su camino y no se ejecute el resto del código.

A continuación comprobamos que la imagen no sea más ancha de 1024px o más alta de 768px. En caso de producirse una de estas dos condiciones, devolvemos un error y el archivo no se subirá. Además el usuario verá un aviso en pantalla advirtiéndole de esto.

Evitar que las imágenes se estiren y se pixelen

El caso contrario también puede ser malo. Es decir, si se suben imágenes más pequeñas de lo que deberían ser, la imagen puede estirarse y perder calidad. No influirá en los tiempos de carga pero si en dar una imagen mala de tu sitio. Podríamos añadir al código anterior una comprobación para no permitir subir imágenes inferiores a 300 x 300 por ejemplo:

<?php

function check_valid_image_size( $file ) {
    $allowed_mimetypes = array('image/gif', 'image/jpeg', 'image/png', 'image/bmp');

    if (!in_array($file['type'], $allowed_mimetypes)){
        return $file;
    }

    $image = getimagesize($file['tmp_name']);

    $minimum = array(
        'width' => '300',
        'height' => '300'
    );
    $maximum = array(
        'width' => '1024',
        'height' => '768'
    );

    $image_width = $image[0];
    $image_height = $image[1];
 
    $too_small = "Image dimensions are too small. Minimum size is {$minimum['width']} by {$minimum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";
    $too_large = "Image dimensions are too large. Maximum size is {$maximum['width']} by {$maximum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // add in the field 'error' of the $file array the message
        $file['error'] = $too_small;
        return $file;
    }elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        //add in the field 'error' of the $file array the message
        $file['error'] = $too_large;
        return $file;
    }else {
        return $file;
    }
}
add_filter( 'wp_handle_upload_prefilter', 'check_valid_image_size' );

De este modo podremos controlar que nadie suba imágenes más pequeñas o más grandes de lo que definamos, evitando que las imágenes se puedan pixelar o pesen demasiado respectivamente.

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

7 comentarios en Limita el tamaño en píxeles en la subida de imágenes

  1. La idea es buena, pero así como están los snippets se ejecutarán para cualquier archivo que se suba sea una imagen o no. Yo añadiría una comprobación del mime type al inicio de cada función para verificar que el archivo es una imagen, y si no lo es devolver $file tal cual sin hacer nada más, la información del mime type ya se encuentra en $file así que tenemos que hacer poco esfuerzo, por ejemplo para validar sólo imágenes JPEG bastaría con hacer:

    
    if ( $file['type'] != "image/jpeg" ) {
      return $file;
    }
    
    1. Gracias Samuel. Efectivamente, comprobando el mime type al principio podemos evitar seguir con la ejecución del código cuando el archivo a subir no sea una imagen.

      He incluido en el post tu recomendación, comprobando si el mime type del fichero está dentro de un array de mime types que defino para las imágenes gif, jpg, png y bmp.

      Muchas gracias!

  2. Hola Pablo,

    Sé que este post es bastante antiguo, pero existiría la posibilidad de limitar el código para que los administradores pudiesen seguir subiendo archivos sin limitaciones?

    Gracias!

  3. Hola Pepe. No lo he probado, pero puedes comprobar con la función current_user_can si el usuario tiene permisos de administrador (por ejemplo: current_user_can(‘manage_options’)). Si es true, es administrador, por lo tanto podrías «evitar» ejecutar el código

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios