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

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

Многие владельцы WooCommerce сталкиваются с проблемой переполнения базы данных старыми заказами и заброшенными корзинами. Это замедляет работу сайта и усложняет администрирование. По умолчанию WooCommerce не удаляет автоматически заброшенные корзины, а заказы остаются в базе бессрочно, что влияет на размер таблиц wp_woocommerce_sessions и wp_posts (заказы хранятся как записи с типом shop_order).

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

Как очистить корзину WooCommerce программно

Корзина в WooCommerce хранится в сессиях пользователей. Чтобы очистить корзину для конкретного пользователя или всех сессий, нужен код, который удалит записи из таблицы wp_woocommerce_sessions или сбросит корзину в текущей сессии.

Очистка корзины для текущего пользователя

function wc_clear_current_cart() {
    if ( WC()->cart ) {
        WC()->cart->empty_cart();
    }
}
add_action('init', 'wc_clear_current_cart');

Этот код очищает корзину текущего пользователя при вызове. Для массовой очистки нужно работать с сессиями в БД.

Удаление всех заброшенных корзин из базы

Корзины хранятся в wp_woocommerce_sessions с ключами сессий. Можно удалить записи старше определенного времени, например 7 дней:

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

add_action('wp_loaded', 'wc_delete_old_sessions');

Этот код удалит все сессии, срок действия которых истек, тем самым очистив заброшенные корзины.

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

По умолчанию WooCommerce хранит все заказы, что со временем приводит к разрастанию БД. Чтобы удалять заказы старше X дней, используйте WP-CLI или пишите функцию для удаления через cron.

Пример функции для удаления заказов старше 180 дней

function wc_delete_old_orders() {
    $days = 180;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-completed', 'wc-cancelled', 'wc-failed'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];

    $old_orders = get_posts($args);

    if ($old_orders) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true - без перемещения в корзину
        }
    }
}

// Добавляем в WP-Cron для еженедельного удаления
if (!wp_next_scheduled('wc_delete_old_orders_event')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_event');
}
add_action('wc_delete_old_orders_event', 'wc_delete_old_orders');

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

  • Для очистки корзины: откройте сайт в режиме инкогнито, положите товар в корзину, затем вызовите функцию очистки и обновите страницу — корзина должна быть пустой.
  • Для удаления старых сессий: проверьте таблицу wp_woocommerce_sessions в базе данных — записи со старыми session_expiry должны исчезнуть.
  • Для удаления заказов: убедитесь, что заказы старше 180 дней отсутствуют в разделе WooCommerce -> Заказы.

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

  • Ошибка: Функция очистки корзины не срабатывает для текущего пользователя.
    Причина: Код вызывается до инициализации WC()->cart.
    Решение: Поместите вызов в хук wp_loaded или позже.
  • Ошибка: WP-Cron не срабатывает.
    Причина: Отсутствие посещений сайта или отключенный WP-Cron.
    Решение: Используйте системный cron или запускайте WP-Cron вручную wp cron event run --due-now.
  • Ошибка: Не удаляются заказы с определённым статусом.
    Причина: Статус заказа не входит в список в запросе.
    Решение: Добавьте нужные статусы в массив post_status.

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

  • Удаляйте заказы только после резервного копирования, чтобы не потерять важные данные.
  • Проводите удаление старых заказов в WP-Cron, чтобы не перегружать сервер.
  • Для больших магазинов используйте запросы с пагинацией, чтобы не превышать лимит памяти.
  • Для очистки сессий можно использовать готовые плагины кеширования с поддержкой WooCommerce, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpcoder.ru&medium=article&campaign=woocommerce-ochistka-korziny-i-avtomaticheskoe-udaleniye-starogo-zakaza) — они облегчают управление кешем и сессиями.

Чек-лист по очистке корзин и заказов в WooCommerce

  1. Проверьте количество записей в таблице wp_woocommerce_sessions.
  2. Добавьте код очистки сессий и протестируйте на тестовом сайте.
  3. Настройте функцию удаления старых заказов с нужным периодом хранения.
  4. Запланируйте WP-Cron для регулярного запуска очистки.
  5. Проверьте журнал ошибок и логи сервера на наличие проблем.
  6. Обязательно создайте резервные копии перед массовыми удалениями.
Автоматическое удаление отменённых заказов в WooCommerce по сроку хранения
27.05.2026
Автоматический импорт данных из Excel в WordPress: практическое руководство
25.03.2026
Автоматический импорт товаров из CSV в WooCommerce: пошаговое руководство
31.03.2026
Как использовать настройки пересылки электронной почты в WordPress
13.01.2026
Автоматизация создания и удаления пользовательских метаполей в WordPress
10.04.2026