В WooCommerce часто нужно не отключить письма целиком, а убрать уведомления только для части заказов: тестовые покупки, внутренние заказы менеджеров, самовывоз без уведомления клиенту, служебные заказы из CRM. Если выключить email-настройки в админке, пострадают все сценарии сразу. Надёжнее отфильтровать отправку на уровне кода и привязать решение к конкретному заказу.
Когда это действительно нужно
Типичный кейс выглядит так: заказ создаётся, но письмо о новом заказе не должно уходить администратору; либо клиенту не нужно письмо о статусе, потому что уведомление уже отправляет внешняя система. Ещё один частый сценарий — тестовые заказы на staging или заказы с определённым способом оплаты, например bacs или cod, где уведомление должно работать по-другому.
Если задача звучит как «отключить все письма WooCommerce», это проще сделать в настройках уведомлений. Но если нужен контроль по условиям, без фильтра не обойтись.
Диагностика: что именно отправляется и почему
Сначала проверьте, какое письмо нужно подавить. В WooCommerce есть отдельные типы уведомлений: новый заказ, отменённый заказ, неудавшийся заказ, заказ в обработке, завершённый заказ и письма для клиентов. Ошибка в диагностике обычно приводит к тому, что отключают не тот шаблон и потом ищут проблему в SMTP или хостинге.
Что проверить перед правкой кода
- какой статус получает заказ после оформления;
- какой email-адрес указан в настройках WooCommerce;
- не отправляет ли письма сторонний плагин уведомлений;
- не дублируется ли отправка через SMTP-плагин или CRM-интеграцию;
- есть ли у заказа признак, по которому можно надёжно определить исключение.
Если письмо уходит не из WooCommerce, а из внешнего сервиса, фильтр ниже не поможет. Тогда надо отключать отправку на стороне интеграции.
Пошаговое решение через фильтр WooCommerce
Самый безопасный способ — не трогать глобальные настройки, а перехватить отправку для конкретного заказа через фильтр woocommerce_email_enabled_{$email_id}. Он позволяет включать или выключать конкретное уведомление в зависимости от заказа.
Ниже пример: отключаем письмо о новом заказе администратору, если у заказа выбран способ доставки самовывозом local_pickup.
<?php
add_filter( 'woocommerce_email_enabled_new_order', 'wpmart_disable_new_order_email_for_local_pickup', 10, 2 );
function wpmart_disable_new_order_email_for_local_pickup( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
$shipping_methods = $order->get_shipping_methods();
foreach ( $shipping_methods as $shipping_item ) {
if ( strpos( $shipping_item->get_method_id(), 'local_pickup' ) !== false ) {
return false;
}
}
return $enabled;
}Этот вариант удобен тем, что не ломает остальные письма. Клиентские уведомления и письма по другим заказам продолжают работать.
Если нужно отключать письмо по метке заказа
Иногда удобнее помечать заказ вручную или автоматически, а потом проверять мета-поле. Это полезно, если решение зависит не от доставки, а от внутреннего процесса.
<?php
add_filter( 'woocommerce_email_enabled_new_order', 'wpmart_disable_email_for_flagged_orders', 10, 2 );
function wpmart_disable_email_for_flagged_orders( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
$skip_email = $order->get_meta( '_skip_new_order_email' );
if ( $skip_email === 'yes' ) {
return false;
}
return $enabled;
}Тогда в коде оформления или в админке можно проставлять метку _skip_new_order_email для нужных заказов. Это уже точечное управление, а не грубое отключение.
Сравнение подходов
| Способ | Когда подходит | Минусы |
|---|---|---|
| Настройки WooCommerce | Нужно отключить письмо для всех заказов | Нет точечного контроля |
Фильтр woocommerce_email_enabled_... | Нужно отключать уведомление по условиям | Требуется код и тестирование |
| Сторонний плагин уведомлений | Письма управляются не WooCommerce | Дополнительная зависимость и возможные конфликты |
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой в админке. Нужно убедиться, что письмо действительно не формируется и не уходит через очередь отправки.
- Создайте тестовый заказ с условием, на которое завязан фильтр.
- Проверьте, что заказ сохранился в админке с нужным статусом.
- Посмотрите почту администратора и клиента: письмо должно отсутствовать только там, где вы его отключили.
- Если используете SMTP-плагин, откройте журнал отправки и убедитесь, что письмо не попало в очередь.
- Повторите тест на другом способе доставки или с другим флагом заказа, чтобы убедиться, что логика не слишком широкая.
Если письмо всё равно уходит, значит фильтр не срабатывает для нужного email_id или отправка идёт из другого источника.
Частые ошибки и как их исправить
Проверяют не тот email ID
В WooCommerce у каждого уведомления свой идентификатор. Если вы повесили фильтр на new_order, а письмо уходит как клиентское уведомление о статусе, результат будет нулевой. Сначала определите, какой именно шаблон отправляется.
Сравнивают способ доставки слишком грубо
У способа доставки может быть не только local_pickup, но и составной идентификатор с зоной доставки. Поэтому лучше проверять method_id через strpos() или смотреть данные заказа целиком, а не полагаться на одно жёсткое значение.
Ставят код не туда
Если вставить код в тему, а потом обновить её, решение пропадёт. Для стабильной работы используйте дочернюю тему, мини-плагин или mu-plugin. Для точечных бизнес-правил это практичнее, чем правка шаблонов.
Не учитывают сторонние плагины
Если письма отправляет CRM, модуль доставки или плагин уведомлений, фильтр WooCommerce может не влиять на отправку. В таком случае нужно искать собственный хук или настройку у конкретного расширения.
Безопасность и производительность
Сам фильтр лёгкий, но логика внутри него должна быть предсказуемой. Не делайте внутри проверки тяжёлые запросы к базе без необходимости. Если условие можно хранить в мета-поле заказа, используйте его. Это проще отлаживать и дешевле по ресурсам.
Если вы тестируете решение на боевом сайте, сначала включите логирование почты через SMTP-плагин или временно направьте уведомления на внутренний адрес. Так вы не потеряете важные письма из-за ошибки в условии.
Для проектов с несколькими менеджерами полезно документировать, по какому признаку отключается письмо: способ доставки, статус, метка заказа или источник создания. Иначе через пару месяцев правило будет выглядеть как случайный кусок кода без объяснения.
Когда лучше не писать код
Если задача сводится к простому отключению одного стандартного уведомления для всех заказов, достаточно настроек WooCommerce. Если же нужно гибко управлять письмами по условиям, код надёжнее и прозрачнее. В проектах, где много сопутствующих SEO- и техзадач, иногда удобнее вынести часть системных правок в набор инструментов вроде Clearfy Pro, но именно для email-логики точечный фильтр WooCommerce обычно остаётся самым чистым решением.
Главное правило здесь простое: отключайте не «письма вообще», а конкретное уведомление по конкретному признаку заказа. Тогда решение остаётся управляемым и не мешает остальной работе магазина.