Проблема: необходимость автоматической кастомизации писем WooCommerce
WooCommerce отправляет стандартные письма клиентам и администраторам, но часто требуется изменить содержимое или стиль писем программно, например, добавить динамические данные, изменить текст в зависимости от заказа или клиента. Использование плагинов не всегда удобно или достаточно гибко, поэтому полезно знать, как сделать это через код.
Диагностика: как понять, что стандартных шаблонов недостаточно
Если вы хотите:
- Автоматически подставлять дополнительные поля из заказа;
- Изменять стиль письма в зависимости от суммы заказа или статуса;
- Добавлять персонализированное приветствие;
- Изменять текст уведомлений без копирования шаблонов в тему;
— значит, стандартный функционал WooCommerce не подходит, и нужна программная замена шаблонов.
Пошаговое решение: как изменить шаблоны писем программно
1. Использование фильтра woocommerce_email_classes
Этот фильтр позволяет переписать класс письма на свой, где вы можете изменить методы вывода.
add_filter('woocommerce_email_classes', 'custom_override_woocommerce_email_classes');
function custom_override_woocommerce_email_classes( $email_classes ) {
require_once 'class-custom-email.php'; // загружаем класс
$email_classes['WC_Email_Customer_Completed_Order'] = new WC_Email_Customer_Completed_Order_Custom();
return $email_classes;
}Здесь мы переопределяем класс письма о завершённом заказе.
2. Создаём свой класс письма, наследуя стандартный
if ( ! class_exists( 'WC_Email_Customer_Completed_Order_Custom' ) ) {
class WC_Email_Customer_Completed_Order_Custom extends WC_Email_Customer_Completed_Order {
public function __construct() {
parent::__construct();
// Можно изменить свойства, например subject
$this->subject = 'Спасибо за заказ №{order_number} на нашем сайте!';
}
public function get_content_html() {
// Получаем оригинальный HTML и заменяем часть или добавляем свои данные
$original_content = parent::get_content_html();
$custom_text = '<p>Ваш заказ будет обработан в течение 24 часов.</p>';
return $original_content . $custom_text;
}
}
}3. Использование фильтров для изменения контента письма без переопределения класса
Если нужно лишь добавить или изменить текст, можно использовать фильтр woocommerce_email_order_meta или woocommerce_email_heading_{$email_id}.
add_action('woocommerce_email_order_meta', 'add_custom_text_to_email', 10, 3);
function add_custom_text_to_email($order, $sent_to_admin, $plain_text) {
if ( ! $sent_to_admin ) {
echo '<p>Спасибо, что выбрали нас!</p>';
}
}Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce;
- Измените статус заказа на соответствующий (например, "Завершён");
- Проверьте письмо на почте — должны появиться ваши изменения;
- Если изменения не отображаются, очистите кэш сайта и почтового клиента;
- Для HTML-писем проверьте исходный код письма (через «Показать оригинал» в почте).
Частые ошибки и как их исправить
- Класс письма не загружен. Убедитесь, что путь к файлу с классом правильный и файл подключается через
require_once; - Изменения не применяются. Проверьте, что фильтр
woocommerce_email_classesдобавлен в functions.php или в нужном месте и что приоритет не ниже 10; - Конфликты с другими плагинами. Отключите плагины, которые могут переопределять шаблоны писем, чтобы диагностировать;
- Письма отправляются в текстовом формате, а вы меняете HTML. Убедитесь, что меняете правильный метод (
get_content_html).
Практические советы по безопасности и производительности
- Не подключайте дополнительные файлы с классами из внешних источников, чтобы избежать вредоносного кода;
- Проверяйте, что ваши изменения не влияют на отправку писем — тестируйте на тестовом сайте;
- Избегайте тяжелых операций внутри методов генерации письма, чтобы не замедлять отправку;
- Для сложных изменений используйте дочернюю тему или собственный плагин — не редактируйте ядро WooCommerce;
- Регулярно проверяйте совместимость с обновлениями WooCommerce.
Сравнение способов изменения шаблонов писем WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Переопределение шаблонов в теме | Копирование файлов шаблонов в папку темы и правка | Простой способ, без кода | Может конфликтовать при обновлении |
Переопределение классов письма через woocommerce_email_classes | Создание своих классов писем с изменениями | Гибкость, полная кастомизация | Требует навыков PHP, сложнее в поддержке |
| Использование фильтров и хуков | Добавление или замена частей письма через хуки | Простота и безопасность | Ограничено в возможностях |