Відключаємо створення копій картинок у WordPress

За промовчанням WordPress генерує чотири розміри для кожної оригінальної картинки, яку ми завантажуємо. Теми та плагіни можуть створювати додаткові розміри зображень. Таким чином, ваш сайт може створювати від 5 до 10 копій (дублів) кожного зображення, що завантажується. Це може збільшити необхідний простір на диску та розмір бекап файлів. Добре, коли всі ці копії потрібні і використовуються в темі, проте за фактом цього майже ніколи не відбувається! Тому добре було б скасувати реєстрацію додаткових розмірів мініатюр. Нижче поговоримо, як це зробити.


Коли потрібно видаляти копії зображень?

На гарне, майже завжди. У всіх випадках, коли тема не використовує всі розміри, що створюються. Для початку варто перевірити, чи не створюються копії картинок, які не використовуються у темі. Також, численні дублі зображень, що завантажуються, які поміщаються в папку uploads, можуть значно збільшити розмір бекап файлів – це як мінімум незручно. Уявіть самі, ви завантажили одну картинку, а WordPress створив ще 7 мініатюр до неї – 7 копій цієї картинки, причому деякі з дублів можуть бути майже такого ж розміру як і оригінал. З цих 7 копій всього одна піде на головну сторінку, та й то провисить там, поки її не змінить чергова і використаний файл лежатиме на хості довічно, а використовувався він день або тиждень. Якщо у вас на сайті тисячі картинок, то це може спричинити проблеми та складності.


Як дізнатися, які розміри використовуються на сайті?

За промовчанням WordPress створює чотири копії:

  1. thumbnail– Мініатюра (міняється з адмінки).
  2. medium– Середній розмір (міняється з адмінки).
  3. medium_large– Помірно великий (з WP 4.4.).
  4. large– Великий (міняється з адмінки).
  5. 1536x1536– 2x medium_large (з WP 5.3).
  6. 2048x2048– 2x large (c WP 5.3).
  7. -scaled – див. цю нотатку .

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

Перш за все, вам потрібно визначити, скільки копій створюється під час завантаження зображення. Для цього зайдіть в адмін панель і завантажте зображення великого розміру, нехай це буде картинка 1900х1000 пікселів (великий розмір потрібен для того, щоб було створено всі можливі копії). Потім зайдіть у папку завантажень зображень, зазвичай це: /wp-content/uploads/. Там файли сортуються за роками та місяцями, зайдіть в останній рік та місяць, там ви повинні побачити файл, який щойно завантажили та всі його копії:

Мій тестовий блог, де немає жодного додатково зареєстрованого темою розміру, створив 7 копій


Дізнаємося назви кожного розміру

Приклад із завантаженням зображення показує скільки їх створюється, але не показує як називається кожен розмір. Назва (ID) розміру потрібно знати, щоб його вимкнути.

Щоб дізнатися, які розміри зареєстровані на сайті, додайте наступний код у файл теми header.php або footer.php . Так ви побачите, які на сайті існують розміри і як вони називаються.

/**
 * Отримує інформацію про всі зареєстровані розміри картинок.
 *
 * @global $_wp_additional_image_sizes
 * @uses get_intermediate_image_sizes()
 *
 * @param boolean [$unset_disabled = true] Видалити зі списку розміри з 0 висотою та шириною?
 * @return array Дані всіх розмірів.
 */
function get_image_sizes( $unset_disabled = true ) {
	$wais = & $GLOBALS['_wp_additional_image_sizes'];

	$ sizes = array ();

	foreach ( get_intermediate_image_sizes() as $_size ) {
		if ( in_array( $_size, array('thumbnail', 'medium', 'medium_large', 'large') ) ) {
			$sizes[ $_size ] = array(
				'width' => get_option( "{$_size}_size_w" ),
				'height' => get_option( "{$_size}_size_h" ),
				'crop' => (bool) get_option( "{$_size}_crop" ),
			);
		}
		elseif ( isset( $wais[$_size] ) ) {
			$sizes[ $_size ] = array(
				'width' => $wais[ $_size ]['width'],
				'height' => $wais[ $_size ]['height'],
				'crop' => $wais[ $_size ]['crop'],
			);
		}

		// size registered, але має 0 width and height
		if( $unset_disabled && ($sizes[ $_size ]['width'] == 0) && ($sizes[ $_size ]['height'] == 0) )
			unset($sizes[$_size]);
	}

	return $ sizes;
}

die( print_r( get_image_sizes() ) );

Тепер зайдіть на сайт і ви побачите подібний масив:

Array
(
	[thumbnail] => Array
		(
			[width] => 150
			[height] => 150
			[crop] => 1
		)

	[medium] => Array
		(
			[width] => 300
			[height] => 300
			[crop] =>
		)

	[medium_large] => Array
		(
			[width] => 768
			[height] => 0
			[crop] =>
		)

	[large] => Array
		(
			[width] => 1024
			[height] => 1024
			[crop] =>
		)

	[post-thumbnail] => Array
		(
			[width] => 825
			[height] => 510
			[crop] => 1
		)
)


Як вимкнути створення копій?

Щоб вимкнути генерацію копій за замовчуванням, зайдіть Настройки > Медиафайлыі поставте нуль для «великого» та «середнього» розмірів.

Сторінка налаштувань Медіафайли – залишаємо тільки потрібні розміри

ВАЖЛИВО: Розмір thumbnail (мініатюра) рекомендую залишити, тому що цей розмір використовуються при створенні стандартної галереї та в прев’ю завантажених файлів в адмін-панелі. Якщо його прибрати, то стандартна галерея не працюватиме як належить. А вікно медіатеки вантажитиме оригінали файлів, що сильно гальмуватиме адмінку.

Примітка: для відображення картинок у завантажувачі медіафайлів при прикріпленні картинки до запису використовуються середній розмір (medium). Але якщо його немає, використовується мініатюра (thumbnail). Тому середній розмір можна сміливо вимикати.

Розмір medium_large, що створюється за замовчуванням з версії 4.4, відключити на сторінці налаштувань медіафайлів неможливо. Для вимкнення використовуйте хук нижче. Або зайдіть на приховану сторінку налаштувань example.com/wp-admin/options.phpі вкажіть 0 у налаштуванні medium_large_size_w:

Вимкнення розміру medium_large з адмінки


#1 Вимкнення коду

Інші 2 копії створюються темою. Зазвичай код теми, що відповідає за генерацію додаткових розмірів, можна знайти у файлі add_image_size() . Виглядатиме вона приблизно так:

add_image_size( 'homepage-thumb', 1038, 576, true);

Видаліть або закоментуйте цей рядок, так ви відключите генерацію розміру 1038х576.

Також за створення копій може відповідати функція set_post_thumbnail_size() , вона виглядає так:

set_post_thumbnail_size(150, 150);

Її потрібно видалити чи закоментувати.


#2 Видалення зареєстрованих розмірів через фільтр

Версія WordPress 3.9. з’явилася функція remove_image_size() – дозволяє видалити вказаний розмір мініатюри (фізичні файли не видаляються). Тепер, замість видалення рядків, можна відключити непотрібні розміри, додавши фільтр у файл functions.php :

add_action( 'after_setup_theme', 'remove_plugin_image_sizes', 999);

function remove_plugin_image_sizes(){
	remove_image_size('image-name');
}

Тут ‘image-name’ назва розміру ( ‘homepage-thumb’ з прикладу вище). Видалення вішається на подію after_setup_theme зазвичай цієї події достатньо. 999 означає пріоритет виконання функції видалення, пізній, тобто. функція буде викликана після решти під час цієї події.


#3 Відключення створення дод. розмірів через фільтр

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

Варіант 1

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

Також плагіни роботи із зображеннями використовують функцію get_intermediate_image_sizes() для отримання проміжних розмірів. З цим варіантом такі плагіни не побачать непотрібних розмірів зовсім.

## відключаємо створення мініатюр файлів для зазначених розмірів
add_filter( 'intermediate_image_sizes', 'delete_intermediate_image_sizes');

function delete_intermediate_image_sizes( $sizes ){

	// розміри, які потрібно видалити
	return array_diff( $sizes, [
		'medium_large',
		'large',
		'1536x1536',
		'2048x2048',
	]);
}
Варіант 2

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

// відключаємо створення мініатюр файлів для зазначених розмірів
add_filter( 'intermediate_image_sizes_advanced', function( $sizes ) {

	unset( $sizes['blog-large'] );
	unset( $sizes['blog-medium'] );
	unset($sizes['tabs-img']);
	unset( $sizes['related-img'] );
	unset( $sizes['portfolio-full'] );

	return $ sizes;
} );

У цьому коді назви: ‘blog-large’, ‘blog-medium’ і т.д. – це назви зареєстрованих розмірів мініатюр, які не потрібно створювати під час завантаження оригінального зображення.


#4 Зміна або вимкнення *-scaled розміру

Докладніше про *-scaled розмір читайте в цьому примітці .

# Змінимо максимально допустимий розмір картинки по ширині/висоті
add_filter( 'big_image_size_threshold', function(){
	return 1600;
} );
# Скасуємо `-scaled` розмір - обмеження максимального розміру картинки
add_filter( 'big_image_size_threshold', '__return_zero');


Висновок

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


Плагіни на тему

Kama Thumbnail

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

Force Regenerate Thumbnails

При відключенні розмірів мініатюр, фізичні файли мініатюр, що лежать у папках, не видаляються. Вимикається лише зареєстрований розмір і при черговому завантаженні файлу мініатюра з відключеним розміром створюватися вже не буде. Щоб почистити “старі” файли, використовуйте плагін “Force Regenerate Thumbnails”. Плагін повністю перетворить фізичні файли відповідно до поточних установок для мініатюр.

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *