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

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

Забытые корзины и незавершённые заказы накапливаются в базе WooCommerce, занимая место и замедляя работу сайта. Это особенно критично при большом количестве покупателей и активном магазине. Основная проблема: увеличивается размер базы данных, падает скорость запросов, затрудняется аналитика продаж.

Для диагностики можно использовать плагины типа WP-Optimize, чтобы увидеть рост таблиц wp_woocommerce_sessions и wp_posts с типом 'shop_order' и статусом pending или failed.

Как определить забытые корзины и заказы

В WooCommerce корзина хранится в сессии пользователя, а незавершённые заказы имеют статус pending, failed или on-hold. Обычно забытыми считаются заказы без оплаты, созданные более 24 часов назад.

Проверяем забытые корзины через таблицу сессий

Таблица wp_woocommerce_sessions хранит сериализованные данные корзины. Чтобы проверить, сколько записей старше 24 часов:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY));

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

Удаление старых сессий корзины вручную через WP-CLI

Для быстрого удаления старых сессий можно использовать WP-CLI:

wp db query "DELETE FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY));"

Но это разовое решение, лучше автоматизировать процесс.

Автоматизация удаления сессий через WP-Cron

Добавим в functions.php темы код, который раз в сутки удаляет старые записи.

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

if ( ! wp_next_scheduled( 'wc_daily_delete_old_sessions' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_daily_delete_old_sessions' );
}
add_action( 'wc_daily_delete_old_sessions', 'wc_delete_old_sessions' );

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

Забытые заказы — это записи типа shop_order со статусами pending, failed или on-hold, созданные более определённого времени назад (обычно 24−48 часов).

Код для удаления забытых заказов через WP-Cron

function wc_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-on-hold'),
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => '2 days ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

if ( ! wp_next_scheduled( 'wc_daily_delete_old_unpaid_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_daily_delete_old_unpaid_orders' );
}
add_action( 'wc_daily_delete_old_unpaid_orders', 'wc_delete_old_unpaid_orders' );

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

  • Через phpMyAdmin или WP-CLI проверить, что в wp_woocommerce_sessions и заказах нет записей старше установленного срока.
  • В админке WooCommerce убедиться, что старые заказы со статусами pending и failed исчезают автоматически после 2 дней.
  • Отслеживать логи сервера и WooCommerce на предмет ошибок при удалении.

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

  • Удаление не происходит — убедитесь, что WP-Cron работает (например, активирован ли системный cron на сервере или wp-cron.php вызывается регулярно). Для проверки можно использовать плагин WP Crontrol.
  • Удаляются нужные заказы — проверьте корректность статусов и интервала времени в коде, чтобы не удалить оплаченные или актуальные заказы.
  • Ошибка доступа к базе данных — проверьте права пользователя базы данных и правильность префиксов таблиц в запросах.
  • Большая нагрузка при выполнении — если заказов много, разбейте удаление на части с помощью пагинации и wp_schedule_single_event для распределения нагрузки.

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

  • Всегда делайте резервные копии базы данных перед включением автоматического удаления.
  • Используйте транзакции и проверяйте результаты запросов при работе с базой напрямую.
  • Для крупных магазинов с большим количеством заказов и сессий лучше реализовать пакетное удаление с лимитами по количеству записей за один запуск.
  • Для ускорения работы сессий рассмотрите настройку Redis или Memcached в WooCommerce.

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

МетодПреимуществаНедостаткиКомпромисс
WP-CLIБыстрое однократное удаление, контроль с командной строкиНе автоматизировано, требует доступа к серверуИспользовать для ручной очистки перед автоматизацией
WP-Cron с функциями удаленияАвтоматизация, не требует вмешательстваЗависит от работоспособности WP-Cron, нагрузка на сайтНастроить системный cron для вызова wp-cron.php
Плагины очисткиУдобство, дополнительные настройкиМогут добавить нагрузку, не всегда подходят под задачиИспользовать совместно с кастомным кодом для тонкой настройки
Как избежать конфликтов между похожими плагинами в WordPress
03.02.2026
Как добавить автоматическое удаление старых записей через WP-Cron в WordPress
31.01.2026
Как удалить неиспользуемые шорткоды в WordPress
18.01.2026
Как использовать REST API WooCommerce для автоматизации обработки заказов
25.04.2026
Как сделать автоматический откат обновлений WordPress при ошибках
12.01.2026