Все, кто использует CMS WordPress, наверняка знают, что при загрузке на сайт новых изображений WordPress создает их копии разного размера — так называемые миниатюры изображений. Сделано это из лучших побуждений, конечно, чтобы оптимизировать размеры картинок для различных вариантов их отображения и тем самым увеличить скорость загрузки страниц благодаря уменьшению веса графики.
При этом WordPress не только сам создает миниатюры изображений различного размера по-умолчанию, но также позволяет делать это плагинам и темам оформления сайта для собственных нужд, предоставляя соответствующие функцию из своего API, которыми очень охотно пользуются разработчики тем и плагинов, увы, часто без оглядки друг на друга. Подобная свобода, как показывает практика, может приводить к очень серьезному и неоправданному перерасходу ресурсов на хостинге, если этой особенности вовремя не уделить отдельное внимание, как раз об этом и будет история ниже.
Решили однажды на сайте одной компании, сделанном на WordPress, отказаться от использования галерей для показа изделий и воспользоваться плагином электронного магазина WooCommerce, дающим более гибкие возможности для управления представлением предлагаемых изделий и их характеристик. Попутно обновили базовую коммерческую тему, используемую в качестве родительской для темы-наследника, определяющей вид сайта. Обновление и смена функционала прошли успешно, владелец сайта начал наполнять его товарами, однако очень быстро работа встала — обнаружилось почти полное исчерпание свободного места на сервере.
Что же произошло? Ответ был найден быстро, достаточно оказалось заглянуть в каталог uploads — место на диске было съедено миниатюрами изображений, вариантов которых оказалось гораздо больше, чем можно было предположить изначально. Оставалось понять, почему так случилось и как исправить ситуацию.
Как можно узнать, сколько и какие миниатюры создает сайт на WordPress в отдельно взятом конкретном случае?
Для этого существуют разные способы и один из них — поиск использования функции add_image_size(…) в исходниках темы и всех плагинов, однако вряд ли этот метод всем покажется удобным.
К счастью, есть способы значительно проще и интереснее. В нашем случае я воспользовался помощью плагина WP Smush, изначально предназначенного для компрессии изображений без визуальной потери их качества (кстати, далеко не единственный плагин, предназначенный для оптимизации размеров изображений). В качестве дополнительной информации WP Smush показывает все варианты создаваемых миниатюр вместе с их точными идентификаторами, предлагая выбрать, какие из них ему оптимизировать.
Предлагаю взглянуть на скриншот списка миниатюр, создававшихся на упомянутом выше сайте на момент обнаружения проблемы, он впечатляет и может повергнуть в ужас, особенно, если обратить внимание на размеры отдельных «миниатюр» — целых 20 штук для каждого загружаемого изображения, если оно превышает размер миниатюры!
Если посмотреть на названия, то в целом понятно стало, кто и какие картинки создает: немалую часть списка составляли миниатюры для публикаций типа портфолио, а также набор для сеточного представления постов — ни то, ни другое на сайте вообще не использовалось, однако исправно генерировалось фреймворком профессиональной темы оформления без какой-либо возможности отключить все это безобразие из панели настроек. При этом сама тема является мега-популярной на рынке коммерческих тем и позиционируется как универсальная, и в этом нет противоречия — давно понятно, что за любые удобства использования и универсальность всегда полагается определенная плата.
В уместности наличия некоторых других миниатюр изображений и их размеров также появились вопросы: например, зачем генерировать «большое» изображение 1024 x 1024, если на сайте уже установлен замечательный плагин Resize Image After Upload, уменьшающий все оригиналы загружаемых изображений до настраиваемого размера 1200 x 1200 (конечно, только если они его превышают). К слову сказать, если на сайте установлен плагин WP Smush, установка Resize Image After Upload уже не обязательна — даже в бесплатной версии Смаша есть опция уменьшения размера оригиналов загружаемых картинок.
Для решения проблем с «не отключаемыми» миниатюрами пришлось написать небольшой скрип, отменяющий в нужный момент времени (в хуке after_setup_theme) «заявку» на создание миниатюр, «поданную» скриптами родительской темы сайта. Скрип был добавлен в файл functions.php дочерней темы, разумеется, ниже его исходник, где вместо mythemename можно вписать название собственной темы:
/* * Отключаем генерацию ненужных миниатюр */ function mythemename_remove_some_tn() { // Миниатюры для портфолио remove_image_size( 'portfolio-full' ); remove_image_size( 'portfolio-one' ); remove_image_size( 'portfolio-two' ); remove_image_size( 'portfolio-three' ); remove_image_size( 'portfolio-five' ); remove_image_size( 'recent-works-thumbnail' ); // Миниатюры для сеточного расположения элементов remove_image_size( '200' ); remove_image_size( '400' ); remove_image_size( '600' ); remove_image_size( '800' ); remove_image_size( '1200' ); } add_action( 'after_setup_theme', 'mythemename_remove_some_tn', 99);
После этой нехитрой меры список создаваемых миниатюр значительно сократился, о чем не замедлил сообщить WP Smush:
Размеры medium и large были обнулены из консоли панели управления WordPress (Настройки → Медиафайлы) и удалось точнее подобрать размеры миниатюр для изображений товаров магазина через админку WooCommerce.
А что же делать с ранее созданными не нужными миниатюрами?
Избавиться от них можно в два этапа, используя еще одну пару полезных плагинов:
- Thumbnail Cleaner (позволяет удалить все миниатюры, сохранив при этом оригиналы изображений)
- Regenerate Thumbnails (создает новые миниатюры «согласно поданным заявкам» движка WordPress, его активных тем и плагинов)
При их использовании нужно помнить, однако, что они могут создать ощутимую нагрузку на веб-сервер, поэтому подобные операции лучше проводить в периоды наименьшей посещаемости сайтов и соответственно загруженности сервера, например, в ранние утренние часы. Также следует иметь ввиду, что работа плагина Regenerate Thumbnails может быть довольно долгой, если на сайте уже выложено много изображений.
По окончании всех манипуляций с миниатюрами полезно проверить сайт с помощью плагина Broken Link Checker чтобы убедиться в наличии всех миниатюр на своих местах — в момент их повторного создания возможна флуктуация в размерах картинки всего в 1 пиксель, однако это приведет к изменению имени файла и неработоспособности ссылки на него. Впрочем, плагин Broken Link Checker в любом случае полезно «держать под рукой» и запускать время от времени для выявления битых ссылок на сайте.