Как удалить зависшие корзины в WooCommerce без плагинов

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

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

WooCommerce по умолчанию не удаляет автоматически такие заказы, поэтому их ручное или автоматическое удаление — важная задача для администраторов магазинов.

Диагностика наличия зависших корзин

Для начала нужно определить, сколько таких заказов накопилось и когда они были созданы.

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' ORDER BY post_date DESC LIMIT 10;

В этом запросе wc-pending — статус незавершённого заказа (корзины). Ваша база может содержать и другие статусы, например, wc-failed или wc-cancelled, которые тоже стоит учитывать при очистке в зависимости от бизнес-логики.

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

Реализуем функцию, которая удалит все заказы со статусом wc-pending, созданные более 24 часов назад. Можно добавить этот код в functions.php вашей темы или в отдельный плагин.

function delete_stale_woocommerce_carts() {
    global $wpdb;
    $threshold = date('Y-m-d H:i:s', strtotime('-24 hours'));

    $orders = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
        'shop_order', 'wc-pending', $threshold
    ) );

    if ( empty($orders) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true - удаляет без возможности восстановления
    }
}

// Запускаем очистку по крону, например, ежедневно
add_action( 'woocommerce_cleanup_stale_carts', 'delete_stale_woocommerce_carts' );

if ( ! wp_next_scheduled( 'woocommerce_cleanup_stale_carts' ) ) {
    wp_schedule_event( time(), 'daily', 'woocommerce_cleanup_stale_carts' );
}

Объяснение:

  • Через SQL выбираются все заказы со статусом wc-pending, старше 24 часов.
  • Удаляем их навсегда с помощью wp_delete_post($order_id, true).
  • Добавляем cron-задачу, которая будет запускать функцию ежедневно.

Альтернативный способ: удаление через WP-CLI

Если у вас есть доступ к командной строке, можно быстро удалить старые заказы так:

wp post delete $(wp post list --post_type=shop_order --post_status=wc-pending --field=ID --date_query_column=post_date --before='24 hours ago') --force

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

Чтобы убедиться, что очистка работает, выполните следующие шаги:

  1. Запустите функцию вручную, добавив вызов delete_stale_woocommerce_carts(); в шаблон или через консоль WP-CLI.
  2. Проверьте количество заказов в статусе wc-pending до и после очистки SQL-запросом из раздела диагностики.
  3. Убедитесь, что заказы старше 24 часов удалены.
  4. Проверьте логи ошибок, чтобы убедиться в отсутствии сбоев.

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

  • Удаление не тех заказов: Проверьте, что статус заказа точно wc-pending. Если в вашем магазине используются другие статусы для корзин, добавьте их в условие.
  • Крон не запускается: Убедитесь, что WP-Cron активен и посетители заходят на сайт. Для надежности можно настроить системный cron на вызов wp-cron.php.
  • Потеря нужных заказов: Не запускайте удаление без резервной копии базы данных. Лучше сначала тестировать на копии.
  • Нагрузка на сервер: При большом числе заказов разбивайте удаление на части или используйте WP-CLI.

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

  • Перед удалением сделайте полную резервную копию базы данных.
  • Используйте wp_schedule_event для регулярной очистки, чтобы не нагружать сайт вручную.
  • Ограничьте выборку заказов по дате, чтобы не удалять актуальные корзины.
  • Используйте транзакции или проверяйте целостность данных, если удаляете связанные записи (например, мета-данные заказов).
  • Для крупного магазина рассмотрите возможность реализации асинхронной очистки с помощью очередей.

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

МетодПлюсыМинусы
Код в functions.php с WP-CronАвтоматизация, гибкость настройки, можно адаптировать под бизнес-логикуНужно контролировать cron, возможна нагрузка при большом числе заказов
WP-CLIМгновенное выполнение, минимальная нагрузка, подходит для администраторов с доступом к серверуТребует командной строки, не автоматизировано без написания скриптов
ПлагиныУдобство, готовые решения, GUIДополнительная нагрузка, риск конфликтов, не всегда гибко
Как избежать конфликтов между плагинами в WordPress: практические советы и примеры
22.01.2026
WooCommerce: как собрать и очистить базу данных от зависших вариантов и вариантов с нулевым запасом
04.06.2026
Как избежать проблем с кроссдоменной авторизацией в WordPress
14.03.2026
Как правильно удалить или заблокировать роботов в robots.txt для WordPress
04.03.2026
WooCommerce: как устранить ошибку «Невозможно создать заказ» при оформлении
26.05.2026