Delay-delo Портфолио fullstack-разработчика

Оптимизация WordPress и WooCommerce под нагрузку

Производительность 2 мая 2025 г. 20 мин чтения

WordPress и WooCommerce спокойно выдерживают коммерческие проекты, каталоги, интернет-магазины и B2B-порталы. Но есть нюанс: сайт должен быть подготовлен к нагрузке. Без кеша, нормальной базы данных, аккуратных плагинов и контроля фоновых задач даже хороший сервер быстро превращается в дорогую грелку.

Этот гайд написан для начинающих IT-специалистов, которые уже умеют работать с WordPress, но хотят понять, почему сайт тормозит при росте посещаемости, заказов, товаров и фильтров. Здесь не будет магии. Только понятная практика, код и реальные точки, где чаще всего ломается производительность.

Оптимизация WordPress и WooCommerce под нагрузку: схема производительности сайта

Почему WordPress начинает тормозить

Сам по себе WordPress не является медленным. Чаще тормозит не ядро, а всё, что вокруг него: тяжёлая тема, десятки плагинов, слабый хостинг, неудачные SQL-запросы, отсутствие кеша и огромные таблицы WooCommerce. В маленьком проекте это почти незаметно. Но как только появляется трафик, корзины, фильтры, акции и заказы - слабые места вылезают наружу.

Представьте обычный магазин. Пока в него заходит десять человек в день, продавец справляется даже с блокнотом. Но если покупателей стало пятьсот, нужен складской учёт, касса, быстрый поиск и нормальная логистика. С WordPress то же самое. Он может работать быстро, но ему нужна правильная организация.

Главная ошибка новичков - искать один волшебный плагин. Поставил кеш, нажал кнопку «ускорить», и всё полетело. Увы, нет. Кеш помогает, но он не исправляет плохой код, раздутую базу данных и плагины, которые делают по 200 запросов на одной странице.

Сначала измеряем, потом оптимизируем

Оптимизация без замеров похожа на ремонт машины по звуку из соседней комнаты. Можно угадать, но чаще вы просто потратите время. Поэтому первый шаг - понять, где именно сайт теряет скорость.

Для WordPress удобно начать с простых инструментов: Query Monitor, вкладка Network в браузере, PageSpeed Insights, серверные логи и slow query log MySQL. Этого уже достаточно, чтобы увидеть, какие запросы выполняются долго, какие плагины грузят страницу и какие файлы тянут фронтенд вниз.

Что стоит проверить в первую очередь

  • время ответа сервера;
  • количество SQL-запросов на странице;
  • размер HTML, CSS и JS;
  • тяжёлые изображения;
  • медленные AJAX-запросы;
  • работу корзины и оформления заказа;
  • состояние таблиц wp_posts, wp_postmeta, wp_options и таблиц WooCommerce.

Если на обычной странице товара выполняется 300–500 SQL-запросов, это уже тревожный сигнал. Если страница категории с фильтрами грузится 5–8 секунд, проблема почти наверняка в базе, фильтрах, теме или плагинах.

Аудит производительности WordPress через Query Monitor и анализ SQL-запросов

Кеширование: не одно действие, а несколько уровней

Кеш - это не просто плагин. В нормальной конфигурации есть несколько уровней кеширования: кеш страницы, object cache, OPcache, браузерный кеш и CDN. Каждый уровень закрывает свою задачу.

Кеш страницы сохраняет готовый HTML и отдаёт его без полной загрузки WordPress. Object cache хранит результаты частых операций. OPcache ускоряет выполнение PHP. Браузерный кеш не заставляет пользователя снова скачивать одинаковые картинки и скрипты. CDN раздаёт статику ближе к пользователю.

Но WooCommerce нельзя кешировать грубо

Здесь начинается интересное. WooCommerce работает с корзиной, сессиями, купонами, ценами, остатками и личным кабинетом. Если закешировать всё подряд, пользователь может увидеть чужую корзину, старую цену или неверное состояние заказа. Поэтому для WooCommerce кеш нужно настраивать аккуратно.

Обычно не кешируют корзину, checkout, личный кабинет и страницы с персональными данными. А вот категории, карточки товаров, информационные страницы и статьи блога можно кешировать смелее.

# Example nginx cache bypass rules for WooCommerce

set $skip_cache 0;

if ($request_method = POST) {
    set $skip_cache 1;
}

if ($query_string != "") {
    set $skip_cache 1;
}

if ($request_uri ~* "/cart|/checkout|/my-account|/wc-api|/wp-admin|/wp-login.php") {
    set $skip_cache 1;
}

if ($http_cookie ~* "woocommerce_items_in_cart|woocommerce_cart_hash|wp_woocommerce_session_|wordpress_logged_in_") {
    set $skip_cache 1;
}

Этот пример показывает сам принцип: публичные страницы можно кешировать, а всё связанное с пользователем и заказом - пропускать мимо кеша.

Object cache и Redis: когда сайт перестаёт повторять одну и ту же работу

WordPress часто запрашивает одни и те же данные: настройки, метаданные товаров, результаты запросов, данные пользователей, список таксономий. Без object cache эти данные каждый раз снова читаются из базы. На маленьком сайте это терпимо. На магазине с тысячами товаров - уже больно.

Redis помогает хранить такие данные в памяти. Это быстрее, чем постоянно обращаться к MySQL. Особенно хорошо Redis проявляет себя на WooCommerce-проектах с большим количеством товаров, вариаций и фильтров.

Минимальная проверка Redis в WordPress

<?php
/**
 * Checks whether Redis object cache is available.
 *
 * @return bool
 */
function app_is_redis_object_cache_available(): bool
{
    if (!function_exists('wp_cache_get')) {
        return false;
    }

    $test_key = 'app_redis_test_key';
    $test_value = 'redis_is_working';

    wp_cache_set($test_key, $test_value, 'app_test', 60);

    return wp_cache_get($test_key, 'app_test') === $test_value;
}

Сам по себе этот код не включает Redis, но помогает понять, работает ли объектное кеширование. В production чаще используют готовые плагины вроде Redis Object Cache, а подключение настраивают на уровне сервера.

Важный момент: Redis не лечит плохие запросы. Если плагин делает тяжёлый поиск по wp_postmeta, Redis может снизить нагрузку, но архитектурную проблему он не уберёт.

Redis object cache для ускорения WordPress и WooCommerce

OPcache: бесплатная скорость для PHP

OPcache хранит скомпилированный PHP-код в памяти. Без него PHP каждый раз читает файл, разбирает его и компилирует заново. С OPcache часть этой работы пропадает. Для WordPress это особенно полезно, потому что при каждом запросе подключается много PHP-файлов.

На нормальном production-сервере OPcache должен быть включён. Если его нет, сайт теряет скорость буквально на ровном месте.

; Example php.ini OPcache settings

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.save_comments=1

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

База данных: сердце WooCommerce

WooCommerce хранит товары, заказы, вариации и часть данных в таблицах WordPress. Самые проблемные места - wp_postmeta, wp_options, таблицы с заказами и фоновые задачи. Чем больше товаров, атрибутов и заказов, тем внимательнее нужно смотреть на базу.

Частая картина: магазин вырос, товаров стало много, вариаций ещё больше, фильтры работают через метаполя, а база всё ещё живёт как маленький блог на десять страниц. В итоге категория открывается медленно, админка заказов тормозит, импорт подвисает, а cron забивает сервер.

Проверяем autoload в wp_options

Таблица wp_options содержит настройки WordPress и плагинов. Некоторые опции грузятся автоматически на каждом запросе. Если таких данных слишком много, сайт получает лишний вес ещё до вывода страницы.

SELECT 
    option_name,
    LENGTH(option_value) AS option_size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY option_size DESC
LIMIT 30;

Если в выдаче видны огромные временные данные, старые кеши, логи или настройки удалённых плагинов, это нужно разбирать. Но удалять вслепую нельзя. Сначала делайте резервную копию базы.

Ищем тяжёлые метаполя

SELECT 
    meta_key,
    COUNT(*) AS total_rows
FROM wp_postmeta
GROUP BY meta_key
ORDER BY total_rows DESC
LIMIT 50;

Такой запрос помогает понять, какие метаполя раздувают таблицу. Для WooCommerce это нормально видеть много строк по ценам, остаткам и вариациям. Но иногда находятся следы старых плагинов, импортов или временных расчётов, которые давно никому не нужны.

Оптимизация базы данных WooCommerce и таблицы wp_postmeta

Индексы MySQL: осторожно, но иногда нужно

Индекс в базе данных похож на оглавление в книге. Без оглавления приходится листать всё подряд. С оглавлением нужная глава находится быстрее. Но лишние индексы тоже вредят: они занимают место и замедляют запись данных.

Для WordPress нельзя просто взять набор индексов из интернета и применить ко всем сайтам. Сначала нужно понять, какие запросы реально тормозят. Для этого используют slow query log, Query Monitor или профилирование на уровне сервера.

EXPLAIN
SELECT post_id
FROM wp_postmeta
WHERE meta_key = '_price'
  AND CAST(meta_value AS DECIMAL(10,2)) BETWEEN 100 AND 500;

Если магазин активно фильтрует товары по цене, атрибутам и метаполям, запросы к wp_postmeta могут стать узким местом. В таких случаях лучше не только добавлять индексы, но и пересматривать саму логику фильтрации.

Для крупных каталогов часто выгоднее использовать специализированный поиск и фильтрацию: Elasticsearch, OpenSearch, внешние индексы или хорошо написанные таблицы под конкретную задачу.

WooCommerce и фоновые задачи: Action Scheduler

WooCommerce активно использует Action Scheduler. Через него выполняются фоновые задачи: письма, синхронизации, обновления, вебхуки, подписки, обработка очередей. Если задач становится слишком много, сайт может начать тормозить даже при небольшом количестве посетителей.

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

Проверяем количество зависших задач

SELECT 
    status,
    COUNT(*) AS total_actions
FROM wp_actionscheduler_actions
GROUP BY status
ORDER BY total_actions DESC;

Если много задач в статусе pending или failed, нужно разбираться. Иногда виноват выключенный WP-Cron. Иногда - плагин, который постоянно создаёт задачи, но не может их завершить.

Отключаем псевдо-cron и запускаем cron системно

В WordPress по умолчанию cron запускается при посещениях сайта. Для магазина под нагрузкой это плохая идея. Лучше отключить встроенный запуск и настроить системный cron.

<?php
/**
 * Disable WordPress pseudo-cron.
 */
define('DISABLE_WP_CRON', true);
# Example cron command

*/5 * * * * cd /var/www/site/public && php wp-cron.php > /dev/null 2>&1

Так фоновые задачи запускаются предсказуемо. Это снижает случайные пики нагрузки, особенно когда сайт посещают активно.

Плагины: меньше, но лучше

В WordPress легко поставить плагин на любую задачу. В этом и сила, и проблема платформы. Один плагин добавляет слайдер, второй - фильтр, третий - скидки, четвёртый - аналитику, пятый - всплывающие окна. Через месяц сайт уже напоминает чемодан, в который пытались запихнуть зимние вещи, ноутбук и набор кастрюль.

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

Как оценивать плагин перед установкой

  • проверить дату обновления;
  • посмотреть отзывы и поддержку;
  • оценить, нужен ли плагин на всех страницах;
  • проверить количество запросов через Query Monitor;
  • измерить скорость до и после установки;
  • понять, можно ли заменить плагин коротким кодом в теме.

Хорошая практика - не держать плагины «на всякий случай». Если функциональность не нужна, плагин лучше удалить, а не просто отключить.

Отключаем лишние скрипты WooCommerce там, где они не нужны

WooCommerce может подключать свои скрипты и стили даже на страницах, где магазина фактически нет. Например, на обычной статье блога или странице «О компании». Это не катастрофа, но на большом сайте такие мелочи складываются.

Ниже пример аккуратного отключения WooCommerce assets вне магазинных страниц.

<?php
/**
 * Dequeues WooCommerce assets on non-commerce pages.
 *
 * @return void
 */
function app_dequeue_woocommerce_assets_on_static_pages(): void
{
    if (is_admin()) {
        return;
    }

    if (
        function_exists('is_woocommerce')
        && (
            is_woocommerce()
            || is_cart()
            || is_checkout()
            || is_account_page()
        )
    ) {
        return;
    }

    wp_dequeue_style('woocommerce-general');
    wp_dequeue_style('woocommerce-layout');
    wp_dequeue_style('woocommerce-smallscreen');

    wp_dequeue_script('wc-cart-fragments');
    wp_dequeue_script('woocommerce');
    wp_dequeue_script('wc-add-to-cart');
}
add_action('wp_enqueue_scripts', 'app_dequeue_woocommerce_assets_on_static_pages', 99);

Такой код нужно тестировать. Некоторые темы завязаны на WooCommerce-скрипты шире, чем кажется. Но идея правильная: если страница не связана с магазином, ей не нужно тащить лишний вес.

Cart fragments: маленький скрипт, большая нагрузка

Скрипт wc-cart-fragments обновляет мини-корзину через AJAX. На сайтах с активным трафиком он может создавать заметную нагрузку, потому что запросы идут даже там, где пользователь ничего не покупает.

Если мини-корзина не нужна на каждой странице, cart fragments лучше ограничить.

<?php
/**
 * Disables WooCommerce cart fragments outside cart-related pages.
 *
 * @return void
 */
function app_disable_cart_fragments_on_public_pages(): void
{
    if (is_admin()) {
        return;
    }

    if (is_cart() || is_checkout()) {
        return;
    }

    wp_dequeue_script('wc-cart-fragments');
}
add_action('wp_enqueue_scripts', 'app_disable_cart_fragments_on_public_pages', 100);

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

Отключение WooCommerce cart fragments для снижения нагрузки на сайт

Изображения: быстрый выигрыш без риска

Картинки часто весят больше всего. Особенно в WooCommerce: карточки товаров, галереи, баннеры, категории, логотипы брендов. Если загрузить фотографии по 3–5 МБ каждая, никакой кеш не спасёт мобильного пользователя.

Для магазина желательно хранить изображения в WebP, использовать правильные размеры, включить lazy loading и не выводить огромные оригиналы там, где достаточно миниатюры.

Регистрация дополнительных размеров изображений

<?php
/**
 * Registers custom image sizes for WooCommerce catalog.
 *
 * @return void
 */
function app_register_catalog_image_sizes(): void
{
    add_image_size('catalog_card', 420, 420, true);
    add_image_size('catalog_preview', 800, 600, true);
}
add_action('after_setup_theme', 'app_register_catalog_image_sizes');

После добавления новых размеров нужно пересоздать миниатюры. Для этого можно использовать WP-CLI или плагин Regenerate Thumbnails.

# WP-CLI command

wp media regenerate --yes

На практике оптимизация изображений часто даёт самый заметный эффект для пользователя. Страница начинает открываться легче, особенно на смартфонах.

Фронтенд: CSS и JS тоже создают нагрузку

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

У WooCommerce-сайтов часто бывает так: сервер отвечает за 300 мс, но страница становится интерактивной только через 5 секунд. Значит, проблема уже на фронтенде.

Что стоит сделать

  • убрать неиспользуемые библиотеки;
  • отложить некритичные скрипты;
  • не подключать слайдеры на всех страницах;
  • сократить количество внешних виджетов;
  • проверить шрифты;
  • использовать lazy loading для iframe и видео.

Самая частая ошибка - подключать скрипт глобально, хотя он нужен только на одной странице. Это легко исправить через условную загрузку.

<?php
/**
 * Enqueues product comparison script only on comparison page.
 *
 * @return void
 */
function app_enqueue_comparison_assets(): void
{
    if (!is_page('compare-products')) {
        return;
    }

    wp_enqueue_script(
        'app-product-comparison',
        get_stylesheet_directory_uri() . '/assets/js/product-comparison.js',
        [],
        '1.0.0',
        true
    );
}
add_action('wp_enqueue_scripts', 'app_enqueue_comparison_assets');

Такой подход кажется простым, но именно из таких простых действий складывается быстрый сайт.

Админка WooCommerce: почему она тормозит

Иногда публичная часть сайта работает нормально, а админка заказов еле дышит. Причина может быть в количестве заказов, метаданных, плагинах доставки, CRM-интеграциях или медленных колонках в списке заказов.

Плагины любят добавлять свои колонки в таблицу заказов. Каждая колонка может делать отдельные запросы. В итоге список из 20 заказов вызывает сотни обращений к базе.

Убираем лишние колонки в списке заказов

<?php
/**
 * Removes unnecessary WooCommerce order list columns.
 *
 * @param array<string, string> $columns
 * @return array<string, string>
 */
function app_clean_admin_order_columns(array $columns): array
{
    unset($columns['wc_actions']);

    return $columns;
}
add_filter('manage_edit-shop_order_columns', 'app_clean_admin_order_columns', 20);

В реальном проекте нужно смотреть конкретные колонки. Иногда одна кастомная колонка от CRM тормозит сильнее, чем весь WooCommerce.

Поиск товаров: стандартный поиск не всегда справляется

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

Для крупных каталогов лучше смотреть в сторону отдельного поискового движка: Elasticsearch, OpenSearch, Meilisearch или SaaS-поиска. Это уже отдельная архитектурная тема, но знать о ней стоит заранее.

Если проект пока небольшой, можно хотя бы ограничить поиск только товарами.

<?php
/**
 * Limits frontend search results to WooCommerce products.
 *
 * @param WP_Query $query
 * @return void
 */
function app_limit_search_to_products(WP_Query $query): void
{
    if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
        return;
    }

    $query->set('post_type', ['product']);
}
add_action('pre_get_posts', 'app_limit_search_to_products');

Это не сделает поиск идеальным, но уберёт лишние страницы и записи из выдачи. Для пользователя это уже чище.

Импорт товаров: не убивайте сайт массовыми операциями

Импорт - отдельная боль WooCommerce. CSV, XML, API, синхронизация с 1С, CRM или складом. Всё это может сильно нагружать базу, особенно если обновляются цены, остатки и вариации.

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

Что делать лучше

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

Условно, если в каталоге 20 000 товаров, не нужно каждый час полностью перезаписывать все карточки. Достаточно обновить то, что изменилось.

REST API и AJAX: контролируйте частоту запросов

WooCommerce-сайты часто используют AJAX: фильтры, быстрый поиск, мини-корзина, избранное, сравнение товаров, динамические цены. Это удобно. Но если каждый клик создаёт тяжёлый запрос, сервер быстро устает.

Один пользователь не страшен. Сто пользователей, которые одновременно двигают фильтры, уже создают нагрузку. Поэтому AJAX-запросы нужно ограничивать, кешировать и делать лёгкими.

Пример простого rate limit для AJAX

<?php
/**
 * Applies a simple transient-based rate limit for AJAX requests.
 *
 * @param string $action
 * @param int $limit
 * @param int $ttl
 * @return bool
 */
function app_ajax_rate_limit(string $action, int $limit = 30, int $ttl = 60): bool
{
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $key = 'ajax_rate_' . md5($action . '_' . $ip);

    $count = (int) get_transient($key);

    if ($count >= $limit) {
        return false;
    }

    set_transient($key, $count + 1, $ttl);

    return true;
}

Это очень простой пример, не полноценная защита. Но он показывает идею: публичные динамические запросы нельзя оставлять без контроля.

Хостинг и сервер: слабая база всё портит

Можно аккуратно настроить WordPress, оптимизировать изображения, отключить лишние скрипты - и всё равно упереться в сервер. Дешёвый shared-хостинг не всегда подходит для WooCommerce под нагрузкой.

Для рабочего магазина лучше иметь VPS или выделенный сервер с нормальным запасом CPU, RAM и быстрым диском. Особенно важны диск и база данных. WooCommerce активно пишет и читает данные, поэтому медленный I/O сразу чувствуется.

Минимальная серверная связка

  • PHP 8.2 или новее;
  • OPcache;
  • MariaDB или MySQL с нормальной настройкой;
  • Redis;
  • nginx или Apache с грамотным кешированием;
  • HTTPS и HTTP/2;
  • регулярные резервные копии;
  • мониторинг CPU, RAM, диска и ошибок.

Сервер не обязан быть дорогим. Но он должен соответствовать задаче. Магазин с большим каталогом, импортами и активной рекламой нельзя держать как личный блог.

Серверная архитектура WooCommerce под высокую нагрузку с Redis, OPcache и кешем страниц

CDN: особенно полезно для статики

CDN помогает быстрее отдавать изображения, CSS, JS и шрифты. Для интернет-магазина это полезно, потому что карточки товаров часто содержат много изображений. Если посетители приходят из разных регионов, CDN снижает задержку и разгружает основной сервер.

Но CDN не ускорит плохой SQL-запрос и не исправит медленный checkout. Он работает именно со статикой и частью кешируемого контента.

Хорошая схема выглядит так: HTML кешируется осторожно, WooCommerce-страницы с корзиной не кешируются, статика уходит через CDN, изображения отдаются в WebP, браузер получает долгие заголовки кеширования.

Безопасность тоже влияет на скорость

На первый взгляд безопасность и производительность - разные темы. Но на практике они связаны. Боты, перебор паролей, спам-запросы, атаки на XML-RPC и мусорный трафик легко съедают ресурсы сервера.

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

Отключение XML-RPC, если он не нужен

<?php
/**
 * Disables XML-RPC if external integrations do not require it.
 *
 * @return bool
 */
function app_disable_xmlrpc(): bool
{
    return false;
}
add_filter('xmlrpc_enabled', 'app_disable_xmlrpc');

Перед отключением проверьте, не используют ли XML-RPC мобильное приложение, внешние публикации или старые интеграции.

Мониторинг: сайт нужно не только ускорить, но и наблюдать

Оптимизация - не разовое действие. Сегодня сайт работает быстро, завтра маркетолог добавил баннер, менеджер загрузил 5000 товаров, интегратор включил новый обмен, и производительность снова поползла вниз.

Поэтому нужен мониторинг. Хотя бы базовый: доступность сайта, время ответа, ошибки PHP, размер базы, свободное место на диске, очередь Action Scheduler и медленные запросы.

Что стоит отслеживать

  • HTTP 500, 502, 504;
  • время ответа главной страницы;
  • время ответа категорий и карточек товаров;
  • ошибки PHP;
  • размер базы данных;
  • количество failed-задач WooCommerce;
  • нагрузку CPU и RAM;
  • свободное место на диске.

Без мониторинга проблемы замечают тогда, когда уже падают продажи. А это самый дорогой способ диагностики.

Практический чеклист оптимизации WooCommerce

Ниже короткий чеклист, с которого можно начать аудит почти любого WooCommerce-сайта.

Базовый уровень

  • обновить PHP до актуальной стабильной версии;
  • включить OPcache;
  • настроить page cache;
  • исключить из кеша корзину, checkout и личный кабинет;
  • оптимизировать изображения и перевести их в WebP;
  • убрать лишние плагины;
  • проверить сайт через Query Monitor;
  • включить системный cron вместо псевдо-cron WordPress.

Средний уровень

  • подключить Redis object cache;
  • проверить autoload в wp_options;
  • проанализировать wp_postmeta;
  • ограничить cart fragments;
  • условно подключать JS и CSS;
  • проверить Action Scheduler;
  • настроить CDN для статики;
  • разобрать slow query log.

Продвинутый уровень

  • вынести поиск в отдельный движок;
  • оптимизировать фильтры товаров;
  • переписать тяжёлые кастомные запросы;
  • разделить тяжёлые импорты на очереди;
  • настроить мониторинг сервера;
  • провести нагрузочное тестирование;
  • оценить горизонтальное разделение сервисов, если проект действительно вырос.

Пример плана работ на реальном проекте

Допустим, есть WooCommerce-магазин с 8000 товаров, 30 000 заказов, фильтрами, рекламным трафиком и регулярным импортом остатков. Страница категории грузится 6 секунд, checkout иногда подвисает, админка заказов работает медленно.

В таком проекте я бы не начинал с установки очередного «ускорителя». Сначала нужен порядок.

  1. Снять текущие метрики: TTFB, SQL-запросы, размер страницы, ошибки PHP.
  2. Проверить сервер: PHP, OPcache, RAM, диск, MySQL.
  3. Включить корректный page cache с исключениями WooCommerce.
  4. Подключить Redis object cache.
  5. Проверить wp_options и wp_postmeta.
  6. Разобрать фильтры товаров и самые тяжёлые запросы.
  7. Отключить лишние assets на страницах без магазина.
  8. Оптимизировать изображения и включить CDN.
  9. Перевести WP-Cron на системный cron.
  10. Настроить мониторинг и повторно снять метрики.

Такой подход скучнее, чем «поставьте один плагин и получите ракету». Зато он работает.

FAQ: частые вопросы по оптимизации WordPress и WooCommerce

Можно ли сделать WooCommerce быстрым?

Да. WooCommerce может работать быстро, если у сайта нормальный сервер, аккуратная тема, разумное количество плагинов, кеш, Redis, оптимизированная база и контроль фоновых задач.

Какой кеш лучше для WooCommerce?

Лучше не смотреть только на название плагина. Важнее правильная настройка: не кешировать корзину, checkout, личный кабинет и пользовательские данные. Для публичных страниц магазина page cache обычно даёт хороший эффект.

Нужен ли Redis каждому сайту?

Маленькому блогу Redis может быть не нужен. Но для WooCommerce с каталогом, заказами, фильтрами и активным трафиком Redis часто даёт заметный прирост.

Почему после оптимизации сайт всё равно медленный?

Значит, осталась настоящая причина: тяжёлые запросы, плохой плагин, медленный сервер, огромная база, внешний API или фронтенд, который перегружает браузер. Нужно возвращаться к замерам.

Стоит ли отключать плагины оптимизации?

Не обязательно. Но если на сайте стоит несколько плагинов кеширования, минификации и оптимизации одновременно, они могут конфликтовать. Лучше одна понятная схема, чем пять инструментов, которые спорят друг с другом.

Итог: быстрая работа - это система

Оптимизация WordPress и WooCommerce под нагрузку не сводится к одной кнопке. Это система: сервер, кеш, база данных, фронтенд, плагины, cron, фоновые задачи и мониторинг. Если убрать только один симптом, сайт может ускориться на пару дней. Если привести в порядок всю цепочку, он начнёт работать стабильно.

Начинайте с измерений. Потом убирайте очевидный мусор. Затем настраивайте кеш, Redis, OPcache, базу и cron. После этого смотрите на фильтры, поиск, импорт и AJAX. И главное - проверяйте результат после каждого шага. Производительность любит факты, а не догадки.

Хорошо оптимизированный WooCommerce не просто быстрее открывается. Он лучше продаёт, спокойнее переживает рекламу, меньше раздражает менеджеров и не пугает владельца сайта внезапными падениями в самый неподходящий момент.