Уведомления с сайта WordPress в ВКонтакте: инструкция

Как настроить мгновенные уведомления о заявках с сайта WordPress в чат или группу ВКонтакте: токен сообщества, вебхуки Fluent Forms Pro, готовый PHP-код.

Александр Лаврищев
Хотите сайт с воронкой продаж на WordPress?
Напишите мне в личку — обсудим вашу задачу.
Написать мне ВКонтакте

Зачем это нужно

Заявка с сайта, которая пришла только на e-mail, живёт по законам почты: письмо попадает в «Промоакции», теряется среди рассылок, читается через два часа. А клиент в это время уже пишет конкуренту.

Уведомление в ВКонтакте решает три задачи:

  1. Скорость реакции. Сообщение в беседу сообщества приходит за 1–3 секунды и подсвечивается пушем на телефоне у всех участников беседы.
  2. Командная работа. Заявку видит не один менеджер, а вся команда: руководитель, оператор, бухгалтер. Никто не «забыл переслать».
  3. Резервный канал. Если SMTP отвалился, DNS-записи поехали или хостинг заблокировал почту — заявки всё равно доходят.

ВКонтакте выбирают, когда бизнес работает в РФ: Telegram-бот может быть недоступен у части сотрудников, а ВК стоит у всех, и сообщество компании уже есть.

Типовые кейсы

КейсЧто настраиваемКому подходит
Заявка с формы «Заказать звонок»Сообщение в беседу сообщества со всеми полями формыУслуги, консалтинг, бухгалтерия
Расчёт калькулятораСообщение с итоговой суммой и выбранными опциямиСтроительство, аутсорсинг, логистика
Форма «Нашли ошибку»Сообщение в отдельную беседу техподдержкиКонтентные проекты, СМИ
Заказ обратного звонка ночьюУведомление + пометка «вне рабочего времени»Сервис, ремонт, медицина
Дубль-канал к почтеОдно и то же уведомление на e-mail + ВКЛюбой бизнес с одним менеджером
Уведомление о новом подписчике CRMСообщение при добавлении контакта в список FluentCRMИнфобизнес, курсы

Что понадобится

  • WordPress 6.0+ с включёнными «красивыми» постоянными ссылками (ЧПУ), HTTPS обязателен.
  • Тема Kadence (Cadence) — мы используем именно её. Тема здесь не влияет на логику отправки, но важна для двух вещей: формы выводятся через блоки Kadence Blocks, а всплывающие окна с формами — через Kadence Conversions и Kadence Elements. Если у вас другая тема, шаги 4–6 просто выполняйте в своём конструкторе.
  • Fluent Forms Pro — нужен именно Pro. В бесплатной версии нет интеграции Webhooks и нет условной логики уведомлений. Если Pro нет — используйте вариант со сниппетом на PHP (Шаг 6, вариант Б), он работает и с бесплатной версией.
  • Сообщество (группа) ВКонтакте, где вы администратор.
  • Плагин для сниппетов: WPCodeBox, WPCode или собственный child-theme functions.php.

Шаг 1. Создаём токен сообщества ВКонтакте

Токен сообщества — это ключ, от имени которого сайт будет отправлять сообщения.

  1. Откройте сообщество → Управление → Работа с API → Ключи доступа.
  2. Нажмите Создать ключ.
  3. Отметьте права:
  • Сообщения сообщества — обязательно;
  • Управление сообществом — если планируете писать в беседы сообщества;
  • Стена — только если будете постить записи (для уведомлений не нужно).
  1. Подтвердите действие кодом и скопируйте ключ вида vk1.a.XXXXXXXX….

Важно: ключ сообщества — это пароль. Не публикуйте его в статьях, скриншотах и в коде страницы. Храните в константе wp-config.php или в менеджере секретов плагина.

Также включите: Управление → Сообщения → Сообщения сообщества: Включены, иначе messages.send вернёт ошибку 901.

Шаг 2. Создаём беседу и узнаём её peer_id

Уведомления удобнее слать не в личку админу, а в беседу сообщества (Управление → Сообщения → Беседы, либо «Обсуждения» отдельной темой).

  1. Создайте беседу, например «Заявки с сайта», и добавьте туда нужных сотрудников.
  2. peer_id беседы = 2000000000 + номер чата. Первая беседа сообщества — 2000000001, вторая — 2000000002 и т. д.
  3. Проверить список доступных диалогов можно запросом:
curl -s "https://api.vk.com/method/messages.getConversations?count=20&v=5.199" \
  -H "Authorization: Bearer VK_GROUP_TOKEN" | jq '.response.items[].conversation.peer'

В ответе вы увидите объекты вида {"id": 2000000001, "type": "chat", "local_id": 1}. Именно id и есть искомый peer_id.

Если хотите слать уведомления в личные сообщения конкретному человеку, peer_id = его user_id, и этот человек должен первым написать сообществу — иначе ВК запретит отправку (ошибка 901).

Шаг 3. Проверяем отправку вручную

Прежде чем встраивать в сайт, убедитесь, что токен и peer_id рабочие:

curl -s -X POST "https://api.vk.com/method/messages.send" \
  -d "peer_id=2000000001" \
  -d "random_id=0" \
  -d "message=Тестовое уведомление с сайта" \
  -d "access_token=VK_GROUP_TOKEN" \
  -d "v=5.199"

Успешный ответ: {"response": 12345} — это ID отправленного сообщения. Если пришло {"error":{"error_code":...}}, смотрите таблицу ошибок в конце статьи.

Шаг 4. Прячем токен в конфигурацию сайта

Добавьте в wp-config.php выше строки /* That's all, stop editing! */:

define( 'VK_NOTIFY_TOKEN', 'vk1.a.ВАШ_ТОКЕН_СООБЩЕСТВА' );
define( 'VK_NOTIFY_PEER',  '2000000001' ); // беседа «Заявки с сайта»
define( 'VK_NOTIFY_API_V', '5.199' );

Так токен не попадёт в экспорт базы и в резервные копии плагинов.

Шаг 5. Универсальная функция отправки

Сниппет добавляем через WPCodeBox → PHP Snippet → Run Everywhere (или в functions.php дочерней темы).

<?php
/**
 * Отправка сообщения в ВКонтакте (беседа сообщества или личка).
 *
 * @param string $text  Текст уведомления (до 4096 символов).
 * @param string $peer  peer_id получателя. По умолчанию — константа VK_NOTIFY_PEER.
 * @return bool         true — сообщение доставлено.
 */
function pb_vk_notify( $text, $peer = null ) {

	if ( ! defined( 'VK_NOTIFY_TOKEN' ) || ! VK_NOTIFY_TOKEN ) {
		return false;
	}

	$peer = $peer ?: VK_NOTIFY_PEER;
	$text = mb_substr( wp_strip_all_tags( $text ), 0, 4000 );

	$response = wp_remote_post( 'https://api.vk.com/method/messages.send', array(
		'timeout' => 10,
		'body'    => array(
			'peer_id'      => $peer,
			'random_id'    => wp_rand( 1, PHP_INT_MAX ), // защита от дублей на стороне ВК
			'message'      => $text,
			'dont_parse_links' => 0,
			'access_token' => VK_NOTIFY_TOKEN,
			'v'            => defined( 'VK_NOTIFY_API_V' ) ? VK_NOTIFY_API_V : '5.199',
		),
	) );

	if ( is_wp_error( $response ) ) {
		error_log( '[VK notify] transport error: ' . $response->get_error_message() );
		return false;
	}

	$body = json_decode( wp_remote_retrieve_body( $response ), true );

	if ( isset( $body['error'] ) ) {
		error_log( '[VK notify] API error ' . $body['error']['error_code'] . ': ' . $body['error']['error_msg'] );
		return false;
	}

	return isset( $body['response'] );
}

random_id обязателен: ВКонтакте использует его для дедупликации. Если передавать 0, при повторной отправке того же текста сообщение может «схлопнуться».

Шаг 6. Подключаем формы

Вариант А (рекомендуемый) — Webhooks в Fluent Forms Pro

Fluent Forms Pro умеет отправлять POST-запрос при каждой отправке формы. Но VK API ждёт свои поля, поэтому webhook направляем на собственный эндпоинт сайта, а уже он формирует сообщение. Это надёжнее, чем бить в api.vk.com напрямую, и позволяет менять формат текста без правок в форме.

6.1. Создаём эндпоинт-приёмник:

<?php
add_action( 'rest_api_init', function () {
	register_rest_route( 'pb/v1', '/vk-hook', array(
		'methods'             => 'POST',
		'permission_callback' => '__return_true', // проверка ниже по секрету
		'callback'            => 'pb_vk_hook_handler',
	) );
} );

function pb_vk_hook_handler( WP_REST_Request $request ) {

	// 1. Проверяем секрет — эндпоинт публичный.
	$secret = $request->get_header( 'x-pb-secret' );
	if ( ! defined( 'VK_HOOK_SECRET' ) || ! hash_equals( VK_HOOK_SECRET, (string) $secret ) ) {
		return new WP_REST_Response( array( 'ok' => false, 'error' => 'forbidden' ), 403 );
	}

	$data = $request->get_json_params();
	if ( empty( $data ) ) {
		return new WP_REST_Response( array( 'ok' => false, 'error' => 'empty' ), 400 );
	}

	// 2. Собираем читабельное сообщение.
	$lines   = array();
	$lines[] = '🔔 Новая заявка: ' . sanitize_text_field( $data['form_title'] ?? 'Форма сайта' );
	$lines[] = str_repeat( '—', 20 );

	foreach ( $data as $key => $value ) {
		if ( in_array( $key, array( 'form_title', '__fluent_form_embded_post_id' ), true ) ) {
			continue;
		}
		if ( is_array( $value ) ) {
			$value = implode( ', ', array_filter( array_map( 'strval', $value ) ) );
		}
		$value = trim( wp_strip_all_tags( (string) $value ) );
		if ( '' === $value ) {
			continue;
		}
		$lines[] = mb_strtoupper( mb_substr( $key, 0, 1 ) ) . mb_substr( $key, 1 ) . ': ' . $value;
	}

	$lines[] = str_repeat( '—', 20 );
	$lines[] = '🕒 ' . wp_date( 'd.m.Y H:i' ) . ' (' . wp_timezone_string() . ')';
	$lines[] = '🌐 ' . home_url( '/' );

	$sent = pb_vk_notify( implode( "\n", $lines ) );

	return new WP_REST_Response( array( 'ok' => $sent ), $sent ? 200 : 502 );
}

Добавьте секрет в wp-config.php:

define( 'VK_HOOK_SECRET', 'сгенерируйте_длинную_случайную_строку' );

6.2. Настраиваем webhook в форме:

  1. Fluent Forms → нужная форма → Settings & Integrations → Integrations → Add New Integration → Webhook.
  2. Request URL: https://ваш-сайт.ru/wp-json/pb/v1/vk-hook
  3. Request Method: POST
  4. Request Format: JSON
  5. Request Headers: добавьте x-pb-secret = ваш VK_HOOK_SECRET.
  6. Request Body: All Form Data (или Select Fields и вручную соберите нужные поля с человеческими названиями: Имя, Телефон, Услуга).
  7. При необходимости включите Conditional Logic — например, слать в ВК только заявки со страницы /uslugi/.
  8. Сохраните и нажмите Save Settings.

Если у вас несколько форм — создайте по одному webhook на каждую. Разные беседы задаются вторым параметром pb_vk_notify( $text, '2000000002' ); для этого добавьте в тело webhook скрытое поле vk_peer и прочитайте его в обработчике.

Вариант Б — без Webhooks, на хуке Fluent Forms

Работает и в бесплатной Fluent Forms. Хук fluentform/submission_inserted срабатывает сразу после сохранения заявки.

<?php
add_action( 'fluentform/submission_inserted', function ( $entry_id, $form_data, $form ) {

	// Ограничим набор форм: ID можно посмотреть в списке Fluent Forms.
	$allowed = array( 5, 13, 17, 18, 19 );
	if ( ! in_array( (int) $form->id, $allowed, true ) ) {
		return;
	}

	$labels = array(
		'names'   => 'Имя',
		'email'   => 'E-mail',
		'phone'   => 'Телефон',
		'message' => 'Сообщение',
	);

	$lines   = array();
	$lines[] = '🔔 Заявка: ' . $form->title;
	$lines[] = str_repeat( '—', 20 );

	foreach ( $form_data as $key => $value ) {
		if ( str_starts_with( $key, '__' ) || 'cf-turnstile-response' === $key ) {
			continue;
		}
		if ( is_array( $value ) ) {
			$value = implode( ' ', array_filter( array_map( 'strval', $value ) ) );
		}
		$value = trim( wp_strip_all_tags( (string) $value ) );
		if ( '' === $value ) {
			continue;
		}
		$lines[] = ( $labels[ $key ] ?? $key ) . ': ' . $value;
	}

	$lines[] = str_repeat( '—', 20 );
	$lines[] = '№ заявки: ' . $entry_id;
	$lines[] = '🕒 ' . wp_date( 'd.m.Y H:i' );

	pb_vk_notify( implode( "\n", $lines ) );

}, 20, 3 );

Вариант В — уведомление из FluentCRM

Если нужно сообщать не о самой форме, а о попадании контакта в список:

<?php
add_action( 'fluentcrm/contact_added_to_lists', function ( $lists, $subscriber ) {
	$names = array();
	foreach ( (array) $lists as $list ) {
		$names[] = is_object( $list ) ? $list->title : (string) $list;
	}
	pb_vk_notify(
		"👤 Новый контакт в CRM\n" .
		$subscriber->full_name . ' — ' . $subscriber->email . "\n" .
		'Списки: ' . implode( ', ', $names )
	);
}, 10, 2 );

Шаг 7. Формы во всплывающих окнах Kadence

В теме Kadence всплывающие формы обычно собраны так: плашка/кнопка выводится через Kadence Elements (hook wp_footer), а форма открывается в модальном окне Kadence Conversions или встроенным шорткодом .

На отправку уведомлений это не влияет — хуки Fluent Forms срабатывают одинаково. Но два момента проверьте:

  • Hook Element’а. Если Element выведен как Fixed → Above Header, тема резервирует место и появляется лишняя полоса вверху. Ставьте wp_footer.
  • Повторное открытие модалки. Добавьте toggle-логику, иначе накапливаются пустые слои модального окна:
document.addEventListener('click', function (e) {
  const trigger = e.target.closest('[data-vk-form-trigger]');
  if (!trigger) return;
  e.preventDefault();

  const opened = document.querySelector('.lity, .kadence-conversion-modal.is-visible');
  if (opened) {                       // повторный клик — закрываем
    document.querySelectorAll('.lity').forEach(el => el.remove());
    document.documentElement.classList.remove('lity-active');
    return;
  }
  trigger.querySelector('a, button')?.click();
});

Шаг 8. Антиспам обязателен

Публичная форма без капчи превратит вашу беседу ВК в поток мусора. Мы используем Cloudflare Turnstile:

  1. Cloudflare → Turnstile → Add site → домен сайта → тип Managed.
  2. Fluent Forms → Global Settings → Cloudflare Turnstile → вставьте Site Key и Secret Key.
  3. В каждой форме добавьте поле Turnstile (раздел Advanced Fields).
  4. Режим виджета: interaction-only — посетитель ничего не видит, проверка проходит фоном. Если нужен видимый бейдж — переключите на always.

Дополнительно в Fluent Forms включите Settings → Form Settings → Restrictions: лимит отправок с одного IP и запрет пустых отправок.

Шаг 9. Тестирование

Чек-лист приёмки:

  • [ ] Тестовая отправка curl из Шага 3 возвращает response.
  • [ ] Отправка реальной формы приводит к сообщению в беседе за ≤5 секунд.
  • [ ] В сообщении есть все ключевые поля, кириллица не «ломается».
  • [ ] Заявка при этом всё равно приходит на e-mail (двойной канал).
  • [ ] При отключённом интернете у VK API сайт не «вешает» форму — таймаут 10 секунд, посетитель видит успех.
  • [ ] В wp-content/debug.log нет записей [VK notify] API error.
  • [ ] Спам-бот с пустым Turnstile-токеном получает 422 и не проходит.

Включить лог на время теста:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Шаг 10. Обратный канал: Callback API (опционально)

Если нужно не только слать уведомления, но и принимать сообщения из ВК (например, автоответ в личку сообщества), настройте Callback API:

  1. Сообщество → Управление → Работа с API → Callback API.
  2. Адрес сервера: https://ваш-сайт.ru/wp-json/pb/v1/vk-callback
  3. ВК запросит подтверждение: он пришлёт {"type":"confirmation"} и ждёт в ответ строку подтверждения из настроек.
  4. Задайте Секретный ключ и включите события message_new.
<?php
add_action( 'rest_api_init', function () {
	register_rest_route( 'pb/v1', '/vk-callback', array(
		'methods'             => 'POST',
		'permission_callback' => '__return_true',
		'callback'            => function ( WP_REST_Request $r ) {

			$data = $r->get_json_params();

			// 1. Подтверждение сервера.
			if ( ( $data['type'] ?? '' ) === 'confirmation' ) {
				return new WP_REST_Response( VK_CALLBACK_CONFIRM, 200 );
			}

			// 2. Проверка секрета.
			if ( ! hash_equals( VK_CALLBACK_SECRET, (string) ( $data['secret'] ?? '' ) ) ) {
				return new WP_REST_Response( 'forbidden', 403 );
			}

			// 3. Новое сообщение сообществу.
			if ( ( $data['type'] ?? '' ) === 'message_new' ) {
				$msg = $data['object']['message'];
				pb_vk_notify(
					'💬 Сообщение сообществу от id' . $msg['from_id'] . ":\n" . $msg['text']
				);
			}

			// ВК ждёт ровно "ok" и код 200, иначе будет ретраить.
			return new WP_REST_Response( 'ok', 200 );
		},
	) );
} );

Константы в wp-config.php:

define( 'VK_CALLBACK_CONFIRM', 'строка_подтверждения_из_настроек_сообщества' );
define( 'VK_CALLBACK_SECRET',  'секретный_ключ_из_настроек_сообщества' );

Важно: ВК ждёт ответ не дольше 10 секунд и строго тело ok. Тяжёлую обработку выносите в wp_schedule_single_event.

Частые ошибки VK API

КодСообщениеЧто делать
5User authorization failedТокен отозван или скопирован не полностью. Создайте новый ключ сообщества
15Access deniedУ токена нет права «Сообщения сообщества»
901Can’t send messages to this userПользователь не писал сообществу первым, либо сообщения сообщества выключены
100One of the parameters is invalidНеверный peer_id (для беседы должно быть 2000000000+)
6Too many requests per secondНе более 20 запросов/сек для сообщества; ставьте очередь
914Message is too longОбрежьте текст до 4096 символов (в коде — mb_substr)

Безопасность и эксплуатация

  • Токен и секреты — только в wp-config.php или менеджере секретов, никогда в базе и не в репозитории.
  • Ротация токена раз в 6–12 месяцев и немедленно при увольнении администратора.
  • Никогда не отправляйте в ВК полные персональные данные, если этого можно избежать: достаточно имени, телефона и номера заявки. Ссылку на карточку заявки в админке — да, содержимое паспорта — нет.
  • В политике конфиденциальности укажите, что данные из формы передаются в сервис уведомлений.
  • Не выключайте e-mail-уведомления: ВК — дополнительный канал, а не замена журналу заявок.

FAQ

Нужен ли Fluent Forms Pro? Для варианта с Webhooks — да, интеграция Webhook есть только в Pro. Вариант с PHP-хуком (Шаг 6Б) работает и в бесплатной версии.

Можно ли слать уведомления в личку руководителю? Да, но он должен первым написать сообществу — иначе ВК вернёт ошибку 901.

Влияет ли тема Kadence на работу интеграции? Нет. Kadence отвечает только за вывод форм и модальных окон. Логика уведомлений живёт в Fluent Forms и в сниппете.

Сколько сообщений в секунду выдержит сообщество? До 20 запросов в секунду. Для сайтов с потоком заявок ставьте очередь через wp_schedule_single_event.

Что делать, если форма стала отправляться дольше? Вынесите отправку в фон: в хуке вместо прямого вызова используйте wp_schedule_single_event( time(), 'pb_vk_send_async', array( $text ) ); и обработчик на это событие.

Итог

Связка WordPress + тема Kadence + Fluent Forms Pro + VK API даёт мгновенные уведомления о заявках без сторонних сервисов и абонентской платы. На настройку уходит около часа: 10 минут на токен и беседу, 20 минут на сниппеты, остальное — тесты и антиспам.


JSON-LD разметка (вставить в блок «Пользовательский HTML» в конце статьи)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "headline": "Уведомления с сайта WordPress в ВКонтакте: инструкция",
      "description": "Как настроить мгновенные уведомления о заявках с сайта WordPress в чат или группу ВКонтакте: токен сообщества, вебхуки Fluent Forms Pro, готовый PHP-код.",
      "inLanguage": "ru-RU",
      "datePublished": "2026-08-28",
      "dateModified": "2026-08-28",
      "author": { "@type": "Person", "name": "Александр Милихин" },
      "publisher": { "@type": "Organization", "name": "WordPressBook" },
      "mainEntityOfPage": { "@type": "WebPage", "@id": "URL_СТАТЬИ" }
    },
    {
      "@type": "HowTo",
      "name": "Настройка уведомлений с сайта WordPress в ВКонтакте",
      "totalTime": "PT1H",
      "step": [
        { "@type": "HowToStep", "name": "Создать токен сообщества", "text": "Управление сообществом → Работа с API → Ключи доступа, права «Сообщения сообщества»." },
        { "@type": "HowToStep", "name": "Определить peer_id беседы", "text": "peer_id = 2000000000 + номер беседы, проверка методом messages.getConversations." },
        { "@type": "HowToStep", "name": "Добавить функцию отправки", "text": "PHP-сниппет с wp_remote_post к методу messages.send." },
        { "@type": "HowToStep", "name": "Подключить форму", "text": "Webhook в Fluent Forms Pro или хук fluentform/submission_inserted." },
        { "@type": "HowToStep", "name": "Включить антиспам", "text": "Поле Cloudflare Turnstile в каждой форме." },
        { "@type": "HowToStep", "name": "Протестировать", "text": "Проверить доставку сообщения и записи в debug.log." }
      ]
    },
    {
      "@type": "FAQPage",
      "mainEntity": [
        { "@type": "Question", "name": "Нужен ли Fluent Forms Pro?", "acceptedAnswer": { "@type": "Answer", "text": "Для интеграции Webhook — да. Вариант с PHP-хуком fluentform/submission_inserted работает и в бесплатной версии." } },
        { "@type": "Question", "name": "Можно ли слать уведомления в личные сообщения?", "acceptedAnswer": { "@type": "Answer", "text": "Да, но получатель должен первым написать сообществу, иначе VK API вернёт ошибку 901." } },
        { "@type": "Question", "name": "Влияет ли тема Kadence на работу интеграции?", "acceptedAnswer": { "@type": "Answer", "text": "Нет. Kadence отвечает за вывод форм и модальных окон, логика уведомлений находится в Fluent Forms и PHP-сниппете." } }
      ]
    }
  ]
}
</script>
Александр Лаврищев
Хотите сайт с воронкой продаж на WordPress?
Напишите мне в личку — обсудим вашу задачу.
Написать мне ВКонтакте

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *