WooCommerce: как отключить отправку SMS при смене статуса заказа

Если в магазине 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 вообще не нужныПропадут и полезные уведомления

Пошаговое решение без поломки остальных уведомлений

  1. Определите, какой статус вызывает SMS: processing, completed, on-hold или другой.
  2. Проверьте, это код темы, mu-plugin или отдельный плагин уведомлений.
  3. Если есть настройки в плагине, отключите только ненужные статусы.
  4. Если используется код, перенесите правку в отдельный плагин или mu-plugin.
  5. Протестируйте смену статуса на тестовом заказе и убедитесь, что 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.

Как отключить корзину для виртуальных товаров в WooCommerce
12.08.2026
Исправляем ошибку возврата товаров в WooCommerce без понятия возврата
30.04.2026
WooCommerce: как изменить адрес доставки после оформления заказа
01.08.2026
Как настроить отложенный платеж в WooCommerce с помощью кода
04.06.2026
WooCommerce: как изменить имя пользователя в заказе после оформления
05.08.2026