Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Письма магазина

WooCommerce сам отправляет письма при событиях заказа: покупателю — «заказ принят» и «заказ выполнен», администратору — «новый заказ». Каждое письмо — отдельный класс со своим идентификатором, настройками и шаблоном. Тексты меняют в панели, а содержимое дополняют хуками.

Письма в панели

Список писем находится в «WooCommerce → Настройки → Email». У каждого есть кнопка «Управление»: там включают письмо, меняют тему, заголовок и дополнительный текст. Внизу страницы — общий вид: логотип, цвета, текст подвала.

ИдентификаторКомуКогда
new_orderАдминистраторуСоздан новый заказ
customer_on_hold_orderПокупателюЗаказ на удержании
customer_processing_orderПокупателюЗаказ оплачен
customer_completed_orderПокупателюЗаказ выполнен
customer_refunded_orderПокупателюВозврат
customer_noteПокупателюДобавлена заметка для покупателя
customer_new_accountПокупателюСоздана учётная запись

Где писать код

Создайте файл includes/emails.php и подключите его в acme-shop.php.

Тема письма

// wp-content/plugins/acme-shop/includes/emails.php
add_filter('woocommerce_email_subject_customer_processing_order', function (string $subject, $order): string {
    if (!$order instanceof WC_Order) {
        return $subject;
    }
 
    return sprintf('Заказ №%s принят в работу', $order->get_order_number());
}, 10, 2);

Имя фильтра — woocommerce_email_subject_ плюс идентификатор письма. Оформите заказ: письмо покупателю придёт с темой «Заказ №1024 принят в работу». Заголовок внутри письма меняют так же, фильтром woocommerce_email_heading_ с тем же идентификатором.

Добавить содержимое

// wp-content/plugins/acme-shop/includes/emails.php
add_action('woocommerce_email_before_order_table', function (WC_Order $order, bool $sentToAdmin, bool $plainText, $email) {
    if ($email->id !== 'customer_completed_order') {
        return;
    }
 
    $tracking = $order->get_meta('_acme_tracking');
 
    if ($tracking !== '') {
        echo '<p>Трек-номер посылки: <strong>' . esc_html($tracking) . '</strong></p>';
    }
}, 10, 4);

Хук срабатывает во всех письмах с таблицей заказа, поэтому функция проверяет идентификатор письма. В письме «Заказ выполнен» над таблицей товаров появится трек-номер из прошлого урока.

Хуки письма

ХукГде в письме
woocommerce_email_headerШапка
woocommerce_email_before_order_tableПеред таблицей заказа
woocommerce_email_after_order_tableПосле таблицы заказа
woocommerce_email_order_metaДополнительные сведения о заказе
woocommerce_email_customer_detailsБлок с адресами
woocommerce_email_footerПодвал

Четыре хука вокруг заказа получают одинаковые аргументы: заказ, признак письма администратору, признак текстового формата и объект письма.

Проверка без заказа

Чтобы не оформлять заказ ради каждого письма, откройте заказ в панели, в блоке «Действия по заказу» выберите «Отправить сведения о заказе клиенту» или повторную отправку нужного уведомления и нажмите кнопку со стрелкой. На локальном сервере письма удобно ловить программой Mailpit.

Подмена шаблона

Разметку письма меняют копией шаблона, как в уроке о шаблонах:

Исходный файл в woocommerce/templates/Копия в теме
emails/customer-completed-order.phpacme-child/woocommerce/emails/customer-completed-order.php
emails/email-header.phpacme-child/woocommerce/emails/email-header.php
emails/email-styles.phpacme-child/woocommerce/emails/email-styles.php

Файл email-styles.php содержит CSS всех писем. Копии писем устаревают так же, как остальные шаблоны, — следите за разделом «Шаблоны» на странице «WooCommerce → Статус».

Отключить письмо в коде

// wp-content/plugins/acme-shop/includes/emails.php
add_filter('woocommerce_email_enabled_customer_completed_order', function (bool $enabled, $order): bool {
    return $order instanceof WC_Order && $order->get_shipping_method() === '' ? false : $enabled;
}, 10, 2);

Письмо «Заказ выполнен» не уйдёт для заказов без доставки — например, с самовывозом, оформленным без способа доставки.

Частая ошибка

Письма «не приходят», и причину ищут в коде. WooCommerce передаёт письмо функции wp_mail(), а та — почтовой службе сервера, которой на хостинге часто нет или её письма попадают в спам. Настройте отправку через SMTP отдельным плагином и проверьте доставку до того, как менять шаблоны.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.