Reemplazar automáticamente la imagen original cargada con un tamaño de imagen grande

13

Como nuestros usuarios cargan regularmente imágenes de ~ 6 MB para usar en el sitio web (y no están muy familiarizados con cómo cambiar su tamaño primero), WordPress almacena los originales y los redimensiona a varios tamaños diferentes.

Me gustaría una función o complemento que tome la imagen cargada, la redimensione a algo más manejable y luego reemplace la original.

He visto algunas funciones que eliminan el original pero no lo reemplazan, lo que significa que es imposible regenerar las miniaturas en una fecha posterior. Necesito que esto se reemplace para que el usuario pueda cargar una imagen grande y se redimensione automáticamente y se almacene para un cambio de tamaño futuro si es necesario.

Shaun
fuente

Respuestas:

10

Agregue esto al archivo functions.php en la carpeta del tema. Reemplaza la imagen original con la imagen grande establecida en la configuración. Sin embargo, es posible que desee configurar un nuevo formato de imagen y usarlo como el nuevo tamaño original.

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
Paul Phillips
fuente
1
Si esta solución funciona, sería muy útil hacer un complemento.
Alexey
Acabo de intentar esto nuevamente, pero primero agregué un nuevo tamaño (llamado 'tamaño completo') que era 2048x1536 (el doble de grande que lo necesito) y ahora está funcionando, las imágenes originales se guardan solo el doble de grande como los necesito (que quiero mantener para el futuro) en lugar de muchas veces. ¡Gracias!
Shaun
¡Grandes cosas, me alegro de que te haya funcionado!
Paul Phillips
Este código borró todo de mi archivo functions.php. Revisé el editor de WP y FTP y el archivo estaba vacío. Tuve que restaurar el archivo desde una copia de seguridad. :(
jlg
1
@Ciprian Tendrías que configurar un script para iterar a través de todos ellos. Estoy seguro de que hay una forma de WordPress de obtener toda la información del archivo adjunto pero $ wpdb-> get_col ('SELECCIONAR ID DE wp_posts WHERE post_type = "attach" ORDER BY id'); funcionaría para obtener una lista de ID de publicación para las imágenes. Tal vez agregue: Y post_mime_type = "image / jpeg" también para limitar a jpegs. La ubicación real de cada imagen se mantiene en wp_postmeta.
Paul Phillips
3

Hay un error desagradable en la solución anterior. La solución funciona como un encanto para las nuevas imágenes, pero para las imágenes antiguas, nunca se debe comparar $upload_dir['path']porque esa es la carpeta de carga actual del mes actual.

Reemplace lo siguiente:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
timocouckuyt
fuente
2

¿Puedo sugerir una actualización del código de la respuesta anterior? Desafortunadamente, en las versiones más recientes de Wordpress, la clave 'ruta' ya no se proporciona para los tamaños de archivo. Por lo tanto, para que funcione en cargas de publicaciones anteriores, primero debemos obtener el subdirectorio actual de la imagen original y usar esto para hacer la ruta de ubicación para la imagen grande.

Entonces reemplace esta línea:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

por estas 2 líneas:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
leendertvb
fuente
0

Publiqué esto en otra pregunta muy similar aquí, pero pensé que valía la pena volver a publicarlo.

Tuve problemas con el código anterior y lo que funcionó para mí fue esencialmente cambiar estas líneas:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

con:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

Publiqué mi código completo y más explicaciones aquí: ¿ Eliminar imagen original - mantener miniatura?

Pitchpole
fuente