Как автоматически отменять заказы WooCommerce при проблемах с оплатой

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

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

Чтобы проверить, есть ли такие заказы, выполните следующий SQL-запрос в базе данных WordPress:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-processing', 'wc-on-hold') AND ID NOT IN (
    SELECT order_id FROM wp_woocommerce_order_items
    WHERE order_item_type = 'line_item'
);

Этот запрос покажет заказы в статусах processing и on-hold, у которых нет оплаченных товаров (то есть, вероятно, оплата не прошла).

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

1. Добавление планировщика задач (WP-Cron)

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

add_action('wp', function() {
    if (!wp_next_scheduled('auto_cancel_unpaid_orders_event')) {
        wp_schedule_event(time(), 'hourly', 'auto_cancel_unpaid_orders_event');
    }
});

2. Реализация функции отмены заказов

Создаем функцию, которая будет искать неоплаченные заказы старше 1 часа и менять их статус на cancelled:

add_action('auto_cancel_unpaid_orders_event', function() {
    $args = [
        'limit' => -1,
        'status' => ['wc-on-hold', 'wc-processing'],
        'date_modified' => '<' . (time() - 3600), // заказ старше 1 часа
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $payment_method = $order->get_payment_method();
        $paid = $order->is_paid();

        // Отменяем только если заказ не оплачен
        if (!$paid) {
            $order->update_status('cancelled', 'Автоматическая отмена из-за отсутствия оплаты.');
        }
    }
});

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

  • Создайте тестовый заказ с оплатой, которую не завершаете (например, выберите метод оплаты «наложенный платеж» или отключите оплату в песочнице).
  • Подождите больше часа, затем в админке WooCommerce откройте список заказов и проверьте статус тестового заказа — он должен измениться на Отменён.
  • Можно принудительно запустить крон-событие через WP-CLI для ускорения проверки:
    wp cron event run --due-now

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

  • Событие WP-Cron не срабатывает: Причина — отсутствие реального трафика на сайт или отключенный WP-Cron. Решение — настроить системный cron на сервере для вызова wp-cron.php.
  • Заказы не отменяются, хотя неоплачены: проверьте правильность условий фильтрации в wc_get_orders (например, статус и дата).
  • Отмена заказов происходит слишком рано: измените временной промежуток в условии date_modified на более длительный (например, 2 часа или 24 часа).
  • Отмена затрагивает оплаченные заказы: убедитесь, что проверка оплаты $order->is_paid() корректна, и не стоит ли в WooCommerce сторонних плагинов, влияющих на статус оплаты.

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

  • Добавляйте логирование действий функции отмены для анализа — можно записывать в отдельный файл или использовать стандартный лог WordPress.
  • Ограничьте количество обрабатываемых заказов за одно выполнение, чтобы избежать превышения лимитов памяти и времени исполнения.
  • Для крупных магазинов рекомендуется запускать задачу чаще, но с меньшим объемом обрабатываемых заказов.
  • Проверьте, что функция не конфликтует с плагинами платежных систем, особенно если они используют собственные статусы заказов.

Сравнение способов реализации автоматической отмены заказов

МетодОписаниеПреимуществаНедостатки
Использование WP-Cron с пользовательской функциейРегулярный запуск PHP-скрипта в WordPressГибкость, простой контроль логикиЗависит от трафика, возможна задержка
Плагин автоконтроля заказовГотовые решения с настройкамиУдобство, простота внедренияМожет быть избыточным, нагрузка на сайт
Серверный cron и WP-CLIЗапуск команд из системного планировщикаБыстрота, надежностьТребует доступа к серверу и навыков администрирования
Автоматизация управления заказами в WooCommerce с помощью hooks и фильтров
18.11.2025
Добавление пользовательских статусов заказов в WooCommerce: подробное руководство с примерами кода
03.04.2026
Автоматическое сохранение заказов в WordPress без WooCommerce
31.01.2026
WooCommerce: как использовать кастомные метаданные для поиска и фильтров заказов
22.04.2026
Создание автоматических заказов в WordPress без WooCommerce
19.01.2026