WPExperts

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

Почему важно автоматически менять статус заказа после оплаты в WooCommerce

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

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

Если заказ остаётся в статусе "обработка" или "ожидает оплаты" после успешной транзакции, это может вызвать задержки в обработке и недовольство клиентов. Основные причины:

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

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

Для решения задачи воспользуемся хуком woocommerce_payment_complete. Он срабатывает, когда WooCommerce считает оплату завершённой.

<?php
// В functions.php вашей темы или в кастомном плагине
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', 'Статус заказа автоматически изменён после оплаты.');
    }
}

Если нужно изменить статус только для определённых способов оплаты, добавьте проверку:

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

    $payment_method = $order->get_payment_method();
    // Например, только для оплаты через 'bacs' (банковский перевод)
    if ($payment_method === 'bacs' && $order->get_status() !== 'completed') {
        $order->update_status('completed', 'Автоматическое завершение заказа для BACS.');
    }
}

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

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

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

  • Статус не меняется: Убедитесь, что хук woocommerce_payment_complete срабатывает. Для этого можно временно добавить error_log('payment_complete fired: ' . $order_id); внутри функции.
  • Неправильный ID заказа: Проверяйте, что аргумент $order_id валиден и объект $order успешно получен.
  • Конфликты с другими плагинами: Отключите сторонние плагины и проверьте, не блокируют ли они изменение статуса.
  • Неверный способ оплаты: Проверьте правильность идентификатора способа оплаты через $order->get_payment_method().

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

  • Не используйте этот код для автоматического завершения заказов при способах оплаты, требующих подтверждения (например, банковский перевод) — это может привести к ошибкам и финансовым потерям.
  • Добавляйте логирование в рабочем режиме только при необходимости, чтобы не нагружать сервер.
  • Размещайте кастомный код в дочерней теме или отдельном плагине, чтобы избежать потери изменений при обновлении.
  • Тестируйте все изменения на staging-среде, чтобы не нарушить процесс продаж на живом сайте.

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

ВариантПреимуществаНедостаткиКомпромисс
Использование хука woocommerce_payment_completeПростая и надёжная реализация через стандартный хук WooCommerceНе подходит для всех способов оплаты, где требуется ручная проверкаДобавить фильтрацию по способу оплаты
Обработка через вебхуки платёжного шлюзаТочная синхронизация со статусом платежаСложнее в настройке, зависит от сторонних сервисовИспользовать вместе с хуком WooCommerce для резервного варианта
Плагины автоматизации заказовГотовые решения без кодаМогут быть платными, избыточными по функционалуИспользовать при отсутствии возможности писать код
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »