WordPress и слишком много изображений
Сегодня я решил рассказать о своем небольшом опыте оптимизации WordPress в области его подхода к хранению изображений.
Сразу скажу, что отношение к WordPress у меня крайне положительное. Я действительно считаю данную CMS очень удобной во многих отношениях, при этом как для организации небольшого личного блога, так и для создания чего-то более крупного (новостного сайта, интернет-магазина и т.п.). Да, есть мнение, что данная CMS небезопасная, что ее ломают и вообще WP – это зло, но подобные мнения не помешали ей отхватить самую большую долю рынка (на сегодняшний день что-то около 30%).
Но речь пойдет, конечно, не о безопасности данной CMS, а о ее подходе к организации хранения изображений.
Так что там происходит?
Итак, что мы знаем точно: чистый WordPress генерирует 3 типа миниатюр для каждого загружаемого изображения (thumbnail, medium и large) и еще одну “скрытую” под названием medium_large, размеры которой просто из стандартных настроек в админке не поменять. Т.е. если мы загружаем для нашего сайта какую-нибудь картинку, то на сервере будет храниться не только исходник, но и 4 его уменьшенных копии.
А дальше – больше: каждый пользователь WP нагружает свой сайт темой (получаем еще несколько миниатюр) и как минимум десятком плагинов различной полезности, часть которых тоже может генерировать собственные миниатюры (например, WooCommerce). И что мы имеем в итоге:
- 4 миниатюры от WP;
- Несколько миниатюр от темы (количество зависит от упоротости разработчика и может достигать десятка, а то и больше);
- Минимум 3 миниатюры от WooCommerce и других плагинов.
Да, если речь идет о небольшом сайте или даже небольшом магазине, то описанная ситуация не вызывает каких-либо проблем, ну генерируется 5-6 лишних миниатюр, займут они несколько лишних мегабайт на диске, не проблема. А что если речь идет о крупном ресурсе, который содержит не то что тысячи, а десятки тысяч изображений?
А реальность то какова?
Теперь немного о той самой упоротости разработчиков, которую я упомянул чуть выше в скобочках. Для примера возьмем случай, когда WordPress используется в связке с WooCommerce для создания интернет-магазина. В чистом виде мы будем сразу же после установки CMS и плагина иметь 7 миниатюр (4 от WP и 3 от WC). Казалось бы – есть куда развернуться при создании какого-нибудь шаблона (темы) для магазина: берешь существующие размеры, задаешь им нужные значения и готово. Но нет, многие разработчики идут дальше – они полностью игнорируют то, что дает движок по умолчанию и создают с десяток собственных типов миниатюр. Таким образом мы можем поиметь еще с десяток разных миниатюр на все случаи жизни.
А теперь вопрос: кому нужны эти тучи неиспользуемых файлов на сервере? Хостинги вроде бы не резиновые, особенно если речь идет о VPS, где есть достаточно четко ограниченные лимиты на SSD (или еще хуже обычном HDD).
Ответ прост: никому это все не нужно! Если изображение загружено и использует только как обложка для новости, то нет никакого смысла генерировать его миниатюры для галереи товара, обложки товара, какого-нибудь портфолио и т.п. Для этого изображения нужно конкретно 3 или даже 2 миниатюры: миниатюра для родной галереи медиа-файлов WP, миниатюра для какого-нибудь архива новостей и собственно для страницы самой новости. Всё, на этом список для данного изображения заканчивается. Тоже самое справедливо и для какой-нибудь обложки товара, которой явно не нужны миниатюры под новости или портфолио.
Ну и как всегда Google предлагает нам множество решений: оптимизировать размеры, избавиться от лишнего путем отключения плагинов и другие не самые оптимальные решения. Однако, есть и другой, куда более грамотный способ, позволяющий четко оптимизировать всю логику работы с изображениями и в принципе забыть про какие-то там лишние миниатюры. Автором этого решения является разработчик Tkama, предлагающий всем желающим свой плагин Kama Thumbnail. К данному плагину существует очень подробная и качественная документация от самого разработчика, поэтому описывать что-то специфичное здесь не имеет никакого смысла, я лишь приведу примерный путь, который предстоит пройти каждому, кто решится на его использование.
Предупреждение
Обратите внимание, что предлагаемая оптимизация – это не однокнопочное решение, к которому многие привыкли. Использовать ее следует только в том случае, если вы четко понимаете, что именно вы хотите сделать, зачем это делать и как именно это делать. Без понимания этого вы просто потратите свое время зря и вернетесь к старой доброй генерации тучи миниатюр.
По-хорошему подобные вещи должны закладываться непосредственно при создании темы, но и для модификации существующей этот плагин может быть крайне полезным.
Готовимся к установке плагина
Для начала нам потребуется провести небольшую подготовку, которая позволит нам полностью избавиться от накопившегося мусора. Сама подготовка крайне проста, а суть ее раскрывает вот эта статья. Наша задача определить ненужные нам размеры изображений, заблокировать их создание и удалить все ненужные физические файлы с диска. Поэтому делаем все поэтапно:
- Выясняем какие размеры изображений зарегистрированы на сайте. Сделать это можно либо с помощью кода в статье, ссылка на которую приведена выше, либо же просто использовать плагин Regenerate Thumbnails, который зачастую устанавливается по умолчанию.
- Сохраняем их размеры в каком-нибудь файлике или просто на бумажке записываем, ведь далее нам нужно будет все это как-то учесть в коде темы;
- Бэкапим всю папку uploads и базу данных, чтобы в случае чего иметь возможность откатиться назад;
- Отключаем генерацию этих миниатюр, используя код из той же статьи (в статье данный код идет как Вариант 1). Самый хардкорный способ отключить все кроме thumbnail, который нужен самому WP для галереи;
- Устанавливаем плагин Force Regenerate Thumbnails, при этом на предупреждение, что он не тестировался с текущей версией WordPress можно не обращать внимания. Этот плагин нажатием одной кнопки удалит все миниатюры и пересоздаст только те, которые нужны (в том самом хардкорном варианте генерируется только thumbnail). Тут стоит уточнить, что эта операция может занять несколько часов, если изображений очень много, но эффект будет впечатляющим.
После применения Force Regenerate Thumbnails мы можем радоваться высвобождению огромного количества места на сервере, а также тому, что по сути то и сам ресурс у нас не поломан. Тут скажем спасибо разработчикам самого WordPress, которые позаботились о том, что с миниатюрой может что-то случиться и при ее отсутствии CMS спокойно отдаст полноразмерное изображение (дальше уже вопросы к качеству верстки темы и тому как там прописаны стили для изображений).
В итоге после выполнения подготовки имеем кучу свободного места на диске, полное отсутствие мусорных миниатюр, порядок в медиа и смысл переходить к следующему шагу.
Применяем возможности плагина
Теперь пожалуй самое сложное, но в общем-то и не такое долгое. Необходимо в файлах темы изменить логику работы с изображениями. Например, если где-то у нас используется функция the_post_thumbnail(), то мы должны заменить ее на echo kama_thumb_img(), указав нужный размер и другие необходимые параметры. По той же схеме меняем все вызовы миниатюр, которые используются на вашем ресурсе.
При этом не стоит упускать возможности использовать класс “mini”, который будет служить сигналом для плагина, что картинку необходимо обработать и отдать нужную по размерам миниатюру – это может быть крайне полезным при размещении изображений в теле статьи, да и в других местах, где конкретная картинка так или иначе прописывается вручную.
Привести какие-то конкретные примеры здесь сложно, т.к. разные темы могут использовать разный подход к использованию миниатюр, располагать их вызовы в разных кусках кода и т.п. Поэтому на этом шаге и необходимо иметь понимание того, что вы делаете и того как именно это нужно делать.
Самое главное в данном случае нужно понимать, что после изменения кода темы вы будете привязаны к ее ручному обновлению. Если вы используете стороннюю тему, то указанные изменения вы будете вынуждены учитывать каждый раз после ее обновления, а значит делать это просто путем нажатия кнопки “Обновить” уже не получится. Тоже самое справедливо и для плагинов.
Что на выходе?
Если вы прошли все этапы, то могу вас только поздравить – теперь ваш ресурс будет крайне экономно относиться к свободному пространству на жестком диске вашего сервера. Вместо десятков ненужных миниатюр вы будете иметь лишь те, которые реально нужны и при необходимости сможете быстро избавиться и от них.
Да, подобный подход не совсем тривиален и требует определенной сноровки и хотя бы небольшого опыта в разработке под WordPress (как минимум того, где и в каких файлах, что прописывается). Но его использование гарантирует наилучший результат, который только можно достичь при использовании готовой CMS.