Мы считали, сколько тянуть с рабочего сервера на тестовый, и разложили папку медиа одного каталога по типам файлов. Больше половины — 6,39 ГБ из 12 — оказались копиями картинок, которые сайт не показывает нигде.

Это 11-я часть цикла «Сервер для WordPress».

Откуда лишние копии

При каждой загрузке картинки WordPress сразу режет её на все зарегистрированные размеры: свои встроенные и те, что объявила тема через add_image_size(). А наши темы выводят картинки через свой плагин миниатюр с отдельным кэшем, который режет размеры по требованию и сразу в современных форматах. Получалось два комплекта миниатюр, из которых сайт пользовался одним.

Сколько это

ЧтоОбъёмФайлов
вся папка загрузок12 ГБ
варианты размеров от WordPress6,39 ГБ34 485
оригиналы картинок2,70 ГБ6 211
видео1,45 ГБ124
PDF и прочее1,10 ГБ257

По размерам:

РазмерОбъёмКто объявилНужен?
975×5481,64 ГБтемане используется
560×3150,65 ГБтемане используется
300×1690,25 ГБтемане используется
1024 (large)1,58 ГБWordPressпроверять
768 (medium_large)0,97 ГБWordPressпроверять
15360,20 ГБWordPressпроверять
150×150 (thumbnail)0,15 ГБWordPressнужен админке

Три размера темы — 2,54 ГБ и 15 883 файла — объявлены в functions.php и не читаются нигде: ни функциями вывода миниатюр, ни по имени в коде темы и плагинов.

Как посчитать у себя

U=wp-content/uploads
# сколько весят варианты размеров
find $U -type f -regextype posix-extended -regex '.*-[0-9]+x[0-9]+\.(jpg|jpeg|png|webp|avif)$' \
  -printf '%s\n' | awk '{s+=$1;n++} END {printf "варианты: %.2f ГБ, %d файлов\n", s/1073741824, n}'
# какие размеры плодятся
find $U -type f -regextype posix-extended -regex '.*-[0-9]+x[0-9]+\.(jpg|jpeg|png)$' \
  | sed -E 's/.*-([0-9]+x[0-9]+)\..*/\1/' | sort | uniq -c | sort -rn | head

И поиском по теме и плагинам: add_image_size(, the_post_thumbnail(, wp_get_attachment_image и имена размеров строкой.

Порядок: сначала перестать плодить

  1. убрать ненужные размеры из темы, а встроенные отключить фильтром intermediate_image_sizes_advanced. Если сначала удалить файлы, они вернутся с ближайшей загрузкой — у каталога с обменом 1С это ближайшая ночь;
  2. удалить накопленное — по метаданным вложений, вычищая из них записи о размерах;
  3. проверить, что новая загрузка (у нас — обмен с 1С) больше не создаёт лишних файлов.
add_filter('intermediate_image_sizes_advanced', function ($sizes) {
    foreach (['medium_large', 'large', '1536x1536', '2048x2048'] as $name) {
        unset($sizes[$name]);
    }
    return $sizes; // thumbnail и medium оставляем — их использует админка
});

Что проверить до удаления

  • 150×150 нужен админке — медиатека рисует им превью;
  • SEO-плагин берёт картинку для og:image. Проверьте, какой размер он отдаёт: curl страница | grep og:image. У нас — оригинал, без суффикса размера;
  • поля ACF в формате «массив» отдают sizes со всеми размерами — поищите в шаблонах ['sizes']['имя'];
  • выгрузки и фиды для маркетплейсов могут брать конкретный размер;
  • удаление файлов не чистит метаданные: если что-то всё же обратится к размеру, получит битую ссылку, а не оригинал. Поэтому удалять нужно вместе с правкой меты вложения.

Результат на другом сайте

На втором каталоге с той же историей за один заход ушли 4,2 ГБ лишних размеров, 2,7 ГБ хвоста от плагина конвертации в WebP, который давно не использовался, и 4,4 ГБ картинок, оставшихся от обмена с 1С без ссылок на них. Свободного места на сервере стало больше на 13 ГБ.

Попутно нашёлся шаблон, который читал размер article-medium, не зарегистрированный нигде, — превью статей в архиве молча приходили пустыми. Такие мёртвые обращения находятся тем же поиском по именам размеров.

Диск сервера кончается, а сайт вроде небольшой?

Пришлите адрес — посчитаю, сколько места занимают миниатюры, которые никто не показывает, и уберу их без битых картинок.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.