Как использовать WP-Cron для автоматического удаления старого кеша в WooCommerce

Диагностика проблемы с кешем в WooCommerce

WooCommerce и связанная с ним инфраструктура (плагины кеширования, CDN, transient API) могут создавать накопление старых кешированных данных, которые не удаляются автоматически. Это приводит к замедлению работы сайта, неправильному отображению товаров и заказов, а также ошибкам в админке.

Чтобы понять, страдает ли ваш сайт от этой проблемы, обратите внимание на следующие признаки:

  • Замедленная работа страниц товаров и корзины после обновления ассортимента.
  • Некорректное отображение актуальных цен или статусов заказов.
  • Рост размера таблиц базы данных, особенно wp_options и wp_postmeta, из-за накопления transient-данных.

Для первичной диагностики можно выполнить SQL-запрос для подсчёта количества активных transient:

SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%' OR option_name LIKE '_site_transient_%';

Если число слишком велико (сотни и тысячи), это повод настроить автоматическое удаление устаревших кешированных данных.

Пошаговое решение: настройка WP-Cron для очистки кеша

1. Создаём функцию для удаления устаревших transient

В файле functions.php вашей дочерней темы или в кастомном плагине добавьте следующий код:

function wppuzzle_clear_expired_transients() {
    global $wpdb;
    $time = time();
    // Удаляем истекшие transient
    $wpdb->query(
        "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < {$time}"
    );
    $wpdb->query(
        "DELETE o FROM {$wpdb->options} o LEFT JOIN {$wpdb->options} t ON o.option_name = REPLACE(t.option_name, '_timeout', '') WHERE t.option_name LIKE '_transient_timeout_%' AND t.option_value < {$time}"
    );
}

2. Регистрируем событие WP-Cron

Добавьте хук для запуска этой функции, например, раз в 6 часов:

if (! wp_next_scheduled('wppuzzle_expired_transients_cleanup')) {
    wp_schedule_event(time(), 'six_hours', 'wppuzzle_expired_transients_cleanup');
}

add_action('wppuzzle_expired_transients_cleanup', 'wppuzzle_clear_expired_transients');

// Добавляем интервал 6 часов
add_filter('cron_schedules', function($schedules) {
    $schedules['six_hours'] = [
        'interval' => 21600, // 6 часов в секундах
        'display' => __('Каждые 6 часов')
    ];
    return $schedules;
});

3. Очистка кеша WooCommerce и плагинов кеширования

Если у вас есть плагины кеширования (например, WP Rocket, W3 Total Cache), добавьте вызов их функций очистки кеша в эту же функцию:

function wppuzzle_clear_expired_transients() {
    global $wpdb;
    $time = time();

    $wpdb->query(
        "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < {$time}"
    );
    $wpdb->query(
        "DELETE o FROM {$wpdb->options} o LEFT JOIN {$wpdb->options} t ON o.option_name = REPLACE(t.option_name, '_timeout', '') WHERE t.option_name LIKE '_transient_timeout_%' AND t.option_value < {$time}"
    );

    // Очистка кеша WooCommerce
    if (function_exists('wc_delete_product_transients')) {
        wc_delete_product_transients();
    }

    // Пример для WP Rocket
    if (function_exists('rocket_clean_domain_cache')) {
        rocket_clean_domain_cache();
    }
}

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

Чтобы убедиться, что задача выполняется, сделайте следующее:

  • Выполните вручную вашу функцию, вызвав wppuzzle_clear_expired_transients() из консоли WP-CLI (wp eval 'wppuzzle_clear_expired_transients();') или временно добавив вызов в functions.php.
  • Проверьте количество transient в базе данных до и после выполнения с помощью SQL-запроса из раздела диагностики.
  • Проверьте логи WP-Cron (например, с помощью плагина WP Crontrol), что событие wppuzzle_expired_transients_cleanup успешно планируется и выполняется.
  • Проверьте скорость загрузки страниц товаров и обновление данных в WooCommerce.

Частые ошибки и как их исправить

  • Отсутствие WP-Cron из-за низкой активности сайта. На слабых или мало посещаемых сайтах WP-Cron может не запускаться. Решение — настроить системный cron на сервере, чтобы вызывать wp cron event run --due-now каждые 5-10 минут.
  • Функция очистки transient удаляет не все устаревшие записи. Проверьте права доступа к базе и корректность SQL-запросов, особенно если префикс таблиц нестандартный.
  • Конфликты с плагинами кеширования. Некоторые плагины кеширования имеют собственные механизмы очистки. В этом случае их очистку нужно вызывать явно, как показано в примере кода.
  • Запуск WP-Cron слишком часто или слишком редко. Настройте интервал согласно нагрузке сайта — 6 часов обычно оптимально для большинства WooCommerce проектов.

Практические советы по безопасности и производительности

  • Для больших магазинов с сотнями тысяч transient рекомендуется использовать системный cron, а не WP-Cron, чтобы избежать таймаутов.
  • Избегайте прямого удаления transient вне специальных функций — используйте API delete_transient и set_transient для корректного управления кешем.
  • Регулярно мониторьте размер таблицы wp_options — большое количество transient влияет на производительность запросов.
  • Для критичных операций используйте собственные таблицы для кеша вместо transient, если нагрузка слишком высокая.

Сравнение способов очистки кеша WooCommerce и transient

СпособПлюсыМинусыКогда использовать
WP-Cron с кастомной функциейГибкость, автоматизация, контроль интервалаЗависимость от посещаемости сайта, возможные таймаутыСредние и малые сайты без системного доступа
Системный cron с wp-cliНадежность, независимость от трафика, высокая производительностьТребуется доступ к серверу, настройка сложнееКрупные магазины, сайты с высокой нагрузкой
Ручная очистка через админку плагинов кешированияПросто, не требует кодаРучной процесс, забывчивостьМалые сайты без навыков разработки
Оптимизация AJAX-запросов в WordPress: практические советы и примеры кода
13.11.2025
Как удалить старые изображения из WordPress: эффективные методы
22.02.2026
Как использовать WooCommerce хуки для изменения страниц товара
30.04.2026
Как изменить URL авторского блока WordPress без плагинов
26.03.2026
Как отключить автопроигрывание видео в WordPress
01.02.2026