В WooCommerce уведомления по заказам часто начинают жить своей жизнью: клиенту уходит письмо на каждый переход статуса, менеджеру прилетает лишняя копия, а в некоторых сценариях письма мешают интеграции с CRM или службой доставки. Если задача не в том, чтобы отключить почту целиком, а убрать только конкретные уведомления на отдельных статусах, это лучше решать точечно — через настройки или фильтры, а не через «выключить всё и посмотреть, что сломается».
Когда проблема действительно в письмах WooCommerce
Сначала стоит понять, что именно вы хотите отключить. В WooCommerce есть несколько разных типов писем: уведомления клиенту о новом заказе, письма о смене статуса, сообщения администратору, письма о возвратах и сбросе пароля. Частая ошибка — отключать не тот шаблон и потом искать, почему менеджер перестал получать новые заказы.
Типичный сценарий
Например, магазин использует статус processing как внутренний этап проверки оплаты, а затем вручную переводит заказ в completed. В этом случае клиенту могут уходить два письма подряд, хотя бизнес-процессу достаточно одного. Или наоборот: статус on-hold нужен только для внутренней сверки, и отправлять по нему письмо клиенту не нужно.
Что проверить до правки кода
- какой именно статус вызывает лишнее письмо;
- кому оно уходит: клиенту, администратору или обоим;
- не дублирует ли уведомление плагин доставки, CRM или SMTP-расширение;
- не меняется ли статус заказов автоматически другим плагином;
- включены ли шаблоны писем в WooCommerce → Настройки → Письма.
Диагностика: как найти источник лишнего уведомления
Если письмо приходит не там, где ожидается, не начинайте с удаления кода. Сначала проверьте, какой хук срабатывает и какой шаблон используется. Для этого удобно временно включить логирование или посмотреть список активных плагинов, которые вмешиваются в заказы. Особенно часто конфликтуют плагины автоматизации, оплаты и CRM.
Если у вас есть доступ к логам, полезно проверить, не отправляет ли письмо не WooCommerce, а сторонний плагин через wp_mail(). В таком случае отключение шаблона в WooCommerce ничего не изменит.
Пошаговое решение через код
Если нужно отключить конкретное письмо, самый надёжный путь — использовать фильтр woocommerce_email_enabled_{$email_id}. Он позволяет выключить только нужный тип уведомления, не затрагивая остальные.
Ниже пример, который отключает письмо клиенту при статусе on-hold и уведомление администратору о заказе в статусе pending. Идентификаторы писем нужно подставлять по факту: они зависят от того, какое именно уведомление вы хотите убрать.
<?php
add_filter( 'woocommerce_email_enabled_customer_on_hold_order', '__return_false' );
add_filter( 'woocommerce_email_enabled_new_order', function( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
// Отключаем письмо администратору только для заказов в статусе pending.
if ( $order->has_status( 'pending' ) ) {
return false;
}
return $enabled;
}, 10, 2 );Первый фильтр здесь отключает стандартное письмо клиенту по статусу on-hold. Второй пример показывает более гибкую логику: письмо администратору остаётся включённым, но не отправляется для заказов в конкретном статусе.
Как понять правильный email ID
У WooCommerce у каждого письма есть внутренний идентификатор. Его можно увидеть в исходниках класса письма или в настройках раздела писем. Для стандартных уведомлений часто встречаются значения вроде new_order, customer_processing_order, customer_completed_order, customer_on_hold_order. Если вы работаете с кастомным статусом, проверьте, не создаёт ли его отдельный плагин собственный email-класс.
Альтернатива без кода: отключение через настройки
Если задача простая и речь идёт о стандартном письме, иногда достаточно снять галочку в настройках WooCommerce. Это безопаснее для поддержки: при обновлении темы или дочерней темы ничего не потеряется. Но этот способ не подходит, если нужно отключить письмо только при определённом статусе, а в остальных случаях оставить его активным.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройки WooCommerce | Нужно отключить письмо полностью | Нет условий по статусам |
| Фильтр в коде | Нужно точечное отключение | Требует аккуратной установки в дочернюю тему или мини-плагин |
| Сторонний плагин | Нужен интерфейс для менеджера | Риск лишней нагрузки и конфликтов |
Если статус кастомный: как отключить письмо только для него
Кастомные статусы часто добавляют плагины доставки, CRM или складского учёта. В этом случае стандартные фильтры WooCommerce могут не сработать напрямую, потому что письмо создаёт не ядро, а расширение. Тогда сначала нужно определить, какой хук использует плагин, и уже потом отключать уведомление.
Если статус зарегистрирован как wc-awaiting-pickup, а письмо отправляется через стандартную систему WooCommerce, можно ориентироваться на статус заказа:
<?php
add_filter( 'woocommerce_email_enabled_customer_processing_order', function( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
if ( $order->has_status( 'awaiting-pickup' ) ) {
return false;
}
return $enabled;
}, 10, 2 );Обратите внимание на формат статуса: в has_status() передаётся значение без префикса wc-. Это частая причина, почему фильтр вроде бы написан правильно, но не срабатывает.
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой в админке. Нужно пройти весь путь заказа и убедиться, что письмо действительно не уходит.
- Создайте тестовый заказ в магазине.
- Переведите его в нужный статус вручную или через сценарий оплаты.
- Проверьте почтовый ящик клиента и администратора.
- Посмотрите, не остался ли дубль в логах SMTP-плагина.
- Убедитесь, что другие письма WooCommerce продолжают отправляться.
Если используете SMTP-плагин с журналом отправки, это самый быстрый способ подтвердить результат. В журнале должно быть видно, что письмо не было сформировано или не было отправлено именно для нужного статуса.
Частые ошибки и как их исправить
Отключили не тот шаблон письма
Письмо клиенту о заказе и письмо администратору — это разные сущности. Если вы выключили new_order, а ожидали убрать уведомление клиенту, результат будет не тот. Сначала сопоставьте письмо с его ID.
Фильтр добавили не туда
Код в functions.php темы работает, но при смене темы может пропасть. Для рабочих магазинов лучше вынести правку в мини-плагин или mu-plugin. Так настройка не потеряется после обновления темы.
Статус сравнивают с префиксом wc-
Внутри has_status() обычно нужен статус без префикса. Если написать wc-on-hold, условие часто не сработает. Это одна из самых незаметных ошибок.
Письмо продолжает приходить из другого источника
Если уведомление всё равно уходит, проверьте плагины доставки, оплаты и CRM. Некоторые из них отправляют собственные письма при смене статуса заказа и не зависят от стандартных настроек WooCommerce.
Как не сломать магазин при точечной настройке
Для таких правок лучше использовать дочернюю тему или отдельный мини-плагин. Это снижает риск потерять настройку после обновления. Если в магазине много заказов, не добавляйте тяжёлую логику в каждый запрос: фильтр должен быть коротким и предсказуемым.
- не отключайте все письма ради одного статуса;
- не правьте файлы ядра WooCommerce;
- проверяйте логи SMTP после каждого изменения;
- если есть staging, тестируйте сначала там;
- держите список статусов и email ID в комментарии к коду.
Если вам нужен более широкий контроль над уведомлениями, иногда удобнее вынести часть логики в отдельный плагин управления магазином. Но даже в этом случае лучше опираться на стандартные фильтры WooCommerce, а не на переопределение шаблонов без необходимости.