Upload Images and Files

Limitar la subida de imágenes en WordPress

03 de Mar, 2018

Limitar la subida de imágenes en WordPress
5 (100%) 2 votes

Dicen que el peor enemigo de WordPress es el usuario, por eso debemos guiarle siempre por el buen camino. Una de los problemas más graves de WPO(Web Performance) es el tamaño con el que el usuario sube las imagenes, WordPress nativamente no limita el tamaño ni el peso de las imágenes es por esto que es necesario colocar un filtro a los usuarios para evitar que suban fotos muy grandes ya que cada vez contamos con dispositivos con más capacidad y calidad.

Para ello solo nos hace falta crear un filtro el cual podemos fácilmente incluir en el functions.php de nuestro tema

  1. function ezLimitImageWeight($file) {
  2.  
  3. // Calculamos el peso de la imagen en KB
  4. $image_size = $file['size']/1024;
  5.  
  6. // Establecemos un límite KB
  7. $limit = 200;
  8.  
  9. // Chequeamos si es una imágen
  10. $is_image = strpos($file['type'], 'image');
  11.  
  12. if ( ( $image_size > $limit ) && ($is_image !== false) )
  13.         $file['error'] = _e('Tu imagen es muy pesada. Debe pesar menos de '. $limit .'KB');
  14.  
  15. return $file;
  16.  
  17. }
  18. add_filter('wp_handle_upload_prefilter', 'ezLimitImageWeight');

Y si queremos excluir por ejemplo al administrador u otro usuario solo debemos incluir el filtro dentro de la estructura de control:

  1. // excluir administradores
  2.  if ( ! current_user_can( 'manage_options' ) ) {
  3.       if ( ( $image_size > $limit ) && ($is_image !== false) ) {
  4.             $file['error'] = _e('Tu imagen es muy pesada. Debe pesar menos de '. $limit .'KB');
  5.       }
  6.  }

Ahora extendamos un poco y creemos ademas un filtro para el tipo de imagen y otro para que el usuario solo pueda subir un número de imagenes, tendremos lo siguiente:

  1. function ezLimitImageWeight($file) {
  2.  
  3.      // Calculamos el peso de la imagen en KB
  4.      $image_size = $file['size']/1024;
  5.  
  6.      // Establecemos un límite KB
  7.      $limit = 200;
  8.  
  9.      // Chequeamos si es una imágen
  10.      $is_image = strpos($file['type'], 'image');
  11.  
  12.     // establecemos un límite de imágenes
  13.     $imagelimit = 7;
  14.  
  15.     // Establecemos los tipos de imágenes aceptados
  16.     $imagetype = array('image/jpeg', 'image/png');
  17.  
  18.     // Buscamos cuantas imágenes ha subido el usuario actual
  19.     global $current_user;
  20.     $args = array(
  21.         'orderby'         => 'post_date',
  22.         'order'           => 'DESC',
  23.         'numberposts'     => -1,
  24.         'post_type'       => 'attachment',
  25.         'author'          => $current_user->ID,
  26.     );
  27.     $attachmentsbyuser = get_posts( $args );
  28.  
  29.     if ( ( $image_size > $limit ) && ($is_image !== false) ) { // Chequeamos primero si la imagen es pequeña
  30.         $file['error'] = _e('Tu imagen es muy pesada. Debe pesar menos de '. $limit .'KB');
  31.     } elseif ( !in_array($type, $imagetype) ) { // chequeamos si el tipo de imagen esta permitida
  32.         $file['error'] = _e('La imagen debe ser JPEG ó PNG.');
  33.     } elseif ( count( $attachmentsbyuser ) >= $imagelimit ) { // Chequeamos si el usuario ha superado el límite de subida
  34.         $file['error'] = _e('El limite de ' . $imagelimit . ' subidas ha sido excedido por el usuario.');
  35.     }
  36.     return $file;
  37.  
  38. }
  39. add_filter('wp_handle_upload_prefilter', 'ezLimitImageWeight');