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

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

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

Чтобы проверить, возникает ли эта проблема на вашем сайте, выполните следующие шаги:

  • Создайте тестовый заказ и оплатите его любым способом.
  • Перейдите в админку WooCommerce → Заказы и проверьте статус созданного заказа.
  • Если статус не изменился на ожидаемый (например, не стал "Обработка" или "Завершён"), значит проблема актуальна.

Как WooCommerce меняет статус заказов после оплаты

По умолчанию WooCommerce меняет статус заказа через встроенные хуки, которые активируются после подтверждения платежа. Например, платежные шлюзы вызывают метод $order->payment_complete(), который меняет статус на "Обработка" или "Завершён" в зависимости от настроек.

Если ваш платежный шлюз не вызывает этот метод, статус не обновляется автоматически.

Типичные причины проблемы

  • Кастомный платежный шлюз не реализует корректно вызов payment_complete().
  • Платежные системы с отложенным подтверждением (например, банковские переводы) требуют ручного изменения статуса.
  • Конфликты с другими плагинами, которые перехватывают изменение статуса.

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

Самый универсальный способ — использовать хук woocommerce_order_status_changed или woocommerce_payment_complete для принудительного изменения статуса заказа.

Рассмотрим пример кода, который меняет статус заказа на "завершён" после успешной оплаты:

add_action('woocommerce_payment_complete', 'custom_set_order_status_completed');
function custom_set_order_status_completed($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }
    // Проверяем текущий статус
    if ($order->get_status() !== 'completed') {
        $order->update_status('completed', 'Статус изменён автоматически после оплаты.');
    }
}

Этот код нужно добавить в файл functions.php вашей дочерней темы или в отдельный плагин.

Что делает код

  • Хук woocommerce_payment_complete вызывается после успешной оплаты.
  • Получаем объект заказа по ID.
  • Если статус не "completed", меняем его и добавляем комментарий.

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

Чтобы убедиться, что статус меняется корректно:

  1. Создайте тестовый заказ и оплатите его (используйте тестовый режим платежного шлюза).
  2. Перейдите в WooCommerce → Заказы и убедитесь, что статус изменился на "завершён" автоматически.
  3. Проверьте в комментариях к заказу появление сообщения "Статус изменён автоматически после оплаты."

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

  • Статус не меняется вовсе: Проверьте, корректно ли вызывается хук woocommerce_payment_complete. Если используете кастомный шлюз, добавьте вызов $order->payment_complete() вручную.
  • Код вызывает ошибку PHP: Убедитесь, что используете правильный синтаксис, и что $order — объект класса WC_Order. Ошибка может возникнуть при неправильном получении заказа.
  • Статус меняется, но не на тот, что нужен: В функции update_status укажите нужный статус (processing, completed и т.д.).
  • Конфликты с другими плагинами: Отключите сторонние плагины для проверки, не блокируют ли они изменение статуса.

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

  • Не меняйте статус заказа напрямую в базе — используйте API WooCommerce (update_status), чтобы сохранить логи и триггеры.
  • Добавляйте проверки на существование заказа и валидность ID.
  • Не нагружайте хук лишней логикой, чтобы не замедлять процесс оформления заказа.
  • Для массовых изменений статусов используйте WP-CLI или отдельные задачи cron, а не хуки оплаты.

Альтернативы: сравнение способов изменения статуса заказа

МетодПреимуществаНедостатки
Вызов $order->payment_complete() в платежном шлюзеСамый правильный способ, меняет статус и запускает все связанные процессыТребует правок в коде шлюза
Хук woocommerce_payment_completeПростая реализация без изменения шлюзаМеняет статус только после оплаты, не подходит для отложенных платежей
Хук woocommerce_order_status_changedГибкий, можно реагировать на любые изменения статусовСложнее реализовать логику
Ручное изменение через админкуПростое решение для единичных заказовНе автоматизировано, требует участия человека
Как установить ограничение на количество регистраций в WordPress
27.03.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию с поддержкой вариаций
07.07.2026
WooCommerce: установка лимита на количество товаров в корзине без плагинов
05.05.2026
WooCommerce: как автоматически отключать товар после продажи
18.05.2026
Как установить лимит на количество регистраций в WordPress
12.02.2026