Как использовать 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Надежность, независимость от трафика, высокая производительностьТребуется доступ к серверу, настройка сложнееКрупные магазины, сайты с высокой нагрузкой
Ручная очистка через админку плагинов кешированияПросто, не требует кодаРучной процесс, забывчивостьМалые сайты без навыков разработки
Использование WooCommerce хуков для добавления пользовательских функций на страницах товара
29.05.2026
Как удалить битые ссылки в WordPress: практическое руководство
07.05.2026
Как создать автоматический импорт продукции из CSV в WordPress
02.04.2026
Как создать и обновлять кастомные таблицы в WordPress с помощью wpdb
26.02.2026
Решение проблем с созданием и отображением вариативных товаров в WooCommerce
16.06.2026