На staging-сайте чаще всего мешает не сама почта WordPress, а конкретная форма: Contact Form 7, WPForms, Fluent Forms, Gravity Forms или кастомная форма. Проблема выглядит одинаково: тестовый сайт уходит в боевой SMTP, а менеджеры получают мусорные заявки, хотя это всего лишь копия сайта для проверки верстки и логики.
Ниже разберём рабочий сценарий: как отключить отправку именно из формы контактов, не трогая системные письма WordPress и WooCommerce, если они нужны для тестов.
Когда это действительно нужно
Отключение полезно, если staging доступен по публичному домену, а форма уже подключена к реальному SMTP или внешнему сервису рассылки. В таком случае любое тестовое отправление может улететь клиенту, в CRM или в общий ящик поддержки. Если на staging вы проверяете только интерфейс и валидацию, письма лучше глушить на уровне формы, а не глобально через фильтры почты.
Диагностика: откуда именно уходит письмо
Сначала нужно понять, кто отправляет письмо. В WordPress это может быть:
- сама форма контактов через свой обработчик;
- плагин SMTP, который перехватывает
wp_mail(); - кастомный код в теме или плагине;
- автоматизация через webhook или интеграцию с CRM.
Проверка простая: отправьте тестовую заявку и посмотрите, что происходит в логах SMTP-плагина, в почтовом ящике и в консоли браузера. Если письмо не уходит вообще, но форма показывает успех, значит отправку уже перехватили на уровне формы. Если письмо уходит, значит нужен фильтр именно для конкретного плагина.
Что проверить перед правкой кода
- какой плагин формы установлен;
- есть ли SMTP-плагин и включён ли лог;
- используется ли отдельный адрес staging-домена;
- есть ли кастомные хуки в
functions.phpили mu-plugin.
Способ 1: отключить отправку в Contact Form 7 только на staging
У Contact Form 7 есть фильтр wpcf7_skip_mail. Он позволяет пропустить отправку письма, но оставить саму отправку формы и валидацию. Это удобно, если нужно тестировать фронтенд, а не почтовую доставку.
<?php
add_filter( 'wpcf7_skip_mail', function( $skip, $contact_form ) {
if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'staging' ) {
return true;
}
return $skip;
}, 10, 2 );Если у вас staging не помечен через WP_ENVIRONMENT_TYPE, можно привязаться к домену:
<?php
add_filter( 'wpcf7_skip_mail', function( $skip ) {
$host = wp_parse_url( home_url(), PHP_URL_HOST );
if ( $host && str_contains( $host, 'staging.' ) ) {
return true;
}
return $skip;
} );Такой вариант лучше держать в отдельном mu-plugin, а не в теме. Тогда он не потеряется при обновлении шаблона.
Способ 2: для WPForms и похожих форм — блокировать отправку через хук плагина
У разных форм свои хуки, и здесь важно не пытаться лечить всё через wp_mail. Для WPForms можно использовать фильтр wpforms_process_before_mail, чтобы остановить отправку до передачи в почтовую систему.
<?php
add_action( 'wpforms_process_before_mail', function( $fields, $entry, $form_data ) {
if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'staging' ) {
wpforms()->process->errors[ $form_data['id'] ]['header'] = 'Отправка отключена на staging';
}
}, 10, 3 );На практике у WPForms чаще используют условия на уровне формы: отдельный email получателя для staging или отключение уведомлений в настройках конкретной формы. Это проще сопровождать, если у вас несколько форм и не хочется писать код.
Способ 3: заглушить только конкретный адрес получателя
Если форма должна работать, но письма не должны уходить наружу, можно подменить адрес получателя на локальный ящик или тестовый сервис. Это полезно, когда нужно проверить шаблон письма и вложения.
<?php
add_filter( 'wp_mail', function( $args ) {
if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE === 'staging' ) {
$args['to'] = 'dev-null@example.test';
}
return $args;
} );Но этот подход грубее. Он влияет на все письма, которые проходят через wp_mail(), включая уведомления о новых пользователях, сброс пароля и системные сообщения. Используйте его только если понимаете последствия.
Сравнение подходов
| Подход | Что отключает | Плюс | Минус |
|---|---|---|---|
| Фильтр плагина формы | Только письма конкретной формы | Точный контроль | Нужно знать хук плагина |
| Подмена получателя | Почти все письма через wp_mail() | Быстро внедряется | Легко задеть лишние уведомления |
| Настройки формы | Только уведомления формы | Без кода | Не всегда удобно для нескольких сред |
Пошаговое решение без лишнего риска
- Определите, какой плагин формы используется.
- Проверьте, есть ли у него отдельные настройки уведомлений для staging.
- Если есть фильтр плагина, отключайте отправку именно им.
- Если фильтра нет, используйте условие по
WP_ENVIRONMENT_TYPEили домену. - Вынесите код в mu-plugin, а не в тему.
- Сохраните тестовую заявку и проверьте, что форма отвечает без реального письма.
Проверка результата после внедрения
После правки важно проверить не только то, что письмо не пришло, но и что сама форма не сломалась. Нужны три проверки:
- форма отправляется без ошибок на странице;
- в логах SMTP нет исходящего письма от этой формы;
- другие уведомления сайта продолжают работать, если вы их не отключали.
Если у вас включён лог почты, сделайте тестовую отправку и убедитесь, что запись либо отсутствует, либо указывает на тестовый адрес. Если письмо всё равно уходит, значит форма отправляет его не через тот хук, который вы перехватываете.
Частые ошибки и как их исправить
Код добавили в тему, а после обновления он пропал
Для staging-ограничений лучше использовать mu-plugin или отдельный мини-плагин. Это стабильнее, чем править functions.php.
Отключили все письма через wp_mail и сломали сброс пароля
Такое бывает, если фильтр слишком общий. Сужайте область действия: проверяйте конкретный плагин формы, домен или тип уведомления.
Форма пишет «успешно отправлено», но письмо всё равно приходит
Значит, отправка идёт не через тот слой. У некоторых форм есть собственные интеграции с SMTP или CRM, которые не зависят от стандартного wp_mail().
На staging и production одинаковый SMTP
Это частая причина случайных отправок. Разведите окружения: на staging используйте отдельные настройки, тестовый домен получателя или отключение уведомлений в самом плагине.
Практические советы по безопасности и сопровождению
Если staging открыт в интернете, не полагайтесь только на отключение почты. Ограничьте доступ по Basic Auth, IP или хотя бы закройте индексацию. Иначе тестовые формы могут стать источником мусора для реальных адресатов, даже если вы один раз всё настроили правильно.
Для командной работы полезно хранить правило отключения в репозитории: тогда на всех копиях сайта поведение будет одинаковым. Если нужен более широкий набор чисток для staging — например, убрать дубли, отключить лишние блоки и сервисные скрипты, — можно посмотреть на Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но для почты всё равно лучше иметь точечное правило, а не надеяться на общий переключатель.
Если после внедрения у вас остались сомнения, проверьте один и тот же сценарий в двух средах: на staging письмо не должно уходить наружу, а на production должно отправляться как раньше. Именно это и есть нормальный критерий, а не просто отсутствие ошибок на странице.