Диагностика проблемы: почему стандартные письма WooCommerce не всегда подходят
WooCommerce по умолчанию отправляет набор стандартных писем на разные этапы жизненного цикла заказа. Однако часто возникает задача отправить письмо с дополнительной информацией или с кастомным дизайном, отличным от стандартных шаблонов. Если вы пытаетесь добавить такое письмо вручную через плагины или сторонние сервисы, это может привести к ошибкам синхронизации и потере данных.
Пошаговое решение: создание и отправка кастомного письма после оформления заказа
1. Создаём класс кастомного письма
Для начала нужно создать собственный класс письма, который будет наследовать WC_Email. В этом классе прописываем логику формирования письма и шаблон.
if ( ! class_exists( 'WC_Custom_New_Order_Email' ) ) {
class WC_Custom_New_Order_Email extends WC_Email {
public function __construct() {
$this->id = 'custom_new_order';
$this->title = 'Custom New Order';
$this->description = 'Письмо, отправляемое после оформления заказа с дополнительной информацией';
$this->heading = 'Спасибо за ваш заказ!';
$this->subject = 'Ваш заказ получен и обрабатывается';
$this->template_html = 'emails/custom-new-order.php';
$this->template_plain = 'emails/plain/custom-new-order.php';
// Инициализация
parent::__construct();
// Отправка письма после оформления заказа
add_action('woocommerce_order_status_processing_notification', array($this, 'trigger'), 10, 2);
}
public function trigger( $order_id, $order = false ) {
if ( $order_id && ! $order ) {
$order = wc_get_order( $order_id );
}
if ( ! $order ) {
return;
}
$this->object = $order;
$this->recipient = $this->object->get_billing_email();
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. Регистрируем новое письмо в WooCommerce
Чтобы WooCommerce знал о новом типе письма, добавляем его в список доступных писем через фильтр woocommerce_email_classes:
add_filter( 'woocommerce_email_classes', 'register_custom_new_order_email' );
function register_custom_new_order_email( $emails ) {
require_once 'path/to/class-wc-custom-new-order-email.php'; // путь к вашему классу
$emails['WC_Custom_New_Order_Email'] = new WC_Custom_New_Order_Email();
return $emails;
}3. Добавляем шаблон письма
Создайте в вашей теме или дочерней теме папку woocommerce/emails/ и разместите там файл custom-new-order.php с HTML-шаблоном. Например:
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<h1><?php echo esc_html( $email_heading ); ?></h1>
<p>Здравствуйте, <?php echo esc_html( $order->get_billing_first_name() ); ?>!</p>
<p>Спасибо за ваш заказ №<?php echo esc_html( $order->get_order_number() ); ?>. Мы уже начали его обработку.</p>
<p>Дополнительная информация: <?php echo 'Ваш купон: ' . esc_html( $order->get_coupon_codes()[0] ?? 'нет' ); ?></p>
<?php do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email ); ?>
<?php do_action( 'woocommerce_email_footer', $email ); ?>Проверка результата после внедрения
- Создайте тестовый заказ и переведите его в статус
processing. - Проверьте, что письмо с вашим кастомным шаблоном пришло на email покупателя.
- В админке WooCommerce в разделе «Статусы заказов» убедитесь, что письмо отображается в списке доступных к отправке вручную.
- Логируйте отправку письма, если нужно, добавив
error_log('Custom email sent to ' . $this->recipient);в методtrigger.
Частые ошибки и как их исправить
- Письмо не отправляется: Проверьте, что класс письма зарегистрирован правильно и подключён файл с классом.
Проверьте, что email включён в настройках WooCommerce (Emails → Custom New Order → Enable). - Письмо приходит пустым или с ошибками: Убедитесь, что шаблоны писем лежат в правильной папке и содержат корректный PHP-код.
Проверьте, что переменная$orderпередаётся в шаблон. - Письмо приходит с кодами HTML в теле письма: Проверьте, что отправка письма происходит с корректными заголовками и содержимое формируется через
wc_get_template_html(). - Письмо не отображается в списке WooCommerce Email Settings: Проверьте фильтр
woocommerce_email_classes, возможно класс не подключается вовремя.
Практические советы по безопасности и производительности
- Используйте встроенные методы WooCommerce для формирования писем, чтобы избежать XSS и других уязвимостей.
- Кэшируйте результаты дорогостоящих запросов, если добавляете дополнительную информацию в письмо.
- Ограничьте отправку писем по хуку, чтобы не дублировать рассылку при обновлении статуса заказа (например, проверяйте старый статус перед отправкой).
- Не храните чувствительные данные в письмах, избегайте раскрытия персональных данных.
Сравнение вариантов реализации кастомных писем в WooCommerce
| Подход | Плюсы | Минусы | Пример |
|---|---|---|---|
| Создание собственного класса WC_Email | Максимальная гибкость, интеграция с WooCommerce UI | Требует знаний PHP и структуры WooCommerce | Код из статьи |
| Использование плагинов (например, WooCommerce Email Customizer) | Простота настройки, визуальный редактор | Меньше контроля, возможны конфликты | Плагин в репозитории WordPress |
| Использование сторонних сервисов (MailChimp, SendGrid) | Расширенная аналитика, массовые рассылки | Зависимость от внешних сервисов, сложность настройки | Интеграция через API |