Производительность, кеш и запуск
Магазин, который хорошо работал с десятью товарами на локальном компьютере, на рабочем сервере встречает настоящую нагрузку: сотни заказов, кеш, почту, платёжный сервис. Перед запуском проверяют три вещи: что кеш не ломает корзину, что свой код не замедляет страницы и что фоновые задачи выполняются.
Что нельзя кешировать
Кеш страниц отдаёт сохранённый HTML вместо запуска PHP. Каталог и страницы товаров так ускорять можно, а личные страницы — нет: один покупатель увидит корзину другого.
| Не кешировать | Почему |
|---|---|
/cart/, /checkout/, /my-account/ | Содержимое своё у каждого покупателя |
Адреса с ?add-to-cart= и wc-ajax= | Изменяют корзину |
/wp-json/wc/store/ | Данные блочной корзины |
Запросы с cookie woocommerce_items_in_cart, woocommerce_cart_hash, wp_woocommerce_session_... | У посетителя есть корзина |
Популярные плагины кеша знают эти правила сами. Если кеш настроен на сервере или в CDN, исключения добавляют вручную.
Свой код и скорость
Четыре привычки, которые не дают плагину замедлить магазин:
| Привычка | Пример |
|---|---|
| Ограничивать выборки | limit => 12 вместо -1 |
| Брать идентификаторы, когда объекты не нужны | return => ids |
| Не делать внешних запросов при выводе страницы | Перенести в Action Scheduler |
| Запоминать тяжёлые результаты | Транзиент на час |
Запоминание результата
Транзиент — значение, сохранённое в базе на время. Вынесем список рекомендуемых товаров из каждого запроса:
// wp-content/plugins/acme-shop/includes/products.php
function acme_featured_ids(): array
{
$ids = get_transient('acme_featured_ids');
if ($ids === false) {
$ids = wc_get_products(['featured' => true, 'limit' => 8, 'return' => 'ids']);
set_transient('acme_featured_ids', $ids, HOUR_IN_SECONDS);
}
return $ids;
}
add_action('woocommerce_update_product', function () {
delete_transient('acme_featured_ids');
});Первый вызов выполняет запрос и сохраняет результат на час, следующие берут готовый массив. Хук woocommerce_update_product сбрасывает сохранённое, когда любой товар изменили, — список не устареет. Если на сервере есть Redis или Memcached с плагином объектного кеша, транзиенты хранятся в памяти.
Системный планировщик
Фоновые задачи WordPress запускаются при посещениях сайта: нет посетителей — нет писем и выгрузок. На рабочем сервере это заменяют системным планировщиком. В wp-config.php добавьте define('DISABLE_WP_CRON', true);, а в планировщик сервера — запуск каждую минуту:
* * * * * cd /var/www/shop && wp cron event run --due-now --quietКоманда выполняет все подошедшие по времени задачи, включая очередь Action Scheduler.
Перед запуском
| Что проверить | Где |
|---|---|
| HTTPS на всём сайте | Адрес сайта в «Настройки → Общие» начинается с https |
| Страницы магазина назначены | «WooCommerce → Настройки → Дополнительно» |
| Тестовый заказ с настоящей оплатой | Проходит оплата и приходит уведомление банка |
| Письма доходят | Отправка через SMTP, письмо не в спаме |
| HPOS включён | «WooCommerce → Настройки → Дополнительно → Функции» |
| Нет устаревших шаблонов | «WooCommerce → Статус», раздел «Шаблоны» |
| Нет упавших задач | «WooCommerce → Статус → Запланированные действия» |
| Отладка выключена | WP_DEBUG равно false в wp-config.php |
| Резервные копии | Настроены по расписанию и проверено восстановление |
Страница «WooCommerce → Статус» собирает большую часть этого списка: версии, настройки, предупреждения красным цветом.
Обновления
WooCommerce обновляется часто. Сначала обновляйте копию магазина на тестовом сервере, проходите путь от каталога до оплаты и только потом — рабочий сайт. После обновления из консоли выполните wp wc update, чтобы обновить таблицы базы.
Частая ошибка
На рабочем сайте включают полный кеш страниц «для скорости» и не проверяют корзину под вторым посетителем. Первый покупатель кладёт товар, страница корзины попадает в кеш, и все остальные видят чужую корзину или пустую вместо своей. После настройки кеша откройте магазин в двух разных браузерах и убедитесь, что корзины независимы.