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

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

Неоплаченные заказы в WooCommerce со временем накапливаются, что ведет к загромождению базы данных, замедлению админки и искажающему учету продаж. Особенно актуальна проблема для магазинов с большим трафиком и множеством попыток оплаты, которые так и не были завершены.

Чтобы убедиться в наличии такой проблемы, проверьте в админке WooCommerce раздел Заказы, отфильтровав по статусу on-hold или pending. Если вы видите сотни или тысячи заказов с этими статусами, пора автоматизировать их удаление.

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

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в собственный плагин:

function wpsource_delete_unpaid_orders() {
    $days = 7; // Удалять заказы старше 7 дней
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
    );

    $args = array(
        'status' => array('pending', 'on-hold'),
        'date_query' => array($date_query),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

2. Подключаем функцию к регулярному событию WP-Cron

Добавьте код для запуска функции раз в сутки:

function wpsource_schedule_delete_unpaid_orders() {
    if (!wp_next_scheduled('wpsource_daily_delete_unpaid_orders')) {
        wp_schedule_event(time(), 'daily', 'wpsource_daily_delete_unpaid_orders');
    }
}
add_action('wp', 'wpsource_schedule_delete_unpaid_orders');

add_action('wpsource_daily_delete_unpaid_orders', 'wpsource_delete_unpaid_orders');

3. Очистка при деактивации

Чтобы не оставлять запланированные задания после удаления кода, добавьте деактивационный хук:

function wpsource_clear_scheduled_delete() {
    $timestamp = wp_next_scheduled('wpsource_daily_delete_unpaid_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpsource_daily_delete_unpaid_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpsource_clear_scheduled_delete');

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

  • Создайте тестовый заказ со статусом pending и выставьте дату на более чем 7 дней назад (например, через phpMyAdmin или плагин для редактирования даты).
  • Запустите вручную функцию wpsource_delete_unpaid_orders() через WP-CLI или временно вызовите её в коде.
  • Проверьте, что заказ удалился из списка в админке.
  • Дождитесь автоматического запуска WP-Cron и убедитесь, что старые неоплаченные заказы удаляются регулярно.

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

  • WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron зависит от посещений сайта. Проверьте логи и настройте системный cron для вызова wp-cron.php каждые 15 минут.
  • Заказы не удаляются: убедитесь, что статусы указываются корректно и что вы используете WooCommerce 3.0+ (функция wc_get_orders с параметром status).
  • Удаление заказов с ошибками: проверьте права пользователя и работы wp_delete_post. Включите WP_DEBUG для отлова ошибок.

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

  • Настройте интервал удаления с учётом нагрузки сайта — не чаще одного раза в сутки.
  • Перед удалением заказов можно сделать резервное копирование базы данных, особенно на живом магазине.
  • Если у вас большой магазин, ограничьте количество удаляемых заказов за один запуск (например, limit в wc_get_orders), чтобы избежать таймаутов.
  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы не оставлять мусор в базе.

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

ВариантПлюсыМинусы
Плагин (например, WooCommerce Cancel Abandoned Order)Готовое решение, настройки через интерфейсДополнительная нагрузка, возможные конфликты, зависит от обновлений
Самописный код с WP-Cron (описан выше)Легковесно, гибко, не требует сторонних плагиновТребует базовых знаний PHP и WordPress, нужно тестировать
Ручное удаление через админкуПростота, подходит для малых магазиновЗатратно по времени, риск пропуска заказов
Как удалить автоматические дубли страниц в WordPress
30.03.2026
Как отключить отображение наличия для определённых товаров в WooCommerce
12.08.2026
Как запретить индексацию отдельных страниц в WordPress без плагинов
20.08.2026
Как запустить WordPress в контейнере Docker с настройкой Nginx
08.04.2026
WooCommerce: как изменить атрибуты товара после оформления заказа
05.06.2026