Как ускорить WooCommerce с большим количеством товаров
Масштабирование WooCommerce до 10 000+ товаров требует оптимизации базы данных, изменения архитектуры поиска и тонкой настройки сервера. Стандартные плагины кэширования страниц не решат проблему медленной генерации страниц (TTFB) в админке, при фильтрации или оформлении заказа. Ниже приведены технические шаги для устранения узких мест производительности.
1. Переход на HPOS (High-Performance Order Storage)
Исторически WooCommerce хранил заказы в таблицах wp_posts и wp_postmeta вместе с товарами и страницами. При большом каталоге это приводит к критическому замедлению SQL-запросов.
- Перейдите в WooCommerce > Настройки > Расширенные > Особенности.
- Активируйте опцию Высокопроизводительное хранилище заказов (HPOS). Это перенесет заказы в отдельные выделенные таблицы, снизив нагрузку на мета-таблицы при поиске товаров.
2. Оптимизация базы данных и автозагрузки (Autoload)
При каждом запросе WordPress загружает в память все опции из таблицы wp_options, у которых параметр autoload равен yes. На крупных сайтах этот объем может превышать 10-20 МБ, что убивает производительность PHP.
Проверьте размер автозагружаемых данных с помощью SQL-запроса:
SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload = 'yes';
Если значение превышает 800 КБ, необходимо найти и удалить мусорные опции (часто остающиеся от удаленных плагинов) с помощью WP-CLI или плагина Advanced DB Cleaner. Также рекомендуется установить плагин Index WP MySQL For Speed для добавления недостающих индексов в таблицы базы данных.
3. Внедрение объектного кэширования (Redis / Memcached)
Для динамических страниц (корзина, личный кабинет, оформление заказа) стандартный Page Cache (кэширование страниц целиком) не работает. Чтобы разгрузить базу данных, необходимо настроить кэширование объектов.
- Убедитесь, что на сервере установлен модуль PHP-Redis.
- Добавьте в файл
wp-config.php:define('WP_CACHE', true); define('WP_REDIS_SELECTIVE_FLUSH', true); - Установите плагин Redis Object Cache и активируйте его. Это позволит хранить результаты частых SQL-запросов в оперативной памяти.
4. Перенос поиска и фильтрации на внешние движки
Стандартный поиск WooCommerce выполняет тяжелые запросы с оператором LIKE по таблицам базы данных. При большом количестве атрибутов и товаров это приводит к зависанию MySQL.
- Решение для поиска: Используйте связку плагина ElasticPress и внешнего сервера Elasticsearch. Все поисковые запросы будут обрабатываться мгновенно на выделенном поисковом движке.
- Решение для фильтров: Избегайте плагинов, выполняющих AJAX-запросы к стандартной БД при каждом клике. Используйте индексируемые фильтры (например, FacetWP или WOOF), предварительно настроив индексацию атрибутов.
5. Отключение AJAX Cart Fragments
WooCommerce по умолчанию отправляет AJAX-запрос wc-ajax=get_refreshed_fragments на каждой странице сайта для обновления виджета корзины. Это блокирует рендеринг страниц и создает лишнюю нагрузку на PHP.
Добавьте следующий код в файл functions.php вашей темы, чтобы отключить этот запрос везде, кроме страниц магазина и корзины:
add_action('wp_enqueue_scripts', 'disable_wc_cart_fragments', 11);
function disable_wc_cart_fragments() {
if (is_front_page() || is_single() || is_archive()) {
wp_dequeue_script('wc-cart-fragments');
}
}
6. Настройка лимитов PHP и сервера
Для каталогов от 10 000 товаров виртуальный хостинг (shared) неэффективен. Требуется VPS/VDS или выделенный сервер со следующими минимальными параметрами:
- PHP 8.1 / 8.2 с включенным модулем OPcache.
- Выделение памяти для WordPress в
wp-config.php:define('WP_MEMORY_LIMIT', '512M'); define('WP_MAX_MEMORY_LIMIT', '1024M'); - Веб-сервер Nginx + PHP-FPM (или LiteSpeed) вместо Apache.
Need this done? We handle this hands-on at GuardLabs — get in touch.
I take on freelance fixes and builds in this area.