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

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

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

Причины могут быть следующими:

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

Как определить, что именно не работает?

Для диагностики нужно проверить:

  • Логи платежного шлюза (например, Stripe, PayPal) на предмет успешного платежа.
  • Статус заказа в админке WooCommerce после оплаты.
  • Конфликты с плагинами, отключив их по очереди.
  • Логи ошибок PHP (если включены) на предмет предупреждений и ошибок.

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

В WooCommerce изменение статуса заказа обычно происходит с помощью встроенных функций, но если платежный шлюз не обрабатывает это корректно, можно добавить кастомный хук.

1. Добавление кастомного обработчика для обновления статуса заказа

Пример для обработки успешного платежа по хуку woocommerce_payment_complete:

add_action('woocommerce_payment_complete', 'wpq_automate_order_status_update', 10, 1); 
function wpq_automate_order_status_update($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Пример: если статус - 'processing', изменить на 'completed'
    if ($order->get_status() === 'processing') {
        $order->update_status('completed', 'Статус автоматически изменён после успешного платежа.', true);
    }
}

Этот код проверяет статус и меняет его на completed после успешного платежа. Можно адаптировать под свои бизнес-процессы.

2. Альтернативный хук для платежных шлюзов с нестандартным поведением

Если платежный шлюз не триггерит woocommerce_payment_complete, используйте woocommerce_order_status_changed:

add_action('woocommerce_order_status_changed', 'wpq_order_status_changed_handler', 10, 4);
function wpq_order_status_changed_handler($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'on-hold') {
        // Проверяем, что платеж прошёл и меняем статус
        if (wpq_check_payment_success($order)) {
            $order->update_status('processing', 'Платёж подтверждён, статус обновлен.', true);
        }
    }
}

function wpq_check_payment_success($order) {
    // Логика проверки успешного платежа (например, проверка метаданных)
    $payment_status = $order->get_meta('_payment_status');
    return $payment_status === 'success';
}

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

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

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

  • Код не срабатывает: проверьте, что хуки подключены в functions.php активной темы или в плагине; убедитесь, что нет конфликтов с другими плагинами.
  • Статус не меняется на нужный: проверьте корректность названий статусов (используйте get_status() и доступные статусы WooCommerce).
  • Платежный шлюз не запускает событие: изучите документацию платежного шлюза, возможно, нужен другой хук или callback.
  • Ошибка "Call to undefined function": убедитесь, что используете функции WooCommerce внутри хуков, которые вызываются после инициализации WooCommerce.

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

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

Сравнение решений: встроенные хуки vs кастомный код

МетодПреимуществаНедостаткиКогда использовать
Встроенный woocommerce_payment_completeПростой, стандартный, поддерживается WooCommerceНе всегда вызывается всеми платежными шлюзамиДля стандартных шлюзов с правильной интеграцией
Кастомные хуки и проверкиГибкость, возможность подстроиться под любые платежные методыТребует знания API, возможно усложнение поддержкиКогда нужны нестандартные сценарии или нестабильные шлюзы
Плагины автозамены статусовНе требует кода, простота настройкиМожет быть избыточным, возможны конфликтыДля быстроразвёрнутых проектов без разработчиков
Как создать и использовать собственные таблицы в базе данных WordPress
24.11.2025
Как использовать WP_Query для эффективного кэширования запросов WordPress
27.03.2026
WooCommerce не отображает атрибуты продуктов: как исправить
26.04.2026
WooCommerce: не отправляются письма о статусах заказов — как исправить
03.05.2026
Как создать свой плагин для автоматизации задач в WordPress
30.01.2026