Почему стандартное подтверждение заказа в WooCommerce не всегда подходит
WooCommerce по умолчанию отправляет несколько типов email уведомлений, включая подтверждение заказа покупателю. Однако в некоторых случаях требуется настроить автоматическую отправку кастомных писем с дополнительной информацией, изменить формат или задержку отправки. Например, отправить письмо только после полной оплаты или добавить уникальные данные из метаполей.
Диагностика: как понять, что письмо о подтверждении заказа не отправляется или отправляется некорректно
- Проверьте настройки WooCommerce > Настройки > Email: активна ли рассылка 'Новый заказ' и 'Подтверждение заказа'?
- Проверьте папку «Спам» у получателя.
- Просмотрите логи почтового сервера или используйте плагин WP Mail Logging для записи отправленных писем.
- Проверьте, нет ли конфликтов с другими плагинами, отключив их временно.
- Проверьте, не отключена ли отправка email через фильтры или кастомный код (например, remove_action на хуках WooCommerce).
Пошаговое решение: как программно отправить письмо с подтверждением заказа по email
В этом примере мы добавим отправку кастомного письма после смены статуса заказа на «завершён» (completed). Это часто требуется, если стандартное письмо не подходит или нужно добавить данные из пользовательских полей.
add_action('woocommerce_order_status_completed', 'send_custom_order_confirmation_email', 10, 1);
function send_custom_order_confirmation_email($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
// Подготовка письма
$to = $order->get_billing_email();
$subject = 'Подтверждение вашего заказа №' . $order->get_order_number();
$headers = array('Content-Type: text/html; charset=UTF-8');
// Собираем тело письма
$message = '<h2>Спасибо за ваш заказ!</h2>';
$message .= '<p>Ваш заказ №' . $order->get_order_number() . ' был успешно завершён.</p>';
$message .= '<p>Детали заказа:</p><ul>';
foreach ($order->get_items() as $item) {
$message .= '<li>' . $item->get_name() . ' x ' . $item->get_quantity() . '</li>';
}
$message .= '</ul>';
$message .= '<p>Общая сумма: ' . wc_price($order->get_total()) . '</p>';
// Отправка письма
wp_mail($to, $subject, $message, $headers);
}Объяснение кода
- Хук
woocommerce_order_status_completedсрабатывает при смене статуса на «завершён». - Функция получает ID заказа, затем объект заказа для доступа к данным.
- Подготавливается письмо с HTML форматированием.
- Письмо отправляется через стандартную функцию
wp_mail.
Проверка результата после внедрения
- Создайте тестовый заказ и переведите его в статус «завершён» вручную из админки WooCommerce.
- Проверьте, что письмо приходит на указанный email.
- Используйте WP Mail Logging для мониторинга отправленных писем.
Частые ошибки и их исправление
- Письмо не отправляется: Проверьте, не отключена ли функция wp_mail плагинами безопасности или сервером. Попробуйте установить SMTP-плагин (например, WP Mail SMTP) для надежной отправки.
- Письмо приходит в спам: Настройте DKIM, SPF и DMARC записи домена, используйте авторитетный SMTP-сервер.
- Письмо приходит без форматирования: Убедитесь, что в заголовках письма указан
Content-Type: text/html. - Данные заказа не отображаются или пустые: Проверьте, что используется правильный объект
$orderи методы для получения данных.
Практические советы по безопасности и производительности
- Не отправляйте письма с тяжелыми вложениями или большим количеством данных напрямую через
wp_mail, это может замедлить сайт. - Используйте очереди задач (например, плагин WP Cron или внешние очереди) для отправки большого количества писем.
- Фильтруйте и валидируйте все данные до отправки, чтобы избежать инъекций или ошибок.
- Ограничьте отправку писем только при необходимых статусах, чтобы не создавать нагрузку.
Сравнение вариантов реализации отправки email в WooCommerce
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Стандартные email WooCommerce | Использование встроенных шаблонов и настроек в админке | Простота, поддержка | Ограниченные возможности кастомизации |
| Кастомный код на хуках | Добавление собственного кода для отправки | Гибкость, полный контроль | Требует навыков программирования, поддержка |
| Плагины SMTP и кастомизации email | Использование плагинов для расширения функционала | Удобство, расширенные настройки | Дополнительная нагрузка, возможные конфликты |