В WooCommerce письма о смене статуса заказа часто начинают мешать не после запуска магазина, а позже: менеджеры получают дубли, клиентам уходит лишняя коммуникация, а автоматические статусы из CRM или службы доставки провоцируют цепочку уведомлений. Если задача не в том, чтобы полностью отключить email-рассылку магазина, а убрать только письма на конкретных переходах статуса, это лучше решать точечно.
Ниже разберём, как понять, какое письмо срабатывает, где его отключить без лишних побочных эффектов и как проверить, что после правки WooCommerce больше не отправляет уведомления на нужном переходе.
Когда это действительно нужно
Типичный сценарий: заказ переводится из processing в completed автоматически после выгрузки трека, и клиент получает письмо, которое ему не нужно. Или менеджер вручную меняет статус несколько раз в процессе обработки, а в почту падают уведомления на каждый шаг. Иногда проблема появляется после подключения интеграции с 1С, МойСклад, CRM или сервисом доставки: статус меняется программно, а WooCommerce считает это полноценным событием для отправки email.
Важно не путать два разных случая:
- отключить конкретный шаблон письма WooCommerce;
- запретить отправку письма только при определённом переходе статуса.
Первый вариант проще, но грубее. Второй — обычно правильнее, если магазин должен продолжать отправлять остальные уведомления.
Диагностика: какое письмо и на каком переходе срабатывает
Перед правкой кода стоит зафиксировать, что именно отправляется. В WooCommerce письма завязаны на события заказа, а не только на статус как таковой. Один и тот же переход может запускать несколько действий, если его обрабатывают плагины или кастомный код.
Что проверить в админке
- WooCommerce → Настройки → Email — включён ли нужный шаблон письма.
- Статус заказа — какой именно переход вызывает уведомление.
- Плагины интеграций — не меняют ли они статус повторно после синхронизации.
- Журналы почты — если стоит плагин для логирования писем, посмотрите, кто инициировал отправку.
Если письма приходят только при одном статусе, а при остальных нет, значит, задача локальная. Если уведомления дублируются на нескольких этапах, сначала ищите повторные изменения статуса или сторонний код, который вызывает отправку вручную.
Как отключить письмо через настройки WooCommerce
Если нужно убрать уведомление полностью, проще всего отключить его в списке email-уведомлений WooCommerce. Это подходит, когда письмо не нужно ни клиенту, ни администратору.
- Откройте WooCommerce → Настройки → Email.
- Найдите нужное уведомление, например Заказ в обработке или Заказ выполнен.
- Откройте его и снимите флажок Включить это уведомление.
- Сохраните изменения.
Минус этого способа очевиден: письмо перестанет уходить во всех случаях, а не только на одном переходе статуса. Если у вас есть ручная обработка заказов и автоматические статусы, этого может быть недостаточно.
Точечное отключение письма через код
Если письмо нужно убрать только при конкретном переходе, удобнее перехватить отправку на уровне фильтра. У WooCommerce есть фильтры для email-уведомлений, и это надёжнее, чем пытаться отключать шаблон целиком.
Ниже пример: отключаем письмо клиенту о заказе в обработке, если статус меняется с on-hold на processing по нашему условию. Логику можно адаптировать под свой сценарий.
<?php
add_filter( 'woocommerce_email_enabled_customer_processing_order', 'wpeditor_disable_processing_email_for_specific_transition', 10, 2 );
function wpeditor_disable_processing_email_for_specific_transition( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
// Пример: отключаем письмо только для заказов из определённого способа оплаты.
// Замените условие на своё: метка доставки, источник заказа, роль менеджера и т.д.
if ( 'cod' === $order->get_payment_method() ) {
return false;
}
return $enabled;
}Этот вариант отключает email по условию на заказ. Если вам нужно реагировать именно на переход статуса, а не на свойства заказа, лучше использовать хук смены статуса и временно отключать отправку письма для конкретного сценария.
<?php
add_action( 'woocommerce_order_status_changed', 'wpeditor_mark_order_to_skip_email', 10, 4 );
function wpeditor_mark_order_to_skip_email( $order_id, $old_status, $new_status, $order ) {
if ( 'processing' === $new_status && 'on-hold' === $old_status ) {
update_post_meta( $order_id, '_wpeditor_skip_processing_email', 'yes' );
}
}
add_filter( 'woocommerce_email_enabled_customer_processing_order', 'wpeditor_skip_processing_email_if_marked', 10, 2 );
function wpeditor_skip_processing_email_if_marked( $enabled, $order ) {
if ( ! $order instanceof WC_Order ) {
return $enabled;
}
if ( 'yes' === get_post_meta( $order->get_id(), '_wpeditor_skip_processing_email', true ) ) {
delete_post_meta( $order->get_id(), '_wpeditor_skip_processing_email' );
return false;
}
return $enabled;
}Такой подход полезен, когда письмо нужно отключать только на одном конкретном переходе, а в остальных случаях оставить стандартное поведение WooCommerce.
Сравнение подходов
| Подход | Когда подходит | Минус |
|---|---|---|
| Отключить email в настройках | Письмо не нужно вообще | Нельзя ограничить одним сценарием |
Фильтр woocommerce_email_enabled_... | Нужно точечное отключение | Требует кода и проверки условий |
| Правка стороннего интеграционного плагина | Письмо вызывает конкретная интеграция | Обновления плагина могут затереть изменения |
Пошаговое решение без лишнего риска
- Определите, какое именно письмо нужно убрать: клиентское или админское.
- Проверьте, можно ли отключить его в настройках WooCommerce без кода.
- Если нужен точечный сценарий, добавьте фильтр в
functions.phpдочерней темы или в собственный мини-плагин. - Задайте условие по статусу, способу оплаты, тегу заказа, источнику синхронизации или любому другому признаку, который реально есть в заказе.
- Сохраните код и протестируйте на копии сайта или на тестовом заказе.
Если у вас уже есть кастомный плагин для интеграции, логичнее держать эту логику там, а не в теме. Тогда при смене темы поведение не сломается.
Как проверить, что решение сработало
Проверка должна быть не визуальной, а событийной: меняете статус и смотрите, ушло ли письмо. Лучше сделать тестовый заказ с собственной почтой и пройти сценарий вручную.
- Создайте тестовый заказ с реальным email.
- Переведите его в статус, который раньше вызывал письмо.
- Проверьте входящие и папку спама.
- Если используете плагин логирования писем, убедитесь, что событие не было создано.
- Повторите смену статуса в обратную сторону, чтобы понять, не зацепили ли вы лишние уведомления.
Если письмо всё ещё приходит, значит, его отправляет не стандартный email WooCommerce, а сторонний код или плагин. В этом случае ищите не только фильтры WooCommerce, но и собственные вызовы wp_mail() или обработчики интеграции.
Частые ошибки и как их исправить
Отключили не то письмо
В WooCommerce названия уведомлений в админке не всегда совпадают с тем, что ожидает пользователь. Например, письмо Заказ в обработке может быть связано с клиентом, а администратор продолжит получать уведомления отдельно. Сначала уточните, кто именно получает письмо.
Добавили код в родительскую тему
После обновления темы правка исчезнет. Для постоянного решения используйте дочернюю тему или мини-плагин.
Сделали условие слишком широким
Если отключение завязано только на статус processing, вы можете случайно убрать письмо для всех заказов. Лучше проверять дополнительный признак: способ оплаты, метку доставки, источник заказа или мета-поле.
Не учли стороннюю интеграцию
Если статус меняется через CRM или складской модуль, письмо может отправляться не стандартным обработчиком WooCommerce, а отдельным плагином. Тогда фильтр на email не поможет, пока не найдёте источник отправки.
Безопасность и производительность
Для такой задачи не нужен тяжёлый плагин, если достаточно одного фильтра. Чем меньше кода в runtime, тем проще сопровождать магазин. Но есть несколько практических правил:
- не редактируйте ядро WooCommerce и файлы плагина вручную;
- храните кастомную логику в отдельном мини-плагине или дочерней теме;
- не отключайте все email-уведомления ради одной проблемы;
- если условие зависит от метаполей, проверяйте, что они реально существуют у заказа;
- после обновлений WooCommerce перепроверяйте сценарий на тестовом заказе.
Если в магазине много служебных уведомлений и дублирующихся писем, полезно сначала навести порядок в настройках, а уже потом писать код. В некоторых случаях хватает отключения лишних шаблонов и чистки автоматизаций, без сложной логики. Для более широкого контроля над дублями и служебными элементами сайта иногда используют Clearfy Pro, но для задачи с письмами WooCommerce это не обязательный инструмент.
Когда нужно убрать email только на одном переходе статуса, рабочая схема обычно такая: сначала выяснить источник события, затем отключить письмо через фильтр, после этого проверить реальный заказ и убедиться, что остальные уведомления не пострадали. Именно такой порядок экономит время и не ломает обработку заказов в магазине.