WooCommerce: автоматическая отправка письма с подтверждением заказа через код

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

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

Как проверить отправку писем WooCommerce

  • Оформите тестовый заказ с реальным email.
  • Проверьте папку "Исходящие" в почтовом сервере или логи SMTP (если используется).
  • Включите журнал WooCommerce для email: WooCommerce > Статус > Логи.
  • Убедитесь, что в настройках WooCommerce > Настройки > Email включена рассылка "Новый заказ" и "Подтверждение заказа".

Пошаговое решение: как программно отправлять письмо с подтверждением заказа

Если нужно отправлять подтверждение не при стандартном событии, а, например, при смене статуса заказа на "завершен" или кастомный статус, можно использовать хук woocommerce_order_status_{$status}. Вот рабочий пример кода, который добавляет отправку письма при смене статуса заказа.

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

    // Получаем объект email для подтверждения заказа
    $mailer = WC()->mailer();
    $mails = $mailer->get_emails();

    if (!empty($mails)) {
        foreach ($mails as $mail) {
            if ($mail->id == 'customer_completed_order') {
                $mail->trigger($order_id);
            }
        }
    }
}

В данном коде мы:

  • Подписываемся на событие смены статуса заказа на "completed".
  • Получаем объект заказа.
  • Ищем нужный email-обработчик по id customer_completed_order.
  • Вызываем отправку письма через метод trigger().

Как изменить код для других статусов

Чтобы отправлять письмо при другом статусе, например, "processing" или кастомном, просто замените completed в хуке на нужный статус. Пример для кастомного статуса my-custom-status:

add_action('woocommerce_order_status_my-custom-status', 'send_order_confirmation_email', 10, 1);

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

  • Оформите заказ и смените статус заказа в админке на тот, что указан в хуке.
  • Проверьте почту, указанную в заказе — должно прийти письмо с подтверждением.
  • Если письма нет, включите WP_DEBUG и проверьте логи ошибок PHP.
  • Также проверьте логи почтового сервера или SMTP-плагина.

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

  • Письмо не отправляется: Возможно, неправильный ID письма в коде. Для проверки можно вывести print_r(array_keys($mails)); чтобы увидеть доступные email-обработчики.
  • Письмо приходит пустым или с ошибками: Проверьте шаблоны писем WooCommerce, возможно они повреждены или переопределены в теме.
  • Письмо приходит с задержкой или не приходит из-за SMTP: Настройте SMTP плагин (например, WP Mail SMTP) или используйте внешние сервисы (SendGrid, Mailgun).
  • Код не срабатывает при кастомном статусе: Убедитесь, что статус зарегистрирован корректно и WooCommerce его видит как статус заказа.

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

  • В коде избегайте прямого вывода ошибок на продакшене — используйте логи.
  • Не отправляйте письма в хуках, которые вызываются часто без условий — это может привести к спаму и нагрузке.
  • Для массовых рассылок используйте очереди и WP-Cron, чтобы не блокировать процессы оформления заказов.
  • Отключайте ненужные письма в настройках WooCommerce, чтобы не создавать дублирование.

Сравнение способов отправки писем в WooCommerce

СпособПлюсыМинусы
Стандартные настройки WooCommerceПростая настройка, без кодаМало гибкости, нельзя менять триггеры
Использование хука и метода trigger() (код)Гибкость, можно задать любые статусы и сценарииТребует навыков разработки, возможно ошибки при неправильной реализации
Плагины SMTP и рассылокНадежная доставка, логи, интеграцииДополнительная настройка, возможна нагрузка
Как создать эффективный пул подключений в WordPress для ускорения работы сайта
16.01.2026
Как создать динамические метаполя для кастомных типов записей в WordPress
07.02.2026
Как создать сниппеты для оптимизации WordPress
26.01.2026
Как использовать pre_get_posts для сложных условий выборки постов в WordPress
12.07.2026
Удаление неиспользуемых вариаций товаров в WooCommerce через код
14.05.2026