wpforms.ru wordpress WPForms.ru

Как отправлять уведомления из WPForms в Slack только при нужных условиях

Обычная отправка уведомлений из 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 ] : '';
}

Такой подход удобнее, чем писать несколько одинаковых блоков отправки. Логику маршрутизации можно вынести в отдельную функцию и потом расширять без переписывания всей обработки формы.

Как проверить, что решение сработало

Проверка должна быть не формальной, а практической. Отправьте тестовую заявку с нужным значением поля и убедитесь, что:

  1. заявка сохранилась в WPForms Entries или в вашей системе хранения;
  2. в логах нет ошибок wp_remote_post();
  3. в Slack пришло сообщение именно в тот канал, который вы ожидали;
  4. заявка с другим значением поля не отправилась;
  5. форма не стала заметно медленнее после добавления кода.

Если сообщение приходит, но текст пустой или обрезан, проверьте, что вы берёте правильный 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, тем меньше шансов, что интеграция сломается после очередного обновления темы, плагина или хостинга.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше