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

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

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

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

1. Добавление планировщика событий (WP-Cron) для проверки неоплаченных заказов

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

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

2. Реализация обработчика, который изменяет статус заказов

add_action( 'wpkey_check_unpaid_orders_event', 'wpkey_change_status_unpaid_orders' );

function wpkey_change_status_unpaid_orders() {
    $days_unpaid = 3; // Количество дней для ожидания оплаты
    $date_limit = strtotime( "-{$days_unpaid} days" );

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

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        try {
            $order->update_status( 'cancelled', 'Автоматическое отменение неоплаченного заказа после 3 дней' );
        } catch ( Exception $e ) {
            error_log( 'Ошибка изменения статуса заказа #' . $order->get_id() . ': ' . $e->getMessage() );
        }
    }
}

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

Чтобы убедиться, что автоматизация работает:

  • Проверьте в админке WooCommerce список заказов со статусом pending, которым более 3 дней.
  • Запустите вручную WP-Cron, например, с помощью плагина WP Crontrol или вызовом wpkey_change_status_unpaid_orders() из консоли WP-CLI.
  • После запуска функция должна изменить их статус на cancelled.
  • Проверьте лог ошибок PHP на предмет исключений.

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

  • WP-Cron не запускается автоматически: Проверьте, активен ли WP-Cron на сайте (define('DISABLE_WP_CRON', false); в wp-config.php). Если нет, настройте системный cron для вызова wp-cron.php.
  • Неправильный формат даты в запросе заказов: Убедитесь, что date_created правильно используется с префиксом < для выборки старых дат.
  • Отсутствие прав на изменение статуса: Проверьте, что скрипт запускается с достаточными правами и нет конфликтов с плагинами безопасности.
  • Заказы в статусе не pending не обрабатываются: При необходимости расширьте список статусов в аргументах запроса.

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

  • Ограничьте количество изменяемых заказов за один запуск, чтобы избежать превышения лимитов памяти и времени выполнения. Например, добавьте параметр 'limit' => 50 и запускайте WP-Cron чаще.
  • Логируйте действия функции для последующего аудита и отладки.
  • Регулярно очищайте логи ошибок, чтобы не перегружать сервер.
  • Проверяйте совместимость с плагинами кэширования, чтобы WP-Cron запускался корректно.

Сравнение вариантов автоматического изменения статуса

МетодПлюсыМинусыРекомендации
WP-Cron с пользовательской функциейГибкость, контроль, без сторонних плагиновЗависит от посещаемости сайта, возможны задержкиПодходит для средних и крупных проектов
Плагины автоматизации (например, Clearfy Pro)Простая настройка, дополнительные функцииДополнительная нагрузка, зависимость от плагинаДля быстрой реализации без кода
Внешний системный cron и WP-CLIВысокая надежность и точность расписанияТребует доступа к серверу, технические навыкиДля профессиональных хостингов и опытных админов
Как автоматически удалять старые черные списки в WordPress
24.01.2026
WooCommerce: автоматическое отключение неиспользуемых способов оплаты
21.07.2026
Как избежать конфликтов между плагинами в WordPress: практическое руководство
14.03.2026
Как удалить неиспользуемые таксономии в WordPress
25.02.2026
Как изменить размер изображений в WordPress без потери качества
05.04.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс