WooCommerce: автоматическое удаление нерабочих корзин по срокам через код

Что такое нерабочие корзины в WooCommerce и зачем их удалять

В WooCommerce нерабочие (заброшенные) корзины — это сессии с добавленными товарами, но без оформления заказа. Они занимают место в базе данных, замедляют работу сайта и могут влиять на аналитику. Автоматическое удаление таких корзин по срокам помогает поддерживать базу в чистоте и ускорять обработку запросов.

Диагностика проблемы с нерабочими корзинами

Чтобы проверить, есть ли накопленные нерабочие корзины, смотрим таблицу wp_woocommerce_sessions (префикс может отличаться). В ней хранятся данные сессий пользователей, включая корзины. Часто записи сессий, не сопровождаемые заказами, остаются в базе долгое время.

Для диагностики выполните SQL-запрос (через phpMyAdmin или WP CLI):

SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry DESC LIMIT 10;

Обратите внимание на session_expiry — это UNIX-метка времени, после которой сессия считается устаревшей.

Пошаговое решение: автоматическое удаление сессий с истекшим сроком

WooCommerce не удаляет устаревшие сессии автоматически. Для решения задачи добавим пользовательский код, который будет запускаться через cron и удалять такие записи из таблицы.

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

function wc_delete_expired_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $current_time = time();
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $table WHERE session_expiry < %d",
            $current_time
        )
    );
    return $deleted;
}

2. Регистрируем событие WP-Cron для ежечасного запуска

function wc_schedule_session_cleanup() {
    if ( ! wp_next_scheduled( 'wc_cleanup_expired_sessions_hook' ) ) {
        wp_schedule_event( time(), 'hourly', 'wc_cleanup_expired_sessions_hook' );
    }
}
add_action( 'wp', 'wc_schedule_session_cleanup' );

add_action( 'wc_cleanup_expired_sessions_hook', 'wc_delete_expired_sessions' );

3. Опционально: логируем удаление для отладки

function wc_delete_expired_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $current_time = time();
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $table WHERE session_expiry < %d",
            $current_time
        )
    );
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log("WooCommerce: deleted $deleted expired sessions");
    }
    return $deleted;
}

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

  • Подключитесь к базе данных и выполните тот же SQL-запрос из блока диагностики. Количество записей с устаревшим session_expiry должно уменьшиться после запуска cron.
  • Для ручного теста вызовите функцию через wp-cli: wp eval 'echo wc_delete_expired_sessions();' — должен вернуть число удаленных записей.
  • Проверьте логи ошибок PHP (если включено логирование) на сообщения об удалении сессий.

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

  • Крон-событие не запускается: Убедитесь, что на сайте есть трафик (WP-Cron запускается при посещениях). Для теста используйте реальные системные cron или WP-CLI.
  • Неверный префикс таблиц: Префикс может отличаться от wp_. Используйте $wpdb->prefix для получения правильного префикса.
  • Удаление не работает: Проверьте права пользователя базы данных на DELETE-запросы.
  • Код добавлен в неподходящее место: Поместите код в файл functions.php дочерней темы или в собственный плагин, а не в ядро WooCommerce.

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

  • Не выполняйте чистку слишком часто — достаточно запуска раз в час или раз в сутки, чтобы не нагружать базу.
  • Следите за размером таблицы wp_woocommerce_sessions, при большом объеме рассмотрите оптимизацию базы или использование внешних кэшей.
  • Для сайтов с большим трафиком можно использовать системный cron вместо WP-Cron, чтобы гарантировать регулярность запуска.
  • Перед внесением изменений сделайте резервную копию базы данных.

Сравнение вариантов автоматического удаления сессий

МетодПреимуществаНедостаткиПример
WP-Cron с пользовательским кодомЛегко реализовать, не требует внешних настроекЗависит от посещаемости сайта, возможны задержкиКод из статьи
Системный cron + WP-CLIГарантированное выполнение по расписаниюТребует доступа к серверу и настройки cron0 * * * * wp eval 'wc_delete_expired_sessions();'
Плагины очистки сессийГотовое решение с настройкамиДополнительный плагин, может быть избыточнымПример: WP Rocket (частично)
Как оптимизировать работу AI-плагинов в WordPress
21.02.2026
Как создать автоматический генератор описаний для товаров WordPress с помощью AI
28.01.2026
Как автоматизировать обновление контекста в Gutenberg с помощью AI
07.03.2026
WooCommerce: как использовать хуки для добавления пользовательных функций
22.04.2026
WooCommerce: автоматическое создание атрибутов и вариаций к товарам через код
02.05.2026