Диагностика: когда нужны собственные email WooCommerce
WooCommerce предоставляет стандартный набор email уведомлений (заказы, отмены, возвраты и т.д.). Но часто требуется отправлять собственные письма при специфических событиях, например, при изменении статуса заказа нестандартным способом или дополнительной валидации. Простое добавление wp_mail в хуки может привести к пропуску стилизации или карательных условий WooCommerce. Поэтому нужно использовать внутренний механизм email системы WooCommerce.
Пошаговое решение: как добавить свое письмо в WooCommerce Email
1. Создайте класс письма, наследуемый от WC_Email
В вашем плагине или functions.php добавьте класс, который расширит базовый класс WC_Email. В нем опишите заголовок, тему, содержимое письма и условия отправки.
if ( ! class_exists( 'WC_Custom_Email' ) ) { class WC_Custom_Email extends WC_Email { public function __construct() { $this->id = 'custom_email'; $this->title = 'Custom Email'; $this->description = 'Отправляет письмо при специальном событии'; $this->heading = 'Ваш заказ обработан'; $this->subject = 'Информация о заказе #{order_number}'; $this->template_html = 'emails/custom-email.php'; $this->template_plain = 'emails/plain/custom-email.php'; $this->template_base = plugin_dir_path( __FILE__ ) . 'templates/'; // Подключаемся к событию, например, смена статуса заказа add_action( 'woocommerce_order_status_completed_notification', array( $this, 'trigger' ), 10, 1 ); parent::__construct(); $this->recipient = ''; } public function trigger( $order_id ) { if ( ! $order_id ) { return; } $this->object = wc_get_order( $order_id ); if ( ! $this->is_enabled() || ! $this->get_recipient() ) { return; } $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() ); } public function get_content_html() { return wc_get_template_html( $this->template_html, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => false, 'plain_text' => false, 'email' => $this ) ); } public function get_content_plain() { return wc_get_template_html( $this->template_plain, array( 'order' => $this->object, 'email_heading' => $this->get_heading(), 'sent_to_admin' => false, 'plain_text' => true, 'email' => $this ) ); } }2. Зарегистрируйте email класс в WooCommerce
Добавьте фильтр, который добавит ваш класс в список доступных email уведомлений WooCommerce.
add_filter( 'woocommerce_email_classes', 'add_custom_woocommerce_email' ); function add_custom_woocommerce_email( $emails ) { $emails['WC_Custom_Email'] = new WC_Custom_Email(); return $emails; }3. Создайте шаблоны email
Создайте HTML и plain текст шаблоны письма в каталоге templates/emails/custom-email.php и templates/emails/plain/custom-email.php. Можно использовать стандартные шаблоны WooCommerce в качестве примера.
Как проверить, что письмо отправляется
- Переключите статус заказа на тот, который триггерит отправку (например,
completed). - Проверьте, что в админке WooCommerce в разделе Email есть новое письмо и оно включено.
- Логируйте отправку с помощью
error_log('Custom email triggered for order '.$order_id);внутри методаtrigger. - Используйте дебаг SMTP плагина или тестовый почтовый сервис для мониторинга реальной отправки.
Частые ошибки и их исправление
- Письмо не отображается в списке email WooCommerce. Проверьте правильность регистрации класса и фильтра
woocommerce_email_classes. - Письмо не отправляется при смене статуса. Убедитесь, что хук
woocommerce_order_status_completed_notificationвыбран правильно и есть передача параметров. - Письмо приходит без стилизации. Проверьте, что шаблоны писем лежат в правильном каталоге и используются функции
wc_get_template_html. - Письмо отправляется многократно. Проверьте, что метод
triggerне вызывается несколько раз и добавьте логи для отладки.
Практические советы по производительности и безопасности
- Избегайте тяжелых операций в методе
trigger. В случае необходимости используйте WP-Cron для отложенной отправки. - Используйте nonce и проверку прав доступа, если триггерите письма на основе действий пользователей.
- Логируйте ошибки отправки, чтобы своевременно реагировать на проблемы с SMTP.
- Не используйте
wp_mailнапрямую для писем WooCommerce — это нарушит единый стиль и логику уведомлений.
Сравнение способов отправки писем в WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Использование WC_Email | Интеграция с WooCommerce, стили, шаблоны, настройки в админке | Сложнее в реализации, требует создания классов и шаблонов |
| Прямой вызов wp_mail | Просто быстро сделать | Нет стилизации, нарушается логика WooCommerce, нет управления в админке |