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

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

В интернет-магазинах на WooCommerce часто возникает ситуация, когда пользователи оформляют заказы, но не завершают оплату. Это приводит к накоплению большого количества неоплаченных заказов, которые могут мешать аналитике и управлению складом. Ручная очистка таких заказов — затратный процесс, особенно при большом объеме.

Стандартного инструмента для автоматического отключения или отмены неоплаченных заказов в WooCommerce нет. Встроенный механизм хранения статусов не предусматривает автоматического перехода статуса через определенный промежуток времени. Поэтому требуется кастомное решение.

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

Пошаговое решение задачи

Основная идея — использовать WP-Cron для периодической проверки заказов со статусом pending или on-hold и автоматически менять их статус на cancelled или failed после истечения заданного времени ожидания оплаты.

Пошагово:

  1. Добавляем крон-задачу для регулярного запуска проверки заказов.
  2. В функции обработки крон-задачи получаем все неоплаченные заказы старше заданного времени.
  3. Меняем статус таких заказов на cancelled.
  4. Логируем действие для последующего аудита.

Пример кода для functions.php или кастомного плагина

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

add_action('auto_cancel_unpaid_orders', 'auto_cancel_unpaid_orders_callback');

function auto_cancel_unpaid_orders_callback() {
    $hours_to_expire = 24; // Время ожидания оплаты в часах
    $cutoff = strtotime('-' . $hours_to_expire . ' hours');

    $args = array(
        'limit' => -1,
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . date('Y-m-d H:i:s', $cutoff),
        'return' => 'ids'
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->update_status('cancelled', 'Автоматическое отключение неоплаченного заказа после ' . $hours_to_expire . ' часов');
            error_log('Заказ #' . $order_id . ' автоматически отменен как неоплаченный.');
        }
    }
}

Проверка работы автоматического отключения заказов

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

  • Создайте заказ в статусе pending или on-hold.
  • Установите время ожидания в тестовом коде, например, $hours_to_expire = 0;, чтобы сработало сразу.
  • Запустите WP-Cron вручную с помощью плагина WP Crontrol или подождите автоматического запуска.
  • Проверьте, что статус заказа изменился на cancelled.
  • Просмотрите debug.log или error_log, чтобы найти записи об отмене заказа.

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

  • WP-Cron не запускается: убедитесь, что на хостинге правильно настроено выполнение WP-Cron. Для тестирования можно вызвать функцию вручную.
  • Заказы не меняют статус: проверьте правильность ID заказов, права пользователя, а также статус, который вы пытаетесь изменить. Например, не все статусы доступно менять программно.
  • Неправильная фильтрация заказов: используйте параметр date_created корректно, в формате Y-m-d H:i:s, и убедитесь, что дата сравнивается правильно.
  • Производительность: при большом количестве заказов выбирайте лимиты выборки или разбивайте задачи на части, чтобы избежать таймаутов.

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

  • Используйте nonce и права доступа, если добавляете интерфейс для запуска задачи вручную.
  • Логируйте действия в отдельный файл или таблицу, чтобы не засорять error_log.
  • Не запускайте тяжелые задачи слишком часто — достаточно один раз в час.
  • Если магазин крупный, разбивайте обработку на партии, например, по 50 заказов за раз.
  • Для надежности можно интегрировать с WP-Crontrol или системой внешнего CRON на сервере.

Сравнение методов автоматического отключения неоплаченных заказов

МетодОписаниеПлюсыМинусы
Код с WP-CronРегулярная проверка и автоматический статусГибкость, нет плагиновЗависит от WP-Cron, сложнее отладка
Плагин автоматической очисткиГотовые решения, интерфейсПростота установки, поддержкаНагрузка, лишний код
Ручная очисткаАдмин панель — фильтр и удалениеКонтрольТрудозатратно, не автоматично

Наш каталог плагинов WordPress