Диагностика проблемы: почему письма с подтверждением заказа не отправляются автоматически
В 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 и рассылок | Надежная доставка, логи, интеграции | Дополнительная настройка, возможна нагрузка |