WooCommerce: как автоматизировать отправку кастомных писем после оформления заказа

Диагностика проблемы: почему стандартные письма 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
WooCommerce: автоматическое изменение стоимости товаров при оплате
13.06.2026
Как закрыть от индексации теги, архивы и внутренний поиск в WordPress
19.08.2026
Как найти и удалить дубли страниц в WordPress без потери индексации
16.08.2026
Как успешно обновлять WooCommerce без потери данных
26.04.2026
WooCommerce: решение проблемы со сбивающимся запросом на создание заказа
10.07.2026