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

Почему важно автоматически отключать неоплаченные заказы в WooCommerce

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

Диагностика проблемы: как понять, что неоплаченные заказы требуют обработки

Основные признаки, что стоит настроить автоматическое отключение заказов:

  • Большое количество заказов в статусе on-hold или pending накапливаются без оплаты.
  • Администраторы получают жалобы на невозможность оформления новых заказов из-за ограничений.
  • Отчёты WooCommerce показывают высокую долю неоплаченных заказов, которые не закрываются.

Для быстрого просмотра текущих неоплаченных заказов можно выполнить SQL-запрос через phpMyAdmin или использовать WP-CLI:

wp post list --post_type=shop_order --post_status=pending,on-hold --fields=ID,post_status,post_date --format=table

Пошаговое решение: автоматическое отключение с уведомлением клиента

1. Добавляем функцию для смены статуса заказов после заданного времени

В файл functions.php вашей темы или в кастомный плагин добавьте следующий код. Он будет запускаться при хукe woocommerce_order_status_pending и планировать событие на отключение заказа через 24 часа (можно настроить время):

function schedule_cancel_unpaid_order( $order_id ) {
    if ( ! wp_next_scheduled( 'cancel_unpaid_order_event', array( $order_id ) ) ) {
        wp_schedule_single_event( time() + 86400, 'cancel_unpaid_order_event', array( $order_id ) );
    }
}
add_action( 'woocommerce_order_status_pending', 'schedule_cancel_unpaid_order' );

2. Обработка отмены заказа и отправка уведомления

Создаём обработчик планового события, который проверяет статус заказа и меняет его, если оплата не поступила. Также отправляет письмо клиенту.

add_action( 'cancel_unpaid_order_event', 'cancel_unpaid_order_callback' );
function cancel_unpaid_order_callback( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }

    if ( $order->has_status( 'pending' ) || $order->has_status( 'on-hold' ) ) {
        // Меняем статус на отменён
        $order->update_status( 'cancelled', 'Автоматическая отмена неоплаченного заказа спустя 24 часа.' );

        // Отправка письма клиенту
        $mailer = WC()->mailer();
        $mails = $mailer->get_emails();
        if ( ! empty( $mails ) && ! empty( $mails['WC_Email_Cancelled_Order'] ) ) {
            $mails['WC_Email_Cancelled_Order']->trigger( $order_id );
        }
    }
}

3. Очистка запланированных событий при смене статуса заказа

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

function clear_cancel_unpaid_order_event( $order_id ) {
    $timestamp = wp_next_scheduled( 'cancel_unpaid_order_event', array( $order_id ) );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'cancel_unpaid_order_event', array( $order_id ) );
    }
}
add_action( 'woocommerce_order_status_processing', 'clear_cancel_unpaid_order_event' );
add_action( 'woocommerce_order_status_completed', 'clear_cancel_unpaid_order_event' );

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

  1. Создайте тестовый заказ с оплатой «оплата при получении» (статус pending или on-hold).
  2. Подождите 24 часа или уменьшите время в коде на несколько минут для теста.
  3. Проверьте, что статус заказа изменился на cancelled и на email клиента пришло уведомление.
  4. Оплатите заказ до истечения времени и проверьте, что автоматическая отмена не сработала.

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

  • События не планируются: убедитесь, что WP-Cron работает (проверьте wp-cron.php и не отключён ли он в wp-config.php).
  • Письмо об отмене не отправляется: проверьте настройки почты WooCommerce и наличие шаблона Cancelled Order.
  • Заказы не отменяются: проверьте права доступа, корректность статусов, а также логи ошибок сервера.
  • Повторное планирование события: не допускайте дублирования с помощью проверки wp_next_scheduled.

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

  • Не применяйте сразу массовое удаление заказов — это может привести к потере данных и конфликтам с отчётами.
  • Используйте WP-Cron для планирования, но при высокой нагрузке лучше настроить системный cron и отключить WP-Cron.
  • Проверяйте логи сервера и WooCommerce для своевременного обнаружения проблем.
  • Для уведомлений используйте встроенные механизмы WooCommerce, чтобы сохранять единый стиль писем и логи.
  • Резервное копирование базы данных перед внедрением автоматических процессов обязательно.

Сравнение подходов: плагин vs кастомный код

КритерийПлагин (например, WooCommerce Cancel Unpaid Orders)Кастомный код (описанный выше)
ГибкостьОграничена настройками плагинаПолный контроль и кастомизация
ПроизводительностьМожет добавить нагрузкуМинимальная нагрузка, можно оптимизировать
БезопасностьЗависит от качества плагинаКонтролируется разработчиком
ОбновленияПлагин обновляется отдельноПоддержка собственной ответственности
Требования знанийМинимальныеТребуются навыки PHP и WooCommerce

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