Substituir automaticamente a imagem original carregada por um tamanho de imagem grande

13

Como nossos usuários carregam regularmente ~ 6MB de imagens para uso no site (e não estão muito familiarizados com como redimensioná-las primeiro), o WordPress armazena os originais e redimensiona-os para vários tamanhos diferentes.

Gostaria de uma função ou plugin que pegue a imagem carregada, a redimensione para algo mais gerenciável e substitua a original.

Vi algumas funções que excluem o original, mas não o substituem, o que significa que é impossível regenerar as miniaturas posteriormente. Eu preciso que isso seja substituído para que o usuário possa fazer upload de uma imagem grande e ela é redimensionada automaticamente e armazenada para redimensionamento futuro, se necessário.

Shaun
fonte

Respostas:

10

Adicione isso ao arquivo functions.php na pasta do tema. Ele substitui a imagem original pela imagem grande definida nas configurações. Você pode configurar um novo formato de imagem e usá-lo como o novo tamanho 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
fonte
1
Se esta solução funcionar, seria muito útil criar um plugin.
Alexey #
Acabei de tentar novamente e, primeiro, adicionei um novo tamanho (chamado 'tamanho real') que era 2048x1536 (duas vezes maior que eu preciso) e agora está tudo funcionando, as imagens originais são salvas duas vezes mais grande como eu preciso deles (que eu quero manter para o futuro) em vez de muitas vezes. Obrigado!
Shaun
Ótimas coisas, feliz que funcionou para você!
Paul Phillips
Este código excluiu tudo do meu arquivo functions.php. Eu verifiquei no editor WP e no FTP e o arquivo estava vazio. Teve que restaurar o arquivo de um backup. :(
JLG
1
@ Ciprian Você teria que configurar um script para percorrer todos eles. Tenho certeza de que existe uma maneira do WordPress obter todas as informações do anexo, exceto $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); funcionaria para obter uma lista de IDs de postagem para as imagens. Talvez adicione: AND post_mime_type = "image / jpeg" também para limitar a apenas jpegs. A localização real de cada imagem é mantida em wp_postmeta.
Paul Phillips
3

Há um bug desagradável na solução acima. A solução funciona como um encanto para novas imagens, mas para imagens antigas, você nunca deve comparar $upload_dir['path']porque é a pasta de upload atual do mês atual.

Substitua o seguinte:

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

Posso sugerir uma atualização para o código da resposta acima? Infelizmente, nas versões mais recentes do Wordpress, a chave 'caminho' não é mais fornecida para os tamanhos de arquivo. Portanto, para que funcione em uploads mais antigos, primeiro devemos obter o subdiretório atual da imagem original e usá-lo para criar o caminho do local para a imagem grande.

Então substitua esta linha:

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

por estas 2 linhas:

$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
fonte
0

Eu postei isso em outra pergunta muito semelhante aqui, mas achei que vale a pena republicar.

Eu tive problemas com o código acima e o que funcionou para mim foi essencialmente mudar essas linhas:

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

com:

    $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";
    }

Publiquei meu código completo e mais explicações aqui: Excluir imagem original - manter a miniatura?

Pitchpole
fonte