Обычная отправка уведомлений из WPForms в почту часто не решает задачу, если заявки нужно сразу видеть в рабочем канале. Но слать в Slack вообще все сабмиты — тоже плохая идея: канал быстро засоряется, а полезные сообщения теряются. В этой статье разберём рабочий сценарий: как отправлять уведомления из WPForms в Slack только для нужных форм, с проверкой условий и без лишнего шума.
Когда это действительно нужно
Сценарий типичный: на сайте несколько форм, но в Slack нужны только заявки с конкретной страницы, с определённым типом обращения или с выбранной услугой. Например, в канал поддержки должны попадать только обращения по техническим проблемам, а заявки на консультацию — в другой канал или вообще только на email.
Если у вас уже настроена интеграция через webhook, но сообщения приходят не туда, дублируются или не приходят вовсе, проблема обычно не в Slack как таковом, а в логике отправки: не тот webhook URL, неверные условия, конфликт с кэшем или ошибка в коде фильтрации.
Диагностика: что проверить до настройки
Перед тем как писать код, проверьте базовые вещи. Это экономит время, потому что половина проблем с webhook обычно не в PHP.
- Форма действительно отправляется и создаёт запись в WPForms Entries, если сохранение включено.
- Webhook URL из Slack скопирован без лишних пробелов и переносов.
- В Slack создан именно
Incoming Webhook, а не обычная ссылка на канал. - Сайт может делать исходящие HTTP-запросы: хостинг не режет
wp_remote_post(). - На сайте нет плагина безопасности, который блокирует запросы к внешним доменам.
Если сообщения не доходят, откройте логи сервера или включите временный лог в коде. Для webhook важны два признака: запрос ушёл и Slack вернул успешный ответ. Если ответа нет, ищите проблему на стороне сервера или сети. Если ответ есть, но сообщения нет, значит проблема в формате payload или в URL.
Подходы: плагин, код или гибрид
Для WPForms есть два нормальных пути: использовать штатные уведомления и отправлять дубли в Slack через код, либо строить отдельную отправку через webhook. Второй вариант гибче, если нужно условие отправки.
| Подход | Плюсы | Минусы |
|---|---|---|
| Только штатные уведомления WPForms | Просто, без кода | Нет Slack, мало контроля над условиями |
| Webhook через код | Можно фильтровать заявки, форматировать текст, отправлять в разные каналы | Нужно поддерживать код |
| Гибрид: email + Slack | Надёжнее для рабочих процессов | Больше настроек и точек отказа |
Если нужна только быстрая интеграция без логики, можно обойтись готовым webhook. Но если важны условия отправки, лучше сразу делать это в коде: так проще контролировать, какие формы и какие поля участвуют в отправке.
Пошаговая настройка отправки в Slack по условию
1. Создайте webhook в Slack
В Slack откройте настройки приложения для входящих webhook и получите URL. Его нужно хранить как секрет, а не вставлять в публичный JS или в текст страницы. Если URL утечёт, любой сможет отправлять сообщения в ваш канал.
2. Определите условие отправки
Условие должно быть простым и проверяемым. Например: отправлять только если в поле услуги выбран вариант Техническая поддержка, или если форма отправлена со страницы контактов. Не пытайтесь сразу строить сложную матрицу условий — это трудно поддерживать.
3. Подключите отправку через хук WPForms
Ниже пример, который отправляет сообщение в Slack только для конкретной формы и только если заполнено нужное поле. Используется хук wpforms_process_complete, который срабатывает после успешной отправки формы.
<?php
add_action( 'wpforms_process_complete', 'wpforms_send_slack_notification_conditionally', 10, 4 );
function wpforms_send_slack_notification_conditionally( $fields, $entry, $form_data, $entry_id ) {
// ID формы, для которой нужна отправка.
if ( (int) $form_data['id'] !== 123 ) {
return;
}
// Ищем значение нужного поля по ID.
$service = '';
foreach ( $fields as $field ) {
if ( isset( $field['id'] ) && (int) $field['id'] === 5 ) {
$service = isset( $field['value'] ) ? trim( (string) $field['value'] ) : '';
break;
}
}
if ( $service !== 'Техническая поддержка' ) {
return;
}
$webhook_url = 'https://hooks.slack.com/services/XXX/YYY/ZZZ';
$message = sprintf(
"Новая заявка из WPForms\nФорма: %s\nУслуга: %s\nЗапись: %d",
isset( $form_data['settings']['form_title'] ) ? $form_data['settings']['form_title'] : 'Без названия',
$service,
(int) $entry_id
);
$response = wp_remote_post(
$webhook_url,
array(
'timeout' => 10,
'headers' => array( 'Content-Type' => 'application/json; charset=utf-8' ),
'body' => wp_json_encode(
array(
'text' => $message,
),
),
)
);
if ( is_wp_error( $response ) ) {
error_log( 'Slack webhook error: ' . $response->get_error_message() );
return;
}
$code = wp_remote_retrieve_response_code( $response );
if ( $code < 200 || $code >= 300 ) {
error_log( 'Slack webhook HTTP code: ' . $code );
}
}
В этом примере есть две важные проверки: ID формы и значение поля. Это позволяет не отправлять в Slack всё подряд. Если у вас другое поле или другой ID, замените их на свои значения.
4. Если нужно несколько каналов — разнесите условия
Когда заявок несколько типов, не пытайтесь отправлять всё в один канал. Лучше сделать отдельные условия: один webhook для поддержки, другой для продаж. Так канал остаётся читаемым, а ответственные видят только свои обращения.
<?php
function wpforms_get_slack_webhook_by_service( $service ) {
$map = array(
'Техническая поддержка' => 'https://hooks.slack.com/services/AAA/BBB/CCC',
'Консультация' => 'https://hooks.slack.com/services/DDD/EEE/FFF',
);
return isset( $map[ $service ] ) ? $map[ $service ] : '';
}
Такой подход удобнее, чем писать несколько одинаковых блоков отправки. Логику маршрутизации можно вынести в отдельную функцию и потом расширять без переписывания всей обработки формы.
Как проверить, что решение сработало
Проверка должна быть не формальной, а практической. Отправьте тестовую заявку с нужным значением поля и убедитесь, что:
- заявка сохранилась в WPForms Entries или в вашей системе хранения;
- в логах нет ошибок
wp_remote_post(); - в Slack пришло сообщение именно в тот канал, который вы ожидали;
- заявка с другим значением поля не отправилась;
- форма не стала заметно медленнее после добавления кода.
Если сообщение приходит, но текст пустой или обрезан, проверьте, что вы берёте правильный ID поля и что значение не хранится в массиве, который нужно собрать вручную. У сложных полей WPForms формат данных может отличаться от обычного текстового поля.
Частые ошибки и как их исправить
Неверный ID формы или поля
Это самая частая причина. В коде всё выглядит правильно, но условие никогда не срабатывает. Проверьте ID формы в настройках WPForms и ID поля в конструкторе. Не ориентируйтесь на порядок полей визуально — после редактирования он может меняться.
Webhook URL вставлен в открытый код темы
Если URL лежит в публичном JS или в шаблоне, его легко подсмотреть. Для webhook это риск: канал можно заспамить. Храните адрес в PHP-коде, в переменной окружения или в настройках, доступных только администратору.
Слишком тяжёлая обработка внутри wpforms_process_complete
Если вы внутри хука делаете несколько внешних запросов, обращаетесь к большой базе или запускаете сложную логику, отправка формы может тормозить. Для простого уведомления оставляйте только один короткий запрос. Если нужна тяжёлая обработка, лучше выносить её в очередь или отдельный фоновой процесс.
Блокировка исходящих запросов хостингом
Некоторые хостинги ограничивают исходящие HTTP-запросы или режут запросы к внешним доменам. В таком случае Slack не получит сообщение, даже если код корректный. Проверьте это через временный лог или обратитесь в поддержку хостинга.
Дубли сообщений
Если сообщение приходит дважды, часто причина в том, что код подключён в двух местах: в дочерней теме и в мини-плагине, или в одном месте, но хук зарегистрирован повторно. Проверьте, где именно лежит функция, и не дублируется ли она после обновления темы.
Безопасность и производительность
Webhook — это внешняя точка интеграции, а значит, её нужно защищать так же аккуратно, как доступ к админке. Не храните секреты в публичных репозиториях, не вставляйте их в HTML и не отправляйте в браузер без необходимости.
- Ограничьте отправку только нужными формами и полями.
- Не передавайте в Slack лишние персональные данные, если они не нужны для обработки заявки.
- Добавьте
timeoutвwp_remote_post(), чтобы внешний сервис не подвешивал отправку формы. - Если сообщений много, подумайте о фильтрации на уровне формы, а не после отправки.
Если на сайте много технических форм и лишние уведомления уже мешают, имеет смысл сначала навести порядок в самом сайте: убрать дубли, отключить лишние скрипты и сократить шум в админке. Для этого иногда полезен Clearfy Pro, но только если вам реально нужна такая чистка и вы понимаете, что именно отключаете.
Что делать, если нужно отправлять не только текст, но и данные полей
Slack принимает простой текст, но вы можете собрать более читаемое сообщение: вывести имя, телефон, email, выбранную услугу и ссылку на запись. Главное — не перегружать сообщение. Чем короче и структурнее формат, тем быстрее его читают в рабочем канале.
<?php
$message = sprintf(
"Новая заявка\nИмя: %s\nТелефон: %s\nEmail: %s\nУслуга: %s",
$customer_name,
$phone,
$email,
$service
);
Если нужно передавать вложенные данные или строить более сложный workflow, лучше не пытаться всё запихнуть в одно сообщение. В таком случае удобнее отправлять webhook в промежуточный сервис или свой обработчик, а уже оттуда маршрутизировать данные дальше.
Проверочный чек-лист перед запуском
- Webhook URL работает и не содержит пробелов.
- Условие отправки привязано к конкретной форме.
- Проверяется нужное поле, а не визуальный порядок полей.
- Есть логирование ошибок
wp_remote_post(). - Тестовая заявка приходит только тогда, когда должна.
- Лишние персональные данные не уходят в Slack.
Если после внедрения всё работает стабильно, не усложняйте схему без необходимости. Для рабочих уведомлений важнее предсказуемость, чем количество автоматизаций. Чем проще условие и короче payload, тем меньше шансов, что интеграция сломается после очередного обновления темы, плагина или хостинга.