Если в магазине WooCommerce SMS уходят на каждом переходе статуса заказа, проблема обычно не в самом WooCommerce, а в связке плагина уведомлений, интеграции с SMS-шлюзом или кастомного кода в теме. На практике нужно не «выключить всё», а точечно убрать отправку для нужных статусов и оставить остальные уведомления в работе.
Когда SMS начинают отправляться лишний раз
Типичный сценарий выглядит так: заказ создан, затем менеджер меняет статус с processing на completed или вручную переводит его в on-hold, и клиент получает SMS, хотя это не требуется. Иногда сообщение уходит даже при повторном сохранении заказа в админке. Важно сначала понять, кто именно инициирует отправку: WooCommerce, плагин доставки уведомлений или ваш собственный хук.
Что обычно вызывает проблему
- плагин SMS-уведомлений привязан к хуку
woocommerce_order_status_changed; - в теме или mu-plugin есть код на
woocommerce_order_status_processing,woocommerce_order_status_completedили похожих хуках; - уведомления дублируются из-за нескольких активных плагинов, которые слушают один и тот же переход статуса;
- SMS отправляются не при смене статуса, а при сохранении заказа через кастомный обработчик.
Диагностика: где именно срабатывает отправка
Перед изменениями проверьте, что триггер реально связан со статусом заказа. Самый быстрый способ — временно залогировать переходы статусов и посмотреть, какой хук срабатывает в момент отправки SMS.
add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log(sprintf(
'Order #%d status changed: %s -> %s',
$order_id,
$old_status,
$new_status
));
}
}, 10, 4);Если после этого в debug.log видно, что SMS уходит именно на конкретном переходе, значит нужно отключать не весь канал уведомлений, а только нужный статус или конкретный обработчик.
Если логов нет, проверьте:
- активные плагины уведомлений и интеграций с SMS;
- файлы
functions.php,mu-plugins, сниппеты в Code Snippets; - настройки самого плагина: часто там есть отдельные галочки для статусов
processing,completed,cancelledиfailed.
Как отключить SMS только для нужных статусов
Если SMS отправляет ваш код, проще всего поставить условие по статусу и выйти раньше отправки. Ниже пример для случая, когда уведомление не должно уходить при переходе в completed и on-hold.
add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) {
$disabled_statuses = array('completed', 'on-hold');
if (in_array($new_status, $disabled_statuses, true)) {
return;
}
// Здесь ваш код отправки SMS.
// Например, вызов функции интеграции с SMS-шлюзом.
}, 10, 4);Если отправка завязана на отдельный статусный хук, можно просто убрать обработчик или заменить его на более узкое условие. Например, если SMS уходят при завершении заказа, а это не нужно, отключайте именно woocommerce_order_status_completed, а не общий механизм уведомлений.
remove_action('woocommerce_order_status_completed', 'my_sms_notify_completed_order', 10);Этот вариант сработает только если вы знаете точное имя функции-обработчика. Если функция объявлена в плагине, а не в вашей теме, не редактируйте сам плагин: обновление всё перетрёт. Лучше использовать отдельный мини-плагин или mu-plugin.
Если SMS отправляет плагин уведомлений
У большинства плагинов есть собственные настройки статусов. Логика обычно такая: выбираете канал уведомления, затем отключаете ненужные события. Это безопаснее, чем править код, если плагин поддерживает нужную настройку из коробки.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройка в плагине | Есть галочки по статусам | Зависите от интерфейса плагина |
| Сниппет в теме или mu-plugin | Нужна точечная логика | Нужно знать хук и функцию |
| Отключение всего SMS-модуля | SMS вообще не нужны | Пропадут и полезные уведомления |
Пошаговое решение без поломки остальных уведомлений
- Определите, какой статус вызывает SMS:
processing,completed,on-holdили другой. - Проверьте, это код темы, mu-plugin или отдельный плагин уведомлений.
- Если есть настройки в плагине, отключите только ненужные статусы.
- Если используется код, перенесите правку в отдельный плагин или mu-plugin.
- Протестируйте смену статуса на тестовом заказе и убедитесь, что SMS не уходит.
Для собственного кода удобно сделать отдельный файл в wp-content/mu-plugins/. Тогда логика не потеряется при смене темы и не будет зависеть от редактора сниппетов.
<?php
/**
* Plugin Name: Disable selected WooCommerce SMS notifications
*/
add_action('woocommerce_order_status_changed', function ($order_id, $old_status, $new_status, $order) {
$blocked = array('completed', 'on-hold');
if (in_array($new_status, $blocked, true)) {
return;
}
// Вызов вашей функции отправки SMS.
}, 10, 4);Как проверить, что решение сработало
Проверка должна быть не «визуальной», а по факту отсутствия отправки. Сделайте тестовый заказ и последовательно переведите его в нужные статусы. После каждого перехода проверьте три вещи:
- в админке WooCommerce статус изменился корректно;
- SMS не пришла на номер клиента или менеджера;
- другие уведомления, например email, продолжают отправляться как раньше.
Если у вас включён лог отправки в плагине SMS, проверьте журнал событий. Если логов нет, временно добавьте запись в error_log рядом с кодом отправки и убедитесь, что нужная ветка больше не выполняется.
Частые ошибки и как их исправить
Отключили не тот хук
Иногда разработчик убирает woocommerce_order_status_changed, хотя SMS отправлялись через woocommerce_order_status_processing. В итоге уведомление остаётся, а часть другой логики ломается. Исправление простое: сначала найдите конкретную точку отправки, потом меняйте код.
Правят файл плагина напрямую
Это почти всегда ошибка. После обновления плагина изменения исчезнут. Если правка нужна надолго, используйте mu-plugin или собственный мини-плагин.
Отключают все уведомления целиком
Так часто делают из-за спешки: выключают SMS-модуль полностью, а потом менеджер перестаёт получать важные сообщения о новых заказах. Лучше отключать только конкретные статусы или конкретные шаблоны.
Не учитывают повторное сохранение заказа
Если код не проверяет, действительно ли статус изменился, SMS может уходить при каждом сохранении карточки заказа. В таких случаях нужно сравнивать старый и новый статус и не запускать отправку без реального перехода.
Безопасность и производительность
Любая логика уведомлений должна быть максимально простой и предсказуемой. Не делайте внешние HTTP-запросы без необходимости в момент сохранения заказа, если можно вынести отправку в очередь или хотя бы минимизировать обработку. Если SMS-шлюз отвечает медленно, админка WooCommerce тоже будет тормозить.
Ещё один практический момент: не храните ключи API в открытом виде в теме. Если интеграция с SMS-сервисом кастомная, держите секреты в конфиге сервера или хотя бы в wp-config.php, а не в публичных файлах темы.
Если в магазине много кастомных сниппетов, полезно периодически проверять, не дублируют ли они друг друга. Для этого удобно использовать инструменты очистки и аудита кода, например Clearfy Pro: он не решит проблему SMS сам по себе, но помогает убрать лишние настройки и дублирующиеся элементы, которые потом мешают диагностике. Подробности есть на странице Clearfy Pro.
Когда лучше не править код
Если SMS отправляет коммерческий плагин с нормальными настройками, сначала используйте его интерфейс. Код нужен тогда, когда:
- нужна точечная логика по статусам;
- плагин не умеет отключать отдельные события;
- отправка встроена в кастомную тему или в mu-plugin;
- нужно сохранить email-уведомления, но убрать только SMS.
В остальных случаях проще и безопаснее решить задачу настройкой, а не вмешательством в обработчики WooCommerce.