Диагностика задачи: зачем и когда нужно автоматизировать уведомления
В стандартной конфигурации WooCommerce отправляет уведомления покупателю и администратору только при некоторых изменениях статуса заказа. Но часто требуется гибко настроить отправку писем или добавить кастомные уведомления при любых статусах или их изменениях. Это особенно актуально для магазинов с нестандартными процессами оплаты, доставки или возвратов.
Основные вопросы:
- Отправляются ли письма при всех изменениях статусов?
- Как добавить отправку письма по кастомному статусу?
- Как изменить содержимое писем или добавить новые шаблоны?
Как проверить текущую отправку писем в WooCommerce
Для начала убедитесь, что стандартные уведомления работают:
- Перейдите в WooCommerce > Настройки > Email.
- Проверьте, что нужные уведомления включены (например, «Новый заказ», «Заказ выполнен» и т.д.).
- Для теста измените статус заказа вручную в админке и посмотрите, придёт ли письмо.
Если письма не отправляются, возможно, проблема в настройках SMTP, конфликте плагинов или теме.
Пошаговое решение: добавляем автоматическую отправку письма при смене статуса заказа
Рассмотрим пример, как отправлять кастомное письмо покупателю при переходе заказа в статус processing (обработка) с использованием стандартных возможностей WooCommerce и собственного кода.
1. Создаём хук для отправки письма при смене статуса
add_action('woocommerce_order_status_changed', 'send_custom_email_on_status_change', 10, 4);
function send_custom_email_on_status_change($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
// Получаем объект WC_Emails
$mailer = WC()->mailer();
// Загружаем шаблон письма
$mails = $mailer->get_emails();
if (!empty($mails['WC_Email_Customer_Processing_Order'])) {
$mails['WC_Email_Customer_Processing_Order']->trigger($order_id);
}
}
}
Этот код добавляем в functions.php вашей темы или в кастомный плагин.
2. Как создать своё письмо для кастомного статуса
Если у вас есть собственный статус, например awaiting_payment, и вы хотите отправить письмо, нужно зарегистрировать новый класс письма и добавить его в систему WooCommerce.
Минимальный пример регистрации письма:
add_filter('woocommerce_email_classes', 'add_custom_awaiting_payment_email');
function add_custom_awaiting_payment_email($emails) {
require_once 'class-wc-email-awaiting-payment.php'; // Ваш класс письма
$emails['WC_Email_Awaiting_Payment'] = new WC_Email_Awaiting_Payment();
return $emails;
}
add_action('woocommerce_order_status_awaiting_payment', 'trigger_awaiting_payment_email');
function trigger_awaiting_payment_email($order_id) {
$mailer = WC()->mailer();
$emails = $mailer->get_emails();
if (!empty($emails['WC_Email_Awaiting_Payment'])) {
$emails['WC_Email_Awaiting_Payment']->trigger($order_id);
}
}
Для полноценного класса письма нужно унаследовать WC_Email и определить шаблоны, темы, заголовки и тело письма. Документация WooCommerce содержит подробности по этому вопросу.
Проверка результата после внедрения
Чтобы убедиться, что письма отправляются корректно:
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа вручную или программно на нужный (например,
processing). - Проверьте, что письмо пришло на email покупателя.
- Если письма не приходят, включите логирование почты с помощью плагина WP Mail Logging или аналогичного.
Частые ошибки при автоматической отправке писем
- Письма не отправляются вовсе: Причина часто в неправильных настройках SMTP сервера, конфликте плагинов или проблемах с хостингом. Проверяйте логи почты и используйте SMTP-плагин (например, WP Mail SMTP).
- Письмо отправляется несколько раз: Возможно, хук срабатывает несколько раз из-за неправильного приоритетa или вызова
triggerв цикле. - Письмо приходит, но пустое или с ошибками шаблона: Проверьте правильность путей к шаблонам и корректность данных в объекте
$order. - Кастомный статус не отправляет письмо: Убедитесь, что статус зарегистрирован корректно и добавлен в список email-классов WooCommerce.
Практические советы по безопасности и производительности
- Не отправляйте письма напрямую в хуках с высокой нагрузкой; используйте очередь или отложенный запуск через WP-Cron.
- Избегайте отправки писем при каждом обновлении, если статус не изменился — проверяйте старый и новый статус.
- При кастомизации писем используйте переводы и шаблоны, чтобы не ломать совместимость при обновлениях WooCommerce.
- Регулярно очищайте логи отправленных писем и следите за нагрузкой на SMTP-сервер.
Сравнение вариантов реализации автоматической отправки писем
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартные уведомления WooCommerce | Простота, стабильность, нет кода | Мало гибкости, ограниченное число статусов | Если хватает базового функционала |
| Добавление хуков в functions.php | Гибкость, быстрое внедрение | Требуется знание PHP, возможность конфликтов | Для точечных кастомизаций |
| Создание собственного класса письма | Максимальная кастомизация | Сложность, поддержка, требует знаний | Если нужен уникальный email под нестандартные статусы |
| Плагины для расширения email | Удобство, готовые решения | Зависимость от стороннего кода, возможные конфликты | Для быстрого внедрения без кода |