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

В 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Дополнительная зависимость и возможные конфликты

Как проверить, что решение сработало

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

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

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

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

Проверяют не тот email ID

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

Сравнивают способ доставки слишком грубо

У способа доставки может быть не только local_pickup, но и составной идентификатор с зоной доставки. Поэтому лучше проверять method_id через strpos() или смотреть данные заказа целиком, а не полагаться на одно жёсткое значение.

Ставят код не туда

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

Не учитывают сторонние плагины

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

Безопасность и производительность

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

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

Для проектов с несколькими менеджерами полезно документировать, по какому признаку отключается письмо: способ доставки, статус, метка заказа или источник создания. Иначе через пару месяцев правило будет выглядеть как случайный кусок кода без объяснения.

Когда лучше не писать код

Если задача сводится к простому отключению одного стандартного уведомления для всех заказов, достаточно настроек WooCommerce. Если же нужно гибко управлять письмами по условиям, код надёжнее и прозрачнее. В проектах, где много сопутствующих SEO- и техзадач, иногда удобнее вынести часть системных правок в набор инструментов вроде Clearfy Pro, но именно для email-логики точечный фильтр WooCommerce обычно остаётся самым чистым решением.

Главное правило здесь простое: отключайте не «письма вообще», а конкретное уведомление по конкретному признаку заказа. Тогда решение остаётся управляемым и не мешает остальной работе магазина.

Как запретить индексацию отдельных страниц в WordPress через robots.txt и meta robots
20.08.2026
Как создать собственный шорткод в WordPress
23.11.2025
WooCommerce: автоматическое изменение стоимости товаров по расписанию
27.05.2026
Автоматический импорт товаров в WooCommerce: настройка и примеры
19.03.2026
WooCommerce: автоматическое отключение товаров по запасу с помощью кода
04.08.2026