Автоматическое удаление старых корзин в WooCommerce

Диагностика проблемы: зачем удалять старые корзины в WooCommerce

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

Если вы заметили, что таблица wp_posts содержит много заказов со статусом, которые не переходят в следующий этап, или база весит слишком много, пора настроить автоматическое удаление старых корзин.

Как определить, что корзины накапливаются

  • Запрос в базе по статусам заказов:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');
  • Если количество заказов с этими статусами растет, а время их создания превышает 7 дней — корзины не очищаются.
  • Проверить настройки плагинов кеша и сессий, которые могут хранить корзины в базе.

Пошаговое решение: как автоматически удалять старые корзины

1. Создаем функцию очистки старых заказов с определенным статусом

function wpt_delete_old_cart_orders() {
    global $wpdb;

    $days = 7; // Время хранения корзины в днях
    $statuses = ['wc-pending', 'wc-failed']; // Статусы заказов-корзин

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов старше даты
    $old_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN (%s, %s) AND post_date < %s",
        $statuses[0], $statuses[1], $date_threshold
    ));

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // Принудительное удаление
        }
    }
}

2. Добавляем крон-задачу для регулярного запуска

Чтобы функция выполнялась автоматически, регистрируем событие WP-Cron:

if (!wp_next_scheduled('wpt_daily_cart_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpt_daily_cart_cleanup');
}
add_action('wpt_daily_cart_cleanup', 'wpt_delete_old_cart_orders');

3. Очистка при деактивации плагина или темы

function wpt_deactivate_cleanup() {
    wp_clear_scheduled_hook('wpt_daily_cart_cleanup');
}
register_deactivation_hook(__FILE__, 'wpt_deactivate_cleanup');

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

  • Запустите функцию вручную, вызвав wpt_delete_old_cart_orders(); через консоль WP CLI или временно в functions.php.
  • Запросите количество заказов с нужными статусами до и после выполнения:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

После запуска количество должно уменьшиться, если были старые корзины.

Через сутки проверьте, сработал ли WP-Cron – можно использовать плагин WP Crontrol или проверить логи сервера.

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

  • Неправильные статусы заказов. WooCommerce может использовать кастомные статусы или сторонние плагины меняют логику. Проверьте, какие статусы соответствуют "корзине".
  • WP-Cron не запускается. При низкой посещаемости сайта WP-Cron может не срабатывать. Рекомендуется настроить системный cron или проверить вызовы через wp_cron().
  • Удаление заказов приводит к ошибкам в отчетах. Если вы используете расширенную аналитику, подумайте об архивировании данных перед удалением.
  • Удаление заказов не работает. Проверьте права пользователя и доступ к базе данных, также убедитесь, что функция вызывается.

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

  • Удаляйте только заказы с явно определёнными статусами и старше 7 дней — чтобы не потерять актуальные данные.
  • Используйте wp_delete_post с параметром true для полного удаления, включая метаданные.
  • Для крупных магазинов запускайте функцию в off-peak время или разбивайте удаление на части, чтобы не перегружать БД.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wptemplates.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-starogo-korziny) для оптимизации базы и удаления временных данных.

Сравнение способов удаления старых корзин

МетодПлюсыМинусыКомпромисс
WP-Cron с кастомной функцией Гибкость, полное удаление Зависит от посещаемости сайта Настроить системный cron для запуска WP-Cron
Плагины очистки базы Простота установки, UI для управления Могут удалять лишние данные, не всегда точны Использовать проверенные плагины с резервным копированием
Ручное удаление SQL-запросами Быстро и без нагрузки на WP Риск ошибок, потеря данных без восстановления Выполнять только опытным администраторам с бэкапом
Автоматическое удаление старых корзин в WooCommerce
03.07.2026
WooCommerce: как убрать ограничение на количество товаров в корзине
17.04.2026
WooCommerce: как отключить автоматический пересчет стоимости товаров в корзине
30.06.2026
Как создать динамический виджет в WordPress с использованием PHP и хуков
18.11.2025
Как создать адаптивные шаблоны WordPress с использованием атрибута srcset
30.03.2026