WooCommerce: как отключить автообработку платежей и использовать собственный хук для контроля

Проблема: автоматическая обработка платежей в WooCommerce мешает интеграции с кастомными системами

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

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

Если вы замечаете, что статус заказа в WooCommerce меняется автоматически без участия вашего кода или сторонних сервисов, вероятно, работает встроенный механизм автообработки платежей. Это может приводить к конфликтам, например:

  • Двойная обработка транзакций
  • Неправильное выставление статуса заказа
  • Отсутствие возможности вставить кастомную проверку оплаты

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

Пошаговое решение: отключение автообработки и внедрение собственного хука

1. Отключаем вызов $order->payment_complete() в кастомном шлюзе

Если вы используете собственный класс платежного шлюза, найдите вызов $order->payment_complete() и закомментируйте его или удалите. Это остановит автоматическую смену статуса заказа.

public function process_payment( $order_id ) {
    $order = wc_get_order( $order_id );
    // $order->payment_complete(); // отключаем автоматическую обработку
    return [
        'result'   => 'success',
        'redirect' => $this->get_return_url( $order )
    ];
}

2. Создаём собственный хук для контроля статуса оплаты

Добавьте в functions.php или в свой плагин следующий код для обработки собственного события оплаты:

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

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

    // Меняем статус вручную
    $order->update_status( 'processing', 'Оплата подтверждена вручную через кастомный хук.' );
    // Здесь можно добавить дополнительные действия, например отправку письма
});

3. Запуск собственного хука при подтверждении оплаты

В нужном месте вашего кода (например, после успешного ответа от платежного шлюза) вызовите:

do_action( 'my_custom_payment_complete', $order_id );

Проверка результата

Чтобы убедиться, что автообработка отключена и ваш хук срабатывает:

  • Создайте тестовый заказ и оплатите его через ваш кастомный шлюз.
  • Проверьте, что статус заказа не меняется автоматически после оплаты.
  • Вызовите вручную do_action( 'my_custom_payment_complete', $order_id ) и проверьте, что статус изменился на processing.
  • Убедитесь, что дополнительные действия (например, уведомления) выполняются.

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

  • Ошибка: Автообработка не отключилась, статус меняется автоматически.
    Причина: В другом месте кода или в стороннем плагине вызывается payment_complete().
    Решение: Используйте поиск по проекту, чтобы найти все вызовы payment_complete() и отключить/заменить их.
  • Ошибка: Собственный хук не срабатывает.
    Причина: Хук вызывается до создания заказа или с неверным ID.
    Решение: Проверьте корректность параметров и порядок вызовов.
  • Ошибка: Статус заказа не меняется.
    Причина: Ошибка в коде обновления статуса или недостаточно прав.
    Решение: Проверяйте возвращаемые ошибки, используйте error_log() и убедитесь, что заказ существует.

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

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

Сравнение вариантов отключения автообработки платежей

МетодПлюсыМинусы
Закомментировать payment_complete() в кастомном шлюзеПростой и быстрый способ полного контроляТребует доступа к коду шлюза, возможно конфликт с обновлениями
Использовать фильтры WooCommerce для перехвата статусаНе требует изменения кода шлюза, гибкостьСложнее в реализации, может влиять на другие плагины
Использовать сторонние плагины для управления статусамиГотовые решения без программированияЗависимость от стороннего кода, лишняя нагрузка
WooCommerce: как добавить дополнительные поля в форму регистрации и оформления без плагинов
17.06.2026
WooCommerce: как избежать конфликтов и ошибок при массовом импорте продуктов
03.05.2026
Как удалить атрибуты width и height из изображений WordPress без плагинов
24.04.2026
Как автоматизировать удаление старых записей в WordPress
28.01.2026
WooCommerce: как избежать ошибок при массовом импорте продуктов
18.05.2026

Уроки со скриншотами, подробные руководства