Диагностика проблемы с отправкой писем при смене статуса заказа в WooCommerce
Часто пользователи WooCommerce сталкиваются с тем, что при автоматическом или ручном изменении статуса заказа письма клиенту не отправляются. Это связано с несколькими типичными причинами: неправильной настройкой почтового сервера, конфликтами плагинов, кастомными обработчиками статусов или отсутствием триггеров для отправки писем.
Для диагностики выполните следующие шаги:
- Проверьте, активирована ли стандартная функция отправки email в WooCommerce:
WooCommerce > Настройки > Email. - Убедитесь, что статус заказа действительно меняется (проверьте в админке и в базе данных).
- Отключите все сторонние плагины, которые могут влиять на отправку писем, особенно SMTP, кеширующие и оптимизационные.
- Проверьте логи почтового сервера или используйте плагин WP Mail Logging для фиксации попыток отправки писем.
- Убедитесь, что в коде нет кастомных фильтров или хуков, которые отключают стандартную отправку email.
Пошаговое решение проблемы с отправкой писем при смене статуса заказа
1. Проверка и настройка стандартных email WooCommerce
Перейдите в WooCommerce > Настройки > Email и убедитесь, что нужные шаблоны писем активированы. Например, для статуса processing должно быть включено письмо «Заказ обработан».
2. Использование правильных хуков для отправки писем при кастомных статусах
Если вы добавляете пользовательские статусы заказов, стандартные email могут не срабатывать. В этом случае нужно вручную вызвать отправку письма. Пример кода для отправки письма при смене статуса на custom-status:
add_action('woocommerce_order_status_custom-status', 'send_custom_status_email', 10, 1);
function send_custom_status_email($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails)) {
foreach ($mails as $mail) {
if ($mail->id === 'customer_completed_order') { // или другой идентификатор письма
$mail->trigger($order_id);
}
}
}
}Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин.
3. Проверка и настройка SMTP для надежной отправки писем
Если письма не уходят из-за проблем с сервером, установите и настройте плагин SMTP, например WP SMTP или WP Mail SMTP. Это позволит отправлять письма через внешний SMTP-сервер (Gmail, Яндекс, Mail.ru и т.п.) с аутентификацией.
4. Очистка кеша и проверка конфликтов
После внесения изменений обязательно очистите кеш всех плагинов и CDN. Также временно отключите плагины кеширования и оптимизации для проверки отправки писем.
Как проверить, что проблема решена
- Создайте тестовый заказ и измените его статус на тот, при котором должно отправляться письмо.
- Проверьте логи WP Mail Logging или аналогичного плагина — должно быть событие отправки письма.
- Убедитесь, что на почтовом ящике клиента появилось письмо (проверьте спам).
- Если письмо не пришло, попробуйте вручную вызвать функцию отправки письма из консоли или через хук и проверьте ошибки.
Частые ошибки и как их исправить
- Письма не отправляются при кастомных статусах: не добавлен хук для вызова email, исправляется добавлением кода с
add_action('woocommerce_order_status_{custom-status}', ...). - Письма попадают в спам: отсутствует SPF/DKIM/DMARC для домена, настройте их на стороне почтового провайдера.
- Конфликт плагинов SMTP: два плагина SMTP одновременно могут блокировать отправку, отключите один.
- Кеширование страниц и ajax-запросов мешает отправке: исключите страницы оформления заказа из кеша.
Практические советы по безопасности и производительности
- Не храните SMTP пароли в открытом виде — используйте константы в
wp-config.phpили защищенные переменные окружения. - Регулярно обновляйте WooCommerce и плагины SMTP, чтобы избежать уязвимостей.
- Для массовой отправки писем используйте сторонние сервисы (SendGrid, Mailgun), чтобы избежать блокировок.
- Ограничьте количество вызовов функции отправки писем в секунду, чтобы не нагружать сервер.
Сравнение способов решения проблемы
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Стандартные настройки WooCommerce | Легко настроить, работает из коробки | Не поддерживает кастомные статусы | Использовать для стандартных сценариев |
| Добавление хуков для кастомных статусов | Гибко, подходит для любых статусов | Требует навыков PHP | Рекомендуется для разработчиков |
| Настройка SMTP через плагины | Повышает надежность доставки | Добавляет сложность настройки | Использовать в любом случае |