Удаляем лишние изображения WP

Любой живой блог на WordPress имеет свойство «замусориваться» по мере своей жизни, особенно когда устанавливаются шаблоны генерирующие свои картинки для миниатюр и статей.

Так и произошло в моем случае, не смотря на достаточно лояльный хостинг с большим размером места на диске, за 6-ть лет своего существования мы практически уперлись в потолок отведенных гигабайтов и самое неприятное — inode.

При создании файловой системы создаются также и структуры данных, содержащие информацию о файлах. Каждый файл имеет свой индексный дескриптор, идентифицируемый по уникальному номеру (часто называемому ‘i-номером’ или ‘инодом’), в файловой системе, в которой располагается сам файл.

Индексные дескрипторы хранят информацию о файлах, такую как принадлежность владельцу (пользователю и группе), режим доступа (чтение, запись, запуск на выполнение) и тип файла. Существует определённое число индексных дескрипторов, которое указывает максимальное количество файлов, допускаемое определённой файловой системой. Обычно при создании файловой системы примерно 1 % её объёма выделяется под индексные дескрипторы.

https://ru.wikipedia.org/wiki/Inode

Грубо говоря, каждое физическое или виртуальное-физическое устройство имеет ограничение по количеству файлов, в случае с хостингом данный параметр устанавливается вручную, иначе один пользователь может занять всё, что распределяется на всех пользователей.

В случае этого блога, мы имеем в распоряжении 200.000 inode и 10Gb места. Учитывая что сайт кеширует страницы на диске, то стали регулярно появляться сообщения о исчерпании доступного количества файлов и директорий на диске.

Я давно уже заметил что сайт генерит лишние миниатюры и причина мне известна, но было лениво заниматься оптимизацией WordPress. Выхода два, либо заняться удалением лишнего и настройкой картинок, либо просто докупить место. На сегодня сайт не зарабатывает столько, чтобы позволить себе что-то докупать, поэтому изучаем вопрос — как найти и удалить неиспользуемые картинки wordpress.

По умолчанию WordPress генерит 4-ре файла и их размеры доступны в админ панели -> Настройка -> Медиафайлы

Настройки размера миниатюры WordPress
Настройки размера миниатюры WordPress

Так же генерится скрытый размер, изменить который явно не получится, об этом позже.

В дополнение ко всему, при загрузке медиа-файла у меня в списке был еще один формат Featured Images

Featured Images
Featured Images

Ну и вишенкой на торте были еще разные форматы от установленного шаблона, итого 12! файлов вместо стоковых 5 по умолчанию.

Учитывая то, что сейчас блок содержит порядка 12.000 изображений, мы получаем 7*12.000=84.000 лишних файлов, не считая занятого места.

Куча разных бесполезных картинок
Куча разных бесполезных картинок

ВАЖНО! Первым делаем backup всего сайта вместе с БД и сливаем его на внешний носитель. Я неоднократно попадал в ситуацию, когда при глобальных изменениях все казалось работоспособным, но спустя время всплывала проблема, решить которую без потери информации можно было только использую бекап.

Теперь начинаю анализировать какие форматы и сколько файлов мне необходимо. По факту получилось что хватает тех самых 5-ти размеров. 150*150, 300*300, 640*480, 1024*768 и оригинал. Примерные размеры определены, теперь необходимо подружить размеры картинок для шаблона и для WordPress настроек.

Если шаблон не имеет настроек размерности картинок в админ панели, то изменить их можно изменить в function.php для активного шаблона. Я комментировал одну строку и поменял размеры для других, где соответственно первое число это ширина, а вторая высота(если 0, то высота изменится пропорционально ширине).

Настройки картинок в function.php
Настройки картинок в function.php

В настройке WordPress размеры выставляем точно такие же

Настройки размера миниатюры WordPress
Настройки размера миниатюры WordPress

Теперь нужно заменить размеры Futured Images, по умолчанию оно 768*0, для же статей мы используем 640*480.

Настройки данного формата можно выполнить на скрытой странице админ панели /wp-admin/option.php

Скрытая страница /wp-admin/option.php
Скрытая страница /wp-admin/option.php

У меня почему-то не сохранялись настройки для medium_large_size и оставались 768*0, я выполнил замену через phpMyAdmin для для таблицы option.

Теперь показывает нужные мне размеры для размера миниатюр

Futured Images
Futured Images

Чтобы проверить какие размеры и для чего прописаны, можно добавить следующие строки в header.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, but has 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() ) );

В результате увидим какой-то такой массив форматов изображений, а далее будет понятно куда копать. В моем случае я так искал откуда вылазит 768*0

Массив форматов изображений WordPress
Массив форматов изображений WordPress

Прогнав несколько раз тестовые картинки, убедились в правильности настроек форматов изображений и отсутствии не используемых изображений, теперь дело за малым, удалить ненужное за все года и генерировать правильные форматы.

Здесь на помощь приходит плагин Regenerate Thumbnails

Здесь ничего сложного, устанавливаем и переходим на страничку плагина в админке

Wordpress Regenerate Thumbnails
WordPress Regenerate Thumbnails

Мы видим актуальные миниатюры для текущих настроек. Размеры для шаблона и WordPress у меня совпадают.

Нажимаем на «Пересоздать миниатюры для всех вложений«, но тут стоит обратить внимание, что это вызовет нагрузку на CPU хостера, т.ч. это стоит делать частями(у меня это получалось если просто отправить laptop в спящий режим, а позже открыть), либо обратится к хостеру с просьбой временно разрешить чрезмерную нагрузку, либо искать другие плагины, которые позволяют регулировать нагрузку.

Генерация наших 12тыс. вложения заняло около 10 часов и нагрузка на CPU составила 250% против обычных до 100%.

Чрезмерная нагрузка на CPU хостинга
Чрезмерная нагрузка на CPU хостинга

И теперь сравниваем до и после, занятое место 5,7Gb вместо 8,7Gb ранее, а indoe ~150k вместо ~190k ранее

Результаты удаления и оптимизации картинок WP
Результаты удаления и оптимизации картинок WP
Результаты удаления и оптимизации картинок WP
Результаты удаления и оптимизации картинок WP

Количество удаленных файлов оказалось примерно ~40.000 против предполагаемых ~84.000, а связанно это с тем, что было несколько шаблонов за время жизни нашего блога и, возможно, некоторые шаблоны не генерили свои форматы миниатюр.

Оставьте первый комментарий

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*