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

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

В стандартной установке WooCommerce после успешной оплаты заказ переходит в статус processing или completed (в зависимости от типа товара и способа оплаты). Однако бывают ситуации, когда требуется изменить статус заказа на кастомный, например, awaiting_shipment или custom_completed сразу после подтверждения оплаты. При этом стандартные настройки не позволяют это сделать без вмешательства.

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

Как определить, что статус заказа не меняется автоматически

  • В административной панели WooCommerce в разделе Заказы заказ после оплаты не меняет статус
  • Покупатель получает уведомление с неправильным статусом заказа
  • Логи платежной системы подтверждают успешную оплату, но в WooCommerce заказ не обновляется

Пошаговое решение: используем хук woocommerce_payment_complete

WooCommerce предоставляет хук woocommerce_payment_complete, который срабатывает сразу после успешной оплаты заказа. С помощью него можно программно изменить статус заказа.

Вставьте следующий код в файл functions.php вашей темы или в подключаемый плагин:

add_action('woocommerce_payment_complete', 'custom_change_order_status_after_payment');
function custom_change_order_status_after_payment($order_id) {
    if (!$order_id) {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Проверяем текущий статус для безопасности
    if ($order->get_status() === 'processing') {
        // Устанавливаем новый статус, например, 'awaiting-shipment'
        $order->update_status('awaiting-shipment', 'Статус автоматически изменен после оплаты.');
    }
}

В этом примере заказ со статусом processing сменится на awaiting-shipment. Если такого статуса нет в списке WooCommerce, его необходимо зарегистрировать (см. следующий раздел).

Регистрация пользовательского статуса заказа

Для добавления нового статуса awaiting-shipment используйте следующий код:

add_filter('wc_order_statuses', 'add_custom_order_statuses');
function add_custom_order_statuses($order_statuses) {
    $order_statuses['wc-awaiting-shipment'] = _x('Ожидает отправки', 'Order status', 'your-textdomain');
    return $order_statuses;
}

add_action('init', 'register_custom_order_status');
function register_custom_order_status() {
    register_post_status('wc-awaiting-shipment', array(
        'label'                     => 'Ожидает отправки',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop('Ожидает отправки <span class="count">(%s)</span>', 'Ожидает отправки <span class="count">(%s)</span>', 'your-textdomain')
    ));
}

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

  • Создайте тестовый заказ в WooCommerce и оплатите его через выбранный платежный шлюз
  • После успешной оплаты проверьте, что статус заказа изменился на Ожидает отправки (или на ваш кастомный статус) в админке WooCommerce
  • Убедитесь, что в комментариях к заказу появилась запись с сообщением о смене статуса
  • Проверьте e-mail уведомления, если вы их настроили на ваш кастомный статус заказа

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

  • Код не работает и статус не меняется: проверьте, что функция подключена корректно и хук woocommerce_payment_complete срабатывает. Можно временно добавить error_log() внутри функции для отладки.
  • Кастомный статус не отображается в списках: убедитесь, что вы зарегистрировали статус через register_post_status и добавили его в wc_order_statuses.
  • Платежная система не вызывает хук: некоторые шлюзы используют собственные механизмы. В этом случае используйте хук, который специфичен для вашего платежного шлюза, например, woocommerce_order_status_completed.
  • Статус меняется некорректно для всех заказов: добавьте дополнительные проверки внутри функции, например, по способу оплаты или продуктам в заказе.

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

  • Всегда проверяйте наличие $order и $order_id перед вызовом методов, чтобы избежать фатальных ошибок.
  • Не используйте тяжелую логику внутри хука оплаты, чтобы не замедлять процесс оформления заказа.
  • Для сложных условий фильтруйте заказы по мета-данным, способам оплаты или другим параметрам.
  • Для отладки используйте WP_DEBUG и error_log, чтобы отслеживать работу ваших функций.

Сравнение вариантов реализации изменения статуса заказа

Метод Описание Плюсы Минусы
Хук woocommerce_payment_complete Изменение статуса сразу после успешной оплаты Простота, срабатывает для большинства шлюзов Некоторые платежи могут не вызывать хук
Хук woocommerce_order_status_changed Отслеживание смены статуса заказа с дополнительной логикой Гибкость, подходит для кастомных сценариев Может сработать не сразу после оплаты
Плагин для автоматизации (например, Clearfy Pro) Готовые настройки для смены статусов и автоматизации Удобство, меньше кода Зависимость от стороннего ПО, потенциальные расходы
Как удалить и изменить meta-robots в WordPress для SEO оптимизации
08.02.2026
WooCommerce: как автоматически изменять статус заказа после успешной оплаты через хук
24.07.2026
Как создать собственный шорткод в WordPress
23.11.2025
Как удалить дублированные страницы в WordPress без плагинов
31.01.2026
WooCommerce: автоматическое изменение названий и описаний товаров по расписанию
04.07.2026