Заміна оригінального зображення зменшеною копією
У цій статті я хотів би показати, як видалити оригінал завантажуваного зображення при завантаженні WordPress, а його функції призначити найбільшому розміру одержуваного з цього зображення.
Для початку, розберемо, чому і коли може виникнути потреба.
Припустимо, ви створили сайт WordPress, який постійно поповнюється новими матеріалами і куди постійно потрібно завантажувати велику кількість фотографій. Якщо ви самі займаєтеся підтримкою сайту, Ви, швидше за все, перед завантаженням зменшуєте розмір фотографій, щоб вони швидше завантажувалися і займали менше місця на сервері. Але, якщо замовник сайту сам цим займатиметься, він поняття не має як зменшувати розмір фотографій і намагається завантажувати п’яти мегабайтні файли, а може і більшого розміру, які дуже швидко заповнять дисковий простір.
Звільнити дисковий простір можна простим видаленням оригінальних файлів, але це рішення, хоч і приносить бажаний результат, є дуже сумнівним. Справа в тому, що, якщо потрібно буде заново згенерувати нові розміри для зображень це не вдасться зробити. Генерація нових зображень може знадобитися, коли на сайті будуть використовуватися нові розміри або, наприклад, коли потрібно змінити або додати водяний знак на фотографії.
Плавно переходимо на краще вирішення цього завдання. Після завантаження великої фотографії і після того, як WordPress створить з неї набір меншого розміру, ми видаляємо оригінал величезного розміру і призначаємо найбільшу копію як оригінал. Тим самим ми позбавляємося від непотрібних великих файлів, але й зберігаємо можливість генерації нових розмірів при необхідності.
Після довгого вступу нижче знаходиться безпосередньо код, який допоможе це зробити. Буде гарною ідеєю перевизначити розміри для найбільшої копії та задати їх із запасом.
function rmn_replace_uploaded_image($image_data) {
// Нічого не робити якщо зображення маленьке
if ( !isset( $image_data['sizes']['large'] ) ) return $image_data;
// Шляхи до зображень та велике зображення
$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'];
// Видалити завантажене зображення
unlink($uploaded_image_location);
// Перейменування великої копії
rename($large_image_location,$uploaded_image_location);
// Оновлення метаданих
$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', ' rmn_replace_uploaded_image' );
Парочка невеликих ремарок до коду вища. Щоб він запрацював, потрібно вимкнути масштабування великих зображень у WordPress. Для великих фотографій/зображень він створює ще один розмір і позначає суфіксом «_scaled» в імені. Ця додаткова дія нам не потрібна, тому відключаємо:
add_filter( 'big_image_size_threshold', '__return_false' );
Як другий ремарка, хотів би відзначити, що код вище працює тільки для нових зображень. Якщо потрібно, замінити/видалити оригінал для вже завантажених у медіа бібліотеку, то рядок $large_image_location = …, потрібно замінити наступним кодом.
$current_subdir = substr( $image_data['file'], 0, strrpos( $image_data['file'], '/' ) );
$large_image_location = $upload_dir['basedir'] . '/' . $current_subdir . '/' . $image_data['sizes']['large']['file'];
Таким чином можна замінити завантажене зображення копією меншого розміру. Тим самим безпечно видаливши оригінальне зображення і залишивши його найбільшу копію.
Поданий код не є виключно моїм, я лише модифікував та адаптував його для своїх потреб.