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

Диагностика проблемы: почему заказы остаются в статусе "Ожидает оплаты"

В WooCommerce заказы со статусом "Ожидает оплаты" (pending) могут накапливаться, если пользователь не завершает оплату или платежный шлюз не сообщает об отмене транзакции. Это приводит к "зависшим" заказам, которые создают путаницу и нагружают базу данных.

Проверить наличие таких заказов можно через админку WooCommerce или с помощью SQL-запроса:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Если число заказов с таким статусом растет, стоит автоматизировать их обработку.

Как автоматически менять статус заказа на "Отменён" при отсутствии оплаты

Для решения задачи нужно реализовать скрипт, который периодически проверяет заказы с длительным статусом "Ожидает оплаты" и меняет их статус на "Отменён" (cancelled). Для этого используем WP-Cron.

Шаг 1. Создаём функцию обработки заказов

function wpcoder_cancel_unpaid_orders() {
    $args = array(
        'limit' => -1,
        'status' => 'pending',
        'date_created' => '<' . ( time() - 60 * 60 * 24 ), // старше 24 часов
    );
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматическая отмена заказа после 24 часов без оплаты.' );
    }
}

Шаг 2. Регистрируем задачу в WP-Cron

add_action( 'wpcoder_cancel_unpaid_orders_event', 'wpcoder_cancel_unpaid_orders' );

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

Шаг 3. Очистка при деактивации плагина или темы

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

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

Чтобы убедиться, что скрипт работает, создайте тестовый заказ и оставьте его неоплаченным. Подождите больше 24 часов или измените условие времени в коде на пару минут для тестирования:

'date_created' => '<' . ( time() - 60 * 2 ), // старше 2 минут

Затем вручную запустите событие WP-Cron:
Перейдите в раздел Инструменты > События WP-Cron (если есть плагин WP Crontrol) и выполните задачу wpcoder_cancel_unpaid_orders_event. После этого статус тестового заказа должен смениться на "Отменён".

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

  • WP-Cron не запускается автоматически — это частая проблема на хостингах с низкой посещаемостью. Решение: настроить системный cron на вызов wp-cron.php или запускать задачи вручную через плагин WP Crontrol.
  • Неправильный формат даты в запросе — убедитесь, что в date_created используется правильный формат Unix timestamp и сравнение работает корректно.
  • Функция wc_get_orders возвращает пустой массив — проверьте, что статусы указаны правильно, и что в базе есть подходящие заказы. Для отладки добавьте логирование количества найденных заказов.
  • Отсутствие прав на обновление статуса — если функция не срабатывает, проверьте, что запускается с правами администратора и что нет конфликтов с другими плагинами.

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

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

Сравнение вариантов решения задачи

МетодОписаниеПреимуществаНедостатки
Плагин автоматической очистки заказов Использование готовых плагинов для автоматической отмены и очистки старых заказов. Быстрая настройка, поддержка, интерфейс Может быть избыточным, не всегда гибким, нагрузка на сайт
Ручной код с WP-Cron (наш вариант) Лёгкая кастомизация, интеграция с текущими задачами. Контроль над логикой, низкая нагрузка, прозрачность Требует навыков разработки, настройка cron
Отмена заказов вручную Администратор вручную меняет статусы в админке. Безопасно, без кода Затратно по времени, риск пропустить
Автоматическое удаление отменённых заказов в WooCommerce по сроку хранения
27.05.2026
Как избежать проблем с пермалинками в WordPress
24.01.2026
Как добавить автоматический alt-текст к изображениям в WordPress
19.03.2026
Обновление WordPress без потери настроек и данных
07.01.2026
Оптимизация загрузки шаблонов в WordPress
09.03.2026