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

Зачем это нужно
Заявка с сайта, которая пришла только на e-mail, живёт по законам почты: письмо попадает в «Промоакции», теряется среди рассылок, читается через два часа. А клиент в это время уже пишет конкуренту.
Уведомление в ВКонтакте решает три задачи:
- Скорость реакции. Сообщение в беседу сообщества приходит за 1–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. Создаём токен сообщества ВКонтакте
Токен сообщества — это ключ, от имени которого сайт будет отправлять сообщения.
- Откройте сообщество → Управление → Работа с API → Ключи доступа.
- Нажмите Создать ключ.
- Отметьте права:
- Сообщения сообщества — обязательно;
- Управление сообществом — если планируете писать в беседы сообщества;
- Стена — только если будете постить записи (для уведомлений не нужно).
- Подтвердите действие кодом и скопируйте ключ вида
vk1.a.XXXXXXXX….
Важно: ключ сообщества — это пароль. Не публикуйте его в статьях, скриншотах и в коде страницы. Храните в константе
wp-config.phpили в менеджере секретов плагина.
Также включите: Управление → Сообщения → Сообщения сообщества: Включены, иначе messages.send вернёт ошибку 901.
Шаг 2. Создаём беседу и узнаём её peer_id
Уведомления удобнее слать не в личку админу, а в беседу сообщества (Управление → Сообщения → Беседы, либо «Обсуждения» отдельной темой).
- Создайте беседу, например «Заявки с сайта», и добавьте туда нужных сотрудников.
peer_idбеседы =2000000000 + номер чата. Первая беседа сообщества —2000000001, вторая —2000000002и т. д.- Проверить список доступных диалогов можно запросом:
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 в форме:
- Fluent Forms → нужная форма → Settings & Integrations → Integrations → Add New Integration → Webhook.
- Request URL:
https://ваш-сайт.ru/wp-json/pb/v1/vk-hook - Request Method:
POST - Request Format:
JSON - Request Headers: добавьте
x-pb-secret= вашVK_HOOK_SECRET. - Request Body:
All Form Data(или Select Fields и вручную соберите нужные поля с человеческими названиями:Имя,Телефон,Услуга). - При необходимости включите Conditional Logic — например, слать в ВК только заявки со страницы
/uslugi/. - Сохраните и нажмите 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:
- Cloudflare → Turnstile → Add site → домен сайта → тип Managed.
- Fluent Forms → Global Settings → Cloudflare Turnstile → вставьте Site Key и Secret Key.
- В каждой форме добавьте поле Turnstile (раздел Advanced Fields).
- Режим виджета:
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:
- Сообщество → Управление → Работа с API → Callback API.
- Адрес сервера:
https://ваш-сайт.ru/wp-json/pb/v1/vk-callback - ВК запросит подтверждение: он пришлёт
{"type":"confirmation"}и ждёт в ответ строку подтверждения из настроек. - Задайте Секретный ключ и включите события
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
| Код | Сообщение | Что делать |
|---|---|---|
| 5 | User authorization failed | Токен отозван или скопирован не полностью. Создайте новый ключ сообщества |
| 15 | Access denied | У токена нет права «Сообщения сообщества» |
| 901 | Can’t send messages to this user | Пользователь не писал сообществу первым, либо сообщения сообщества выключены |
| 100 | One of the parameters is invalid | Неверный peer_id (для беседы должно быть 2000000000+) |
| 6 | Too many requests per second | Не более 20 запросов/сек для сообщества; ставьте очередь |
| 914 | Message 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> 
