Автоматично замінюйте оригінальне завантажене зображення великим розміром зображення


13

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

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

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

Відповіді:


10

Додайте це до файлу function.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
Якщо це рішення працює, було б дуже корисно зробити плагін.
Олексій

Я тільки що спробував це ще раз, але спершу я додав новий розмір (під назвою "повний розмір"), який був 2048х1536 (удвічі більший, ніж мені потрібно), і тепер він працює, оригінальні зображення зберігаються всього вдвічі великі, як мені потрібні (які я хочу зберегти на майбутнє), а не багато разів. Дякую!
Шон

Чудовий матеріал, радий, що він склався для вас!
Пол Філіпс

Цей код видалив усе з мого файла function.php. Я перевірив у редакторі WP і в FTP, і файл був порожнім. Довелося відновити файл із резервної копії. :(
jlg

1
@Ciprian Вам доведеться налаштувати сценарій, щоб повторити їх усі. Я впевнений, що існує WordPress спосіб отримання всієї інформації про вкладення, але $ wpdb-> get_col ('ВИБРАТИ ідентифікатор ВІД wp_posts WHERE post_type = "вкладення" 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'];

2

Чи можу я запропонувати оновити код вищевказаної відповіді? На жаль, у нових версіях Wordpress клавіша "шлях" більше не передбачена для розмірів файлів. Отже, щоб він працював над старішими завантаженнями публікацій, ми повинні спочатку дістати поточний підкаталог із вихідного зображення та скористатися цим, щоб створити шлях до великого зображення.

Тож замініть цей рядок:

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

за цими 2 рядками:

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.