Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Производительность, кеш и запуск

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

Что нельзя кешировать

Кеш страниц отдаёт сохранённый 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, чтобы обновить таблицы базы.

Частая ошибка

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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.