WPCourse

Автоматическое изменение статуса заказа в WooCommerce по срокам оплаты

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

В WooCommerce по умолчанию заказы остаются в статусе "Ожидает оплаты" неопределённо долго, если покупатель не завершил оплату. Это создаёт нагрузку на админку и мешает аналитике. Частая задача — автоматически переводить неоплаченные заказы в статус "Отменён" через заданное время.

Как диагностировать проблему

  • Проверьте, есть ли в базе неоплаченные заказы с датой создания более X дней назад.
  • Убедитесь, что нет плагинов, которые уже управляют автоматическим изменением статусов.
  • Проверьте, что не настроена автоматическая очистка неоплаченных заказов (например, через WooCommerce настройки).

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

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

function wpcourse_auto_cancel_unpaid_orders() {
    $days_limit = 3; // количество дней до отмены заказа
    $date_limit = strtotime("-" . $days_limit . " days");

    $args = array(
        'limit' => -1,
        'status' => 'pending', // статус неоплаченных заказов
        'date_created' => '<' . date('Y-m-d H:i:s', $date_limit),
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->update_status('cancelled', 'Автоматическая отмена заказа по истечении срока оплаты.');
    }
}

2. Регистрируем крон-задачу

add_action('wpcourse_daily_order_check', 'wpcourse_auto_cancel_unpaid_orders');

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

3. Добавляем очистку крон-задачи при деактивации темы или плагина

function wpcourse_deactivate_cron() {
    $timestamp = wp_next_scheduled( 'wpcourse_daily_order_check' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpcourse_daily_order_check' );
    }
}
register_deactivation_hook( __FILE__, 'wpcourse_deactivate_cron' );

Как проверить, что решение работает

  • Создайте тестовый заказ со статусом "Ожидает оплаты" с датой создания более 3 дней назад. Можно вручную изменить дату заказа в базе или использовать тестовый плагин.
  • Выполните вручную крон-задачу через WP-CLI: wp cron event run wpcourse_daily_order_check
  • Проверьте, что статус заказа изменился на "Отменён" и в комментариях заказа появилась заметка об автоматической отмене.
  • Настройте логи или уведомления для контроля работы автоматизации.

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

  • Крон-задача не запускается: проверьте, что на сайте включён WP-Cron и нет проблем с его запуском. Для отладки используйте плагин WP Crontrol.
  • Функция не находит заказы: проверьте правильность параметров wc_get_orders(), особенно условие по дате. Для сложных условий можно использовать WP_Query напрямую.
  • Статус не меняется: убедитесь, что функция вызывается, и нет конфликтов с другими плагинами, блокирующими изменение статуса.

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

  • Ограничьте количество обрабатываемых заказов за один запуск, если их слишком много. Например, используйте параметр limit => 20 и в следующий запуск обрабатывайте следующие.
  • Не запускайте задачу чаще, чем раз в сутки, чтобы не перегружать базу.
  • Записывайте результаты работы в лог-файл для мониторинга и выявления сбоев.
  • Не используйте слишком короткие сроки отмены, чтобы не потерять клиентов, которые оплачивают с задержкой.

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

МетодПлюсыМинусы
Код в functions.php + WP-CronПолный контроль, бесплатно, легко адаптироватьТребуется базовые навыки программирования, зависит от WP-Cron
Плагин автоматической отмены заказовПростота установки, готовый функционалМожет быть избыточным, нагрузка, зависит от разработчика
Ручное изменение статусовМаксимальная гибкостьТрудозатратно, ошибки, нет автоматизации
×
Прокачай свой сайт WordPress!

WordPress

-20% на премиум темы и плагины

Создай сайт своей мечты ⋙