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

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

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

Основные признаки проблемы:

  • Статус заказа не меняется после успешной оплаты.
  • Покупатель не получает email с подтверждением.
  • В админке WooCommerce заказ застыл в статусе «Ожидает оплаты» или аналогичном.

Как проверить текущий статус заказа и его динамику

Для начала зайдите в WooCommerce → Заказы и откройте проблемный заказ. В блоке статусов проверьте, был ли изменён статус после оплаты.

Для проверки логики можно включить режим отладки WooCommerce. Добавьте в wp-config.php:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

После оплаты проверьте файл wp-content/debug.log на наличие ошибок или предупреждений, связанных со сменой статуса заказа.

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

1. Подключение хука для обработки успешной оплаты

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

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

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

    // Проверяем текущий статус, чтобы не менять повторно
    if ($order->get_status() === 'processing') {
        return;
    }

    // Изменяем статус на processing (обработка)
    $order->update_status('processing', 'Статус автоматически обновлен после оплаты.');

    // Отправляем email с уведомлением о новом статусе
    WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger($order_id);
}

2. Размещение кода

Рекомендуется добавить этот код в файл functions.php дочерней темы или в собственный плагин, чтобы не потерять изменения при обновлении.

3. Тестирование изменения статуса и отправки почты

Создайте тестовый заказ, оплатите его тестовой картой (например, с помощью режима Sandbox в платёжной системе). После успешной оплаты проверьте:

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

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

Чтобы убедиться, что всё работает корректно, выполните следующий чек-лист:

  1. Создайте заказ в WooCommerce с тестовой оплатой.
  2. Оплатите заказ через платёжный шлюз в тестовом режиме.
  3. Проверьте, что статус заказа изменился на processing сразу после оплаты.
  4. Убедитесь, что email подтверждения отправился на указанный клиентом адрес.
  5. В админке проверьте историю статусов заказа — должен быть комментарий «Статус автоматически обновлен после оплаты».

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

Статус не меняется после оплаты

  • Платёжный шлюз не вызывает хук woocommerce_payment_complete. Решение: используйте другой хук, например, woocommerce_order_status_completed, либо добавьте интеграцию с платёжным шлюзом.
  • Кэширование мешает обновлению статуса. Отключите кэширование страниц и объектный кэш на время тестирования.

Email не отправляется

  • Почтовый сервер не настроен или письма попадают в спам. Используйте SMTP-плагин для отправки почты.
  • Вызов email-события сделан неправильно. Убедитесь, что используете правильный класс и метод trigger.

Ошибка в коде или PHP-фатал

  • Проверьте синтаксис и наличие функции wc_get_order.
  • Добавьте проверку на существование объекта заказа перед вызовами методов.

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

  • Добавляйте проверки на существование заказа и статуса, чтобы избежать ошибок при работе с несуществующими ID.
  • Избегайте повторного изменения статуса, чтобы не создавать лишние уведомления и логи.
  • Используйте SMTP-сервер для отправки писем, чтобы повысить вероятность доставки и избежать попадания в спам.
  • Не подключайте код напрямую в родительскую тему, чтобы сохранить возможность обновлений.

Сравнение вариантов реализации

МетодПлюсыМинусы
Хук woocommerce_payment_complete Надёжно срабатывает при стандартных платежах, простая реализация Не работает с некоторыми кастомными шлюзами
Хук woocommerce_order_status_completed Используется для подтверждения завершения заказа Меняет статус позже, не всегда подходит для мгновенной обработки
Плагины для автосмены статусов Готовое решение, настройка через интерфейс Избыточно, влияет на производительность, зависит от обновлений
Как создать автоматический отчет о проблемах с безопасностью в WordPress
04.03.2026
Как установить и настроить Redis кеш в WordPress для ускорения сайта
07.02.2026
Как удалить вредоносные плагины в WordPress
18.11.2025
WooCommerce: как отправлять уведомления о заказах по email без плагинов
13.06.2026
Как создать динамический фильтровый поиск в WordPress с поддержкой AJAX
04.04.2026