Как отключить отправку писем из WooCommerce на определённые статусы заказа

В 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-. Это частая причина, почему фильтр вроде бы написан правильно, но не срабатывает.

Проверка результата после внедрения

После правки не ограничивайтесь визуальной проверкой в админке. Нужно пройти весь путь заказа и убедиться, что письмо действительно не уходит.

  1. Создайте тестовый заказ в магазине.
  2. Переведите его в нужный статус вручную или через сценарий оплаты.
  3. Проверьте почтовый ящик клиента и администратора.
  4. Посмотрите, не остался ли дубль в логах SMTP-плагина.
  5. Убедитесь, что другие письма WooCommerce продолжают отправляться.

Если используете SMTP-плагин с журналом отправки, это самый быстрый способ подтвердить результат. В журнале должно быть видно, что письмо не было сформировано или не было отправлено именно для нужного статуса.

Частые ошибки и как их исправить

Отключили не тот шаблон письма

Письмо клиенту о заказе и письмо администратору — это разные сущности. Если вы выключили new_order, а ожидали убрать уведомление клиенту, результат будет не тот. Сначала сопоставьте письмо с его ID.

Фильтр добавили не туда

Код в functions.php темы работает, но при смене темы может пропасть. Для рабочих магазинов лучше вынести правку в мини-плагин или mu-plugin. Так настройка не потеряется после обновления темы.

Статус сравнивают с префиксом wc-

Внутри has_status() обычно нужен статус без префикса. Если написать wc-on-hold, условие часто не сработает. Это одна из самых незаметных ошибок.

Письмо продолжает приходить из другого источника

Если уведомление всё равно уходит, проверьте плагины доставки, оплаты и CRM. Некоторые из них отправляют собственные письма при смене статуса заказа и не зависят от стандартных настроек WooCommerce.

Как не сломать магазин при точечной настройке

Для таких правок лучше использовать дочернюю тему или отдельный мини-плагин. Это снижает риск потерять настройку после обновления. Если в магазине много заказов, не добавляйте тяжёлую логику в каждый запрос: фильтр должен быть коротким и предсказуемым.

  • не отключайте все письма ради одного статуса;
  • не правьте файлы ядра WooCommerce;
  • проверяйте логи SMTP после каждого изменения;
  • если есть staging, тестируйте сначала там;
  • держите список статусов и email ID в комментарии к коду.

Если вам нужен более широкий контроль над уведомлениями, иногда удобнее вынести часть логики в отдельный плагин управления магазином. Но даже в этом случае лучше опираться на стандартные фильтры WooCommerce, а не на переопределение шаблонов без необходимости.

Как создать собственный виджет в WordPress
23.11.2025
Как создать собственный shortcode в WordPress
19.11.2025
WooCommerce: автоматическое удаление неподтверждённых заказов
21.06.2026
WooCommerce: решение проблемы с отображением способов доставки
07.05.2026
Как создать автоматический импорт из CSV в WordPress
18.01.2026