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

11

Como nossos usuários fazem upload regularmente de imagens de ~ 6MB para usar no site (e não estão muito familiarizados com como redimensioná-las primeiro), o WordPress armazena os originais, além de redimensioná-los para vários tamanhos diferentes.

Eu gostaria que uma função ou plug-in pegasse a imagem enviada, redimensionasse para algo mais gerenciável e substituísse o original.

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

    
por Shaun 31.08.2012 / 10:59

3 respostas

10

Adicione isto ao arquivo functions.php na pasta do tema. Substitui a imagem original pela grande imagem definida nas configurações. Você pode querer 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');
    
por Paul Phillips 15.10.2012 / 17:58
3

Existe um erro desagradável na solução acima. A solução funciona como um charme para novas imagens, mas para imagens antigas, você nunca deve comparar a $upload_dir['path'] porque essa é 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'];
    
por timocouckuyt 01.04.2015 / 12:54
2

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

Substitua esta linha:

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

por estas duas 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'];
    
por leendertvb 12.11.2015 / 22:40