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

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

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

Если заказы долгое время не оплачиваются, их следует автоматически отменять и удалять, чтобы поддерживать порядок и оптимизировать работу магазина. Часто владельцы магазинов сталкиваются с ручным управлением такими заказами, что неэффективно.

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

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

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

function wc_cancel_unpaid_orders() {
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'on-hold'),
        'date_modified' => '',
    );

    $orders = wc_get_orders($args);
    $now = time();
    $cancel_after = 24 * 60 * 60; // 24 часа

    foreach ($orders as $order) {
        $order_time = strtotime($order->get_date_created());
        if (($now - $order_time) > $cancel_after) {
            $order->update_status('cancelled', 'Автоматическая отмена неоплаченного заказа через 24 часа.');
        }
    }
}

2. Добавляем WP-Cron задачу для регулярного запуска

В том же файле добавьте регистрацию крон-задачи и ее запуск:

if (!wp_next_scheduled('wc_cancel_unpaid_orders_cron')) {
    wp_schedule_event(time(), 'hourly', 'wc_cancel_unpaid_orders_cron');
}

add_action('wc_cancel_unpaid_orders_cron', 'wc_cancel_unpaid_orders');

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

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

function wc_delete_old_cancelled_orders() {
    $args = array(
        'limit' => -1,
        'status' => 'cancelled',
        'date_modified' => '',
    );

    $orders = wc_get_orders($args);
    $now = time();
    $delete_after = 7 * 24 * 60 * 60; // 7 дней

    foreach ($orders as $order) {
        $modified_time = strtotime($order->get_date_modified());
        if (($now - $modified_time) > $delete_after) {
            wp_delete_post($order->get_id(), true);
        }
    }
}

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

add_action('wc_delete_old_cancelled_orders_cron', 'wc_delete_old_cancelled_orders');

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

  • В панели администратора WooCommerce проверьте заказы в статусах pending и on-hold. Заказы старше 24 часов должны автоматически получить статус cancelled.
  • Отмененные заказы, которым больше 7 дней, должны быть удалены из базы.
  • Для быстрой проверки запустите крон вручную, вызвав действие через WP-CLI: wp cron event run wc_cancel_unpaid_orders_cron и wp cron event run wc_delete_old_cancelled_orders_cron.
  • В логах WooCommerce и файла debug.log (при включенном WP_DEBUG) должны отсутствовать ошибки.

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

  • Крон-задачи не запускаются: проверьте, что на хостинге включен WP-Cron, или настройте системный cron для вызова wp-cron.php.
  • Заказы не меняют статус: убедитесь, что функции вызываются и что статусы заказов соответствуют указанным в фильтрах (pending, on-hold).
  • Удаление заказов не происходит: проверьте права пользователя БД и разрешения WordPress на удаление постов; также убедитесь, что статус заказа действительно cancelled.
  • Проблемы с датами: функции get_date_created() и get_date_modified() возвращают объекты WC_DateTime, поэтому лучше использовать метод getTimestamp() для точных вычислений времени.

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

  • Для предотвращения лишней нагрузки делайте запуск отмены заказов не чаще одного раза в час, а удаления — один раз в день.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать эти функции вручную через AJAX или в админке.
  • Для магазинов с большим количеством заказов используйте пагинацию в запросах wc_get_orders (параметры 'limit' и 'paged'), чтобы избежать превышения лимита памяти.
  • Логируйте действия отмены и удаления для аудита, например через error_log или специализированные плагины логирования.

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

МетодПлюсыМинусыПрименимость
Ручная отмена заказовКонтроль над каждым заказомВремязатратно, ошибки человекаМаленькие магазины
Плагины для автоматизации (например, WooCommerce Order Status Manager)Готовые настройки, удобствоЗависимость от стороннего кода, нагрузкаСредние и крупные магазины
Кастомный код с WP-Cron (предложенный способ)Гибкость, контроль, отсутствие лишних плагиновТребует навыков разработки, настройка cronМагазины с разработчиками
Как настроить автоматическое удаление неактивных пользователей WordPress
04.02.2026
Автоматическое удаление неактивных пользователей WordPress
25.01.2026
Как автоматически удалять неактивные комментарии в WordPress
10.03.2026
WooCommerce: как автоматически обновлять статус заказа при возврате платежа
30.05.2026
Автоматическое удаление записей по возрасту в WordPress
01.03.2026