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

В WooCommerce письмо о новом заказе часто уходит слишком рано: ещё до подтверждения оплаты, до ручной проверки или даже для статуса pending. В результате администратор получает шум, а команда начинает ориентироваться не на реальный платёж, а на первый технический статус заказа. Если у вас есть сценарий, где письмо нужно оставить только для processing или completed, это лучше сделать точечно, а не отключать все уведомления целиком.

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

Когда это действительно нужно

Типичный кейс: магазин принимает оплату через несколько шлюзов, часть из них переводит заказ в pending или on-hold, а письмо «Новый заказ» уходит сразу в админку. В итоге:

  • менеджер начинает обрабатывать заказ до подтверждения оплаты;
  • в почте копятся уведомления по заказам, которые ещё не оплачены;
  • сложно отделить реальные заказы от технических переходов статусов;
  • при ручной обработке появляются дублирующие действия.

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

Диагностика: какое письмо вы хотите отключить

В WooCommerce есть несколько разных уведомлений, и их часто путают. Письмо о новом заказе для администратора — это не то же самое, что письмо клиенту о смене статуса. Сначала проверьте, какое именно уведомление приходит:

  • New order — письмо администратору о новом заказе;
  • Processing order — письмо клиенту после начала обработки;
  • Completed order — письмо клиенту после завершения;
  • уведомления от платёжного шлюза — они вообще могут быть вне WooCommerce.

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

Решение через фильтр отправки письма

Для уведомления администратора о новом заказе удобно использовать фильтр woocommerce_email_enabled_new_order. Он позволяет вернуть false для конкретных статусов заказа и тем самым не отправлять письмо.

Ниже пример: письмо не уйдёт, если заказ ещё не оплачен и находится в статусе pending или on-hold. Для остальных статусов уведомление останется включённым.

add_filter( 'woocommerce_email_enabled_new_order', function( $enabled, $order ) {
    if ( ! $enabled || ! $order instanceof WC_Order ) {
        return $enabled;
    }

    $blocked_statuses = array( 'pending', 'on-hold' );

    if ( in_array( $order->get_status(), $blocked_statuses, true ) ) {
        return false;
    }

    return $enabled;
}, 10, 2 );

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

Если нужно отключить письмо только для одного статуса

Иногда достаточно убрать уведомление только для pending, а для on-hold оставить. Тогда список можно сократить:

add_filter( 'woocommerce_email_enabled_new_order', function( $enabled, $order ) {
    if ( ! $enabled || ! $order instanceof WC_Order ) {
        return $enabled;
    }

    return $order->get_status() === 'pending' ? false : $enabled;
}, 10, 2 );

Логика простая: если статус заказа совпал с условием, WooCommerce не отправляет письмо администратору. Остальные уведомления продолжают работать как обычно.

Альтернативы: плагин, код или настройка

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

ПодходКогда подходитМинус
Настройки WooCommerceНужно выключить письмо полностьюНет условий по статусам
Код через фильтрНужно отключить письмо выборочноТребует аккуратного размещения кода
Плагин для email-уведомленийМного нестандартных правил и ролейДополнительная зависимость и риск конфликтов

Если у вас уже стоит плагин для чистки и оптимизации сайта, например Clearfy Pro, проверьте, не дублирует ли он часть email-настроек. Но саму логику отправки письма о новом заказе лучше держать в одном месте, чтобы не искать причину по нескольким интерфейсам.

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

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

  1. Создайте тестовый заказ на витрине или через админку.
  2. Переведите его в статус, который должен блокировать письмо, например pending.
  3. Проверьте почту администратора и папку спама.
  4. Откройте WooCommerce → Статус → Журналы, если ваш почтовый плагин или SMTP-сервис пишет логи.
  5. Повторите тест для статуса, который должен отправлять письмо, например processing.

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

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

Код добавили не туда

Самая частая причина — вставка в файл темы, который потом перезаписывается обновлением или не загружается на нужном сайте. Для постоянной настройки используйте дочернюю тему или mu-plugin.

Путают статус заказа и статус оплаты

В WooCommerce статус pending не всегда означает одну и ту же бизнес-логику. У разных платёжных шлюзов переходы статусов могут отличаться. Перед блокировкой письма проверьте, какой статус реально получает заказ после оплаты.

Отключают не то уведомление

Если письмо приходит клиенту, а вы меняете фильтр для админа, эффект будет нулевой. Для клиентских писем нужны другие фильтры, например для customer_processing_order или customer_completed_order.

Ставят слишком общий фильтр

Если вернуть false без проверки статуса, письмо перестанет уходить всегда. Это удобно только тогда, когда вы действительно хотите полностью отключить уведомление.

Что учесть по безопасности и производительности

Сам фильтр лёгкий и на производительность почти не влияет. Но есть два практических момента:

  • не храните такую логику в случайных сниппетах без контроля версий;
  • если магазин критичен к уведомлениям, тестируйте изменения на staging-копии, а не сразу на боевом сайте.

Для магазинов с высокой нагрузкой полезно ещё и централизовать отправку почты через SMTP-сервис, чтобы понимать, где письмо было сформировано, а где потеряно по дороге. Иначе можно ошибочно списать проблему на WooCommerce, хотя сбой был на стороне почтового сервера.

Если нужно расширить логику дальше

Иногда одного статуса недостаточно. Например, письмо надо отключать для заказов с самовывозом, для определённого способа оплаты или для заказов из тестового региона. В таком случае фильтр можно доработать, проверяя не только статус, но и метаданные заказа:

add_filter( 'woocommerce_email_enabled_new_order', function( $enabled, $order ) {
    if ( ! $enabled || ! $order instanceof WC_Order ) {
        return $enabled;
    }

    if ( $order->get_status() === 'pending' ) {
        return false;
    }

    if ( $order->get_payment_method() === 'cod' ) {
        return false;
    }

    return $enabled;
}, 10, 2 );

Такой вариант уже ближе к реальной эксплуатации: вы управляете не только статусом, но и бизнес-правилами магазина. Главное — не смешивать в одном фильтре слишком много условий без комментариев. Через месяц это будет трудно сопровождать.

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

Уроки со скриншотами, подробные руководства