Автоматически заменять исходное загруженное изображение большим размером

13

Поскольку наши пользователи регулярно загружают ~ 6 МБ изображений для использования на веб-сайте (и не слишком знакомы с тем, как сначала изменить их размер), WordPress сохраняет оригиналы, а также изменяет их размеры до нескольких различных размеров.

Я хотел бы функцию или плагин, который берет загруженное изображение, изменяет его размер к чему-то более управляемому и затем заменяет оригинал.

Я видел некоторые функции, которые удаляют оригинал, но не заменяют его, а это означает, что невозможно восстановить эскизы позднее. Мне нужно, чтобы это было заменено, чтобы пользователь мог загрузить большое изображение, и оно автоматически уменьшается и сохраняется для последующего изменения размера при необходимости.

Shaun
источник

Ответы:

10

Добавьте это в файл functions.php в папке темы. Он заменяет исходное изображение большим изображением, установленным в настройках. Возможно, вы захотите установить новый формат изображения и использовать его в качестве нового исходного размера.

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');
Пол Филлипс
источник
1
Если это решение работает, было бы очень полезно создать плагин.
Алексей
Я только что попробовал это снова, но сначала я добавил новый размер (так называемый «полный размер»), который был 2048x1536 (в два раза больше, чем мне нужно), и теперь все работает, исходные изображения сохраняются всего в два раза они мне нужны (которые я хочу сохранить на будущее), а не много раз. Благодарность!
Шон
Отличный материал, рад, что это сработало для вас!
Пол Филлипс
Этот код удалил все из моего файла functions.php. Я проверил в редакторе WP и в FTP, и файл был пуст. Пришлось восстановить файл из резервной копии. :(
JLG
1
@Ciprian Вам нужно будет настроить скрипт для их всех. Я уверен, что есть WordPress способ получения всей информации о вложениях, но $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); будет работать, чтобы получить список идентификаторов сообщений для изображений. Возможно добавьте: AND post_mime_type = "image / jpeg" тоже, чтобы ограничиться только jpegs. Фактическое местоположение каждого изображения хранится в wp_postmeta.
Пол Филлипс
3

В приведенном выше решении есть одна неприятная ошибка. Решение работает как новая модель для новых изображений, но для старых изображений вы никогда не должны сравнивать, $upload_dir['path']потому что это текущая папка для загрузки текущего месяца.

Заменить следующее:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
timocouckuyt
источник
2

Могу ли я предложить обновление кода вышеуказанного ответа? К сожалению, в новых версиях Wordpress ключ «путь» больше не указывается для размеров файлов. Таким образом, чтобы он работал при более старых загрузках постов, мы должны сначала получить текущий subdir из исходного изображения и использовать его для определения пути расположения для большого изображения.

Поэтому замените эту строку:

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

этими двумя строчками:

$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
источник
0

Я разместил это на другом очень похожем вопросе здесь, но думал, что это стоит перепостить.

У меня были проблемы с кодом выше, и то, что у меня получилось, по сути меняло эти строки:

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

с:

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

Я разместил свой полный код и дополнительные пояснения здесь: Удалить исходное изображение - сохранить миниатюру?

Pitchpole
источник