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

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

Если ваш интернет-магазин на WooCommerce накапливает неоплаченные заказы, это может привести к:

  • Загромождению базы данных и снижению производительности;
  • Ошибкам в аналитике и отчетах;
  • Путанице в управлении заказами и складом.

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

Как настроить автоматическое удаление неоплаченных заказов через 24 часа

Шаг 1: Создайте WP-Cron задачу для регулярной проверки заказов

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

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

add_action('wc_delete_unpaid_orders_daily', 'wc_delete_unpaid_orders_older_than_24h');

function wc_delete_unpaid_orders_older_than_24h() {
    $args = array(
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . (time() - DAY_IN_SECONDS),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Удаляем заказ полностью
    }
}

Объяснение кода

  • wp_schedule_event создает ежедневное задание;
  • Хук wc_delete_unpaid_orders_daily вызывает функцию удаления;
  • В функции wc_delete_unpaid_orders_older_than_24h получаем все заказы со статусами pending и on-hold, созданные более 24 часов назад;
  • Удаляем каждый найденный заказ без возможности восстановления (true в wp_delete_post).

Шаг 2: Альтернативный вариант — запуск через WP-CLI

Если ваш хостинг поддерживает WP-CLI, можно создать пользовательскую команду для удаления заказов и запускать её через cron на сервере:

wp eval '
$orders = wc_get_orders(array(
    "status" => array("pending", "on-hold"),
    "date_created" => "<" . (time() - DAY_IN_SECONDS),
    "limit" => -1,
    "return" => "ids"
));
foreach ($orders as $order_id) {
    wp_delete_post($order_id, true);
}
'

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

Чтобы убедиться, что автоматическое удаление работает:

  1. Создайте тестовый заказ со статусом pending и датой создания более 24 часов назад (можно вручную изменить дату в базе для теста).
  2. Запустите WP-Cron вручную через плагин WP Crontrol или дождитесь ежедневного запуска.
  3. Проверьте, что заказ исчез из списка заказов.
  4. Если заказ не удаляется, проверьте журнал ошибок и наличие запущенного cron.

Частые ошибки и их исправления

  • Задача WP-Cron не запускается регулярно: На некоторых хостингах WP-Cron не срабатывает без посещения сайта. Решение — настроить системный cron на сервере для вызова wp-cron.php.
  • Заказы не удаляются, даже если прошли 24 часа: Проверьте, правильно ли настроены аргументы wc_get_orders. В WordPress 5.5+ параметр date_created должен быть объектом DateTime или экземпляром WC_DateTime. В примере выше можно заменить на:
$date = new WC_DateTime();
$date->modify('-24 hours');
$args = array(
    'status' => array('pending', 'on-hold'),
    'date_created' => array('before' => $date->format('Y-m-d H:i:s')),
    'limit' => -1,
    'return' => 'ids',
);
  • Удаление заказов приводит к ошибкам в отчетах: Убедитесь, что в вашем бизнес-процессе можно удалять заказы без потери данных. Если нужны данные, лучше изменить статус на cancelled.

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

  • Резервное копирование: Перед внедрением автоматического удаления настройте регулярные бэкапы, чтобы избежать потери важных данных.
  • Логирование: Добавьте логирование удаленных заказов для аудита, например:
function wc_delete_unpaid_orders_older_than_24h() {
    $args = array(...);
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        error_log("Удаление заказа #" . $order_id . " из-за неоплаты.");
        wp_delete_post($order_id, true);
    }
}
  • Оптимизация запросов: При большом количестве заказов используйте пагинацию ('limit' => 100, с последующим циклом), чтобы не перегружать память.
  • Проверка прав: Убедитесь, что код запускается с достаточными правами (например, при запуске WP-CLI от имени администратора).

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

ВариантПреимуществаНедостатки
WP-Cron с PHP кодомАвтоматизация внутри WordPress, легко настроить, не требует доступа к серверуЗависит от посещаемости сайта, возможны задержки
WP-CLI + системный cronНадежный запуск по расписанию, не зависит от посещения сайта, подходит для больших магазиновТребует доступа к серверу и знаний командной строки
Плагины (например, Clearfy Pro)Готовые решения с удобным интерфейсом, дополнительные функции оптимизацииМожет быть платным, добавляет нагрузку на сайт
WooCommerce: как автоматически удалять неоплаченные заказы через cron и код
26.05.2026
Как создать автоматический импорт CSV в WordPress с поддержкой пользовательских полей
27.03.2026
Как создать собственный shortcode в WordPress с примером кода
05.11.2025
Автоматическое создание отчёта об ошибках в WordPress
12.12.2025
Добавление пользовательских полей в WP REST API для пользователей WordPress
19.03.2026