
WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом Введение: почему заявки из WordPress должны приходить в Telegram Классическая ситуация: клиент...
WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом
Введение: почему заявки из WordPress должны приходить в Telegram
Классическая ситуация: клиент оставил заявку в форме на сайте, письмо упало на почту менеджеру, а менеджер проверяет ящик раз в час. К моменту звонка клиент уже ушёл к конкуренту, который ответил за три минуты. Скорость первой реакции на заявку – один из главных факторов конверсии лида в сделку, и почта здесь проигрывает мессенджеру по всем параметрам: доставка, пуш-уведомления на телефоне, привычка открывать.
Интеграция WordPress с Telegram решает эту проблему напрямую: заявка из формы Contact Form 7 или новый заказ WooCommerce приходит менеджеру в Telegram за секунды, а не за час. Но уведомления – только первый уровень. Полноценная wordpress telegram integration позволяет построить:
- Мгновенные уведомления о заявках из форм и заказах магазина.
- Двустороннюю поддержку: клиент пишет боту, менеджер отвечает из того же чата.
- Автоворонки с инлайн-кнопками: заявка приходит с кнопками «Взять в работу» / «Перезвонить», статус меняется прямо из Telegram, без CRM.

В статье разберём все три сценария по шагам – от простого к сложному – с рабочим PHP-кодом через wp_remote_post(), сравнением готовых плагинов и разбором типовых ошибок: утечка токена, неверный chat_id, блокировки Bot API.
Материал рассчитан на двух читателей: владельца бизнеса с сайтом на WordPress/WooCommerce, который хочет понять, что и зачем настраивать, и администратора или начинающего разработчика, которому поручено реализовать интеграцию своими руками. Весь код проверен на актуальных версиях WordPress 6.x, Contact Form 7 и WooCommerce – сниппеты можно копировать и адаптировать под свои поля.
Как работает связка WordPress и Telegram Bot API
Архитектура проще, чем кажется: WordPress отправляет обычный HTTP POST-запрос к https://api.telegram.org/bot<TOKEN>/sendMessage – и сообщение появляется в чате. Никаких посредников, веб-сокетов и промежуточных сервисов. В обратную сторону (когда клиент пишет боту) Telegram сам дёргает ваш endpoint через webhook.

Регистрация бота через @BotFather
- Откройте @BotFather в Telegram, отправьте
/newbot. - Задайте имя и username (обязательно заканчивается на
bot). - Получите токен вида
123456789:AAEhBOweik6ad9r_QXMENQjcrGbqCr4K-4I.
Токен – это полный контроль над ботом. Любой, кто его знает, может читать входящие сообщения и писать от имени бота. Правила:
- никогда не храните токен в коде, попадающем в git;
- не вставляйте токен в скриншоты, форумы и тикеты поддержки;
- при малейшем подозрении на утечку –
/revokeв @BotFather и выпуск нового.
Как узнать chat_id
chat_id – адресат сообщения. Три варианта:
- Личный чат: попросите менеджера написать боту любое сообщение, затем откройте
https://api.telegram.org/bot<TOKEN>/getUpdates– в JSON будет"chat":{"id":123456789}. - Группа: добавьте бота в группу, напишите в группе, тот же
getUpdates– id будет отрицательным, вида-1001234567890(для супергрупп). - Канал: бота нужно назначить администратором канала, id аналогично начинается с
-100.
Важный нюанс: getUpdates не вернёт обновления, если для бота уже установлен webhook – обновления уходят на webhook, а не в очередь getUpdates, и вы увидите пустой ответ. Если webhook уже настроен (например, после сценария 2 ниже), сначала снимите его запросом https://api.telegram.org/bot<TOKEN>/deleteWebhook, получите chat_id, затем установите webhook обратно.
Альтернатива – @userinfobot для личного id.
Ограничения Bot API, которые важно знать сразу
- Суммарно до ~30 сообщений в секунду, но с ограничениями по адресату: не более ~1 сообщения в секунду в личный чат и ~20 сообщений в минуту в одну группу. При превышении – ошибка
429с полемretry_after, в котором Telegram указывает, через сколько секунд повторить отправку. - Бот не может написать пользователю первым – клиент должен сам нажать Start. Это фундаментальное ограничение, вокруг него строятся сценарии поддержки.
- Массовые рассылки людям, не давшим согласия, – прямой путь к блокировке бота.
Для уведомлений о заявках лимитов хватает с запасом, но если отправляете уведомления в активный групповой чат или планируете рассылки по базе – закладывайте очередь отправки.
Плагин или свой код?
Два подхода к интеграции, и оба имеют право на жизнь:
- Готовый плагин – если нужен один стандартный сценарий (например, CF7 → Telegram) и нет разработчика. Платите ограниченной гибкостью и зависимостью от чужого кода.
- Свой код – если форм несколько, шаблоны сообщений нестандартные, нужны кнопки, статусы, webhook или есть требования к безопасности. 40–80 строк PHP закрывают большинство задач.
Дальше в каждом сценарии сначала коротко о готовых решениях, затем – код.
Сценарий 1: мгновенные уведомления о заявках из Contact Form 7 и WooCommerce
Задача: заявка из формы или новый заказ → сообщение менеджеру в Telegram за секунды.
Готовые плагины
В каталоге WordPress есть плагины вида «CF7 Telegram», «Telegram Notifications for WooCommerce». Плюс – старт за 10 минут без кода. Минусы, которые регулярно всплывают на практике:
- значительная часть таких плагинов заброшена (проверяйте дату последнего обновления и совместимость с вашей версией WordPress);
- некоторые проксируют отправку через свои серверы – ваш токен и содержимое заявок уходят третьей стороне;
- шаблон сообщения настраивается ограниченно, «лишнее» поле из формы не вытащить.
Если плагин свежий, open-source и отправляет напрямую в api.telegram.org – это приемлемый вариант. Если есть сомнения – код ниже.
Свой код без плагинов
Базовая функция отправки через wp_remote_post():
/**
* Отправка сообщения в Telegram через Bot API.
*
* @param string $text Текст сообщения (HTML-разметка).
* @return bool true при успехе, false при ошибке.
*/
function pt_telegram_send( string $text ): bool {
$url = 'https://api.telegram.org/bot' . PT_TG_TOKEN . '/sendMessage';
$response = wp_remote_post( $url, [
'timeout' => 10,
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( [
'chat_id' => PT_TG_CHAT_ID,
'text' => $text,
'parse_mode' => 'HTML',
] ),
] );
if ( is_wp_error( $response ) ) {
error_log( 'Telegram send failed: ' . $response->get_error_message() );
return false;
}
$code = wp_remote_retrieve_response_code( $response );
if ( 200 !== $code ) {
error_log( 'Telegram API error ' . $code . ': ' . wp_remote_retrieve_body( $response ) );
return false;
}
return true;
}Токен и chat_id храним константами в wp-config.php – не в базе, не в репозитории:
define( 'PT_TG_TOKEN', '123456789:AAEh...' );
define( 'PT_TG_CHAT_ID', '-1001234567890' );Хук для Contact Form 7. Используем wpcf7_before_send_mail, а не популярный wpcf7_mail_sent: первый срабатывает до попытки отправки письма, и Telegram-уведомление уйдёт даже если почтовая отправка на сайте сломана (нет SMTP-плагина, письма не уходят). При wpcf7_mail_sent заявка в такой ситуации терялась бы молча:
add_action( 'wpcf7_before_send_mail', function ( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return;
}
$data = $submission->get_posted_data();
$text = "<b>Новая заявка с сайта</b>\n"
. 'Форма: ' . esc_html( $contact_form->title() ) . "\n"
. 'Имя: ' . esc_html( $data['your-name'] ?? '–' ) . "\n"
. 'Телефон: ' . esc_html( $data['your-phone'] ?? '–' ) . "\n"
. 'Сообщение: ' . esc_html( $data['your-message'] ?? '–' );
pt_telegram_send( $text );
} );Хук для WooCommerce:
add_action( 'woocommerce_new_order', function ( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$items = [];
foreach ( $order->get_items() as $item ) {
$items[] = $item->get_name() . ' × ' . $item->get_quantity();
}
$text = "<b>Новый заказ №{$order_id}</b>\n"
. 'Сумма: ' . $order->get_total() . ' ' . $order->get_currency() . "\n"
. 'Клиент: ' . esc_html( $order->get_billing_first_name() ) . "\n"
. 'Телефон: ' . esc_html( $order->get_billing_phone() ) . "\n"
. 'Состав: ' . esc_html( implode( ', ', $items ) );
pt_telegram_send( $text );
} );Куда положить код
Не в functions.php основной темы – при обновлении темы он исчезнет. Варианты:
functions.phpдочерней темы – минимально достаточно;- собственный мини-плагин (один файл в
wp-content/plugins/telegram-notify/) – надёжнее, переживает смену темы. Это предпочтительный вариант.
Проверка и отладка
Отправьте тестовую заявку. Если сообщение не пришло, смотрите по порядку:
WP_Errorв логе – хостинг блокирует исходящие соединения кapi.telegram.org(встречается на части российских shared-хостингов). Решение: VPS, прокси или хостинг без таких ограничений.- Код 400 – неверный
chat_id(проверьте минус у группового id). - Код 401 – неверный токен.
- Код 429 – превышен лимит, смотрите
retry_afterв ответе.
Сценарий 2: двусторонняя поддержка клиентов через Telegram-бота
Задача: клиент пишет боту → сообщение попадает менеджеру (в WordPress или в рабочий чат), ответ менеджера возвращается клиенту.
Long polling против webhook
Получить входящие сообщения можно двумя способами:
- Long polling – скрипт сам опрашивает
getUpdatesв цикле. Просто для отладки, но на проде требует постоянно работающего процесса (cron + lock-файлы – костыль). - Webhook – Telegram сам отправляет каждое обновление POST-запросом на ваш URL. Для продакшена выбираем его. Требования: HTTPS с валидным сертификатом (подойдёт Let's Encrypt).
Установка webhook – один запрос (откройте URL в браузере или выполните через curl, подставив свои значения):
https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://site.ru/wp-json/tg/v1/webhook&secret_token=<СЕКРЕТ>Endpoint в WordPress
Регистрируем REST-маршрут как точку приёма:
add_action( 'rest_api_init', function () {
register_rest_route( 'tg/v1', '/webhook', [
'methods' => 'POST',
'callback' => 'pt_telegram_webhook',
'permission_callback' => 'pt_telegram_verify_secret',
] );
} );
/**
* Проверка secret_token из заголовка – отсекает поддельные запросы.
*/
function pt_telegram_verify_secret( WP_REST_Request $request ): bool {
return hash_equals(
PT_TG_WEBHOOK_SECRET,
(string) $request->get_header( 'X-Telegram-Bot-Api-Secret-Token' )
);
}
function pt_telegram_webhook( WP_REST_Request $request ): WP_REST_Response {
$update = $request->get_json_params();
$message = $update['message'] ?? null;
if ( $message && isset( $message['text'], $message['chat']['id'] ) ) {
$client_chat_id = (string) $message['chat']['id'];
$client_name = $message['from']['first_name'] ?? 'Клиент';
// Пересылаем обращение менеджеру в рабочий чат.
pt_telegram_send(
"<b>Обращение от {$client_name}</b> (chat_id: {$client_chat_id})\n"
. esc_html( $message['text'] )
);
}
return new WP_REST_Response( [ 'ok' => true ], 200 );
}Важно: webhook-обработчик должен отвечать быстро и всегда кодом 200 – иначе Telegram будет считать endpoint нерабочим и слать повторы. Тяжёлую обработку выносите в фон (cron, очередь).
Ответ клиенту от имени бота – тот же sendMessage, но с chat_id клиента (менеджеру можно выдать команду вида /reply 123456789 текст ответа).
Когда достаточно готового решения
Если полноценная двусторонняя переписка не нужна, а требуется просто «напишите нам в Telegram» – ставится виджет-кнопка или ссылка t.me/username / tg://resolve. Это честное решение для малого бизнеса: кастомный бот поддержки имеет смысл, когда нужна история диалогов в WordPress, привязка к заказам или автоответы.
Сценарий 3: автоворонки с инлайн-кнопками и webhook
Задача: заявка приходит менеджеру с кнопками «Взять в работу» / «Перезвонить» / «Отклонить» – статус заявки меняется прямо из Telegram.
Inline keyboard в Bot API
К сообщению прикрепляется reply_markup с массивом кнопок. У каждой кнопки – callback_data (строка до 64 байт), которую Telegram вернёт вам в callback_query при нажатии.
Отправка заявки с кнопками (связка со сценарием 1 – заявку предварительно сохраняем, например, как запись произвольного типа lead, и кладём её ID в callback_data):
function pt_telegram_send_lead( int $lead_id, string $text ): bool {
$url = 'https://api.telegram.org/bot' . PT_TG_TOKEN . '/sendMessage';
$response = wp_remote_post( $url, [
'timeout' => 10,
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( [
'chat_id' => PT_TG_CHAT_ID,
'text' => $text,
'parse_mode' => 'HTML',
'reply_markup' => [
'inline_keyboard' => [
[
[ 'text' => 'Взять в работу', 'callback_data' => "lead:{$lead_id}:work" ],
[ 'text' => 'Перезвонить', 'callback_data' => "lead:{$lead_id}:call" ],
],
[
[ 'text' => 'Отклонить', 'callback_data' => "lead:{$lead_id}:reject" ],
],
],
],
] ),
] );
return ! is_wp_error( $response ) && 200 === wp_remote_retrieve_response_code( $response );
}Обработка нажатия в webhook-обработчике из сценария 2:
$callback = $update['callback_query'] ?? null;
if ( $callback && isset( $callback['data'] ) ) {
// Формат: lead:{ID}:{action}
[ , $lead_id, $action ] = array_pad( explode( ':', $callback['data'] ), 3, '' );
$lead_id = (int) $lead_id;
$statuses = [
'work' => 'В работе',
'call' => 'Перезвонить',
'reject' => 'Отклонена',
];
if ( $lead_id && isset( $statuses[ $action ] ) ) {
update_post_meta( $lead_id, '_lead_status', $statuses[ $action ] );
update_post_meta( $lead_id, '_lead_manager', $callback['from']['first_name'] ?? '' );
// Убираем кнопки, чтобы заявку не взяли дважды.
wp_remote_post( 'https://api.telegram.org/bot' . PT_TG_TOKEN . '/editMessageReplyMarkup', [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( [
'chat_id' => $callback['message']['chat']['id'],
'message_id' => $callback['message']['message_id'],
'reply_markup' => [ 'inline_keyboard' => [] ],
] ),
] );
// Подтверждение нажатия – иначе у пользователя «часики» на кнопке.
wp_remote_post( 'https://api.telegram.org/bot' . PT_TG_TOKEN . '/answerCallbackQuery', [
'headers' => [ 'Content-Type' => 'application/json' ],
'body' => wp_json_encode( [
'callback_query_id' => $callback['id'],
'text' => 'Статус: ' . $statuses[ $action ],
] ),
] );
}
}Два обязательных вызова, о которых часто забывают: answerCallbackQuery (без него кнопка «зависает» у пользователя) и editMessageReplyMarkup (убирает кнопки после решения – защита от двойного взятия заявки).
Идеи для расширения воронки
- Напоминание: если через 15 минут у заявки статус не менялся – повторное сообщение в чат с упоминанием менеджера (cron + проверка меты
_lead_status). - Уведомление клиенту о смене статуса заказа WooCommerce – если клиент ранее писал боту и его chat_id привязан к заказу, хук
woocommerce_order_status_changedзакрывает задачу. - Источник заявки в сообщение: UTM-метки сохраняются на фронте и подставляются в скрытое поле формы.
// Сохраняем UTM из URL и подставляем в скрытое поле CF7.
(function () {
const params = new URLSearchParams(window.location.search);
const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign'];
utmKeys.forEach((k) => {
const v = params.get(k);
if (v) localStorage.setItem(k, v);
});
const utm = utmKeys
.map((k) => `${k}=${params.get(k) || localStorage.getItem(k) || ''}`)
.join('&');
document.querySelectorAll('input[name="utm-tags"]').forEach((el) => {
el.value = utm;
});
})();Скрипт выполняется при загрузке страницы, поэтому значение в скрытом поле гарантированно актуально к моменту отправки формы. В CF7 добавьте скрытое поле [hidden utm-tags] – и в PHP-хуке сценария 1 значение $data['utm-tags'] попадёт в сообщение менеджеру.
Сравнение готовых плагинов для интеграции WordPress с Telegram
Критерии оценки, которые реально важны в эксплуатации:
- Дата последнего обновления и совместимость с актуальной версией WordPress. Плагин, не обновлявшийся 2+ года, – потенциальная дыра в безопасности.
- Хранение токена: отправка идёт напрямую в
api.telegram.orgили через сервер разработчика плагина? Второе – отказ. - Гибкость шаблона сообщения: можно ли вывести произвольные поля формы.
- Поддержка webhook (нужна для сценариев 2–3, редко встречается в бесплатных плагинах).
- Цена: многие решения бесплатны для базовых уведомлений, платная версия открывает кнопки и webhook.
| Тип решения | Сценарии | Цена | Риски |
|---|---|---|---|
| Плагин уведомлений для CF7/WooCommerce | 1 | Бесплатно / freemium | Заброшенность, токен у третьей стороны |
| Telegram-виджет / кнопка чата | 2 (упрощённо) | Бесплатно | Нет истории диалогов в WP |
| Универсальный коннектор (многоканальный) | 1, частично 3 | Подписка | Зависимость от внешнего сервиса, лимиты тарифа |
| Свой код (сценарии из статьи) | 1–3 | Время разработчика | Нужна поддержка при обновлениях WP |
Правило выбора простое: один стандартный сценарий и нет разработчика – берите свежий поддерживаемый плагин с прямой отправкой в Bot API. Несколько форм, кастомная логика статусов, кнопки или требования к безопасности – свой код дешевле и надёжнее на дистанции.
Типовые ошибки при интеграции WordPress с Telegram и как их избежать
1. Утечка токена. Хардкод токена в functions.php, попадание в git-репозиторий или на форум со словами «помогите, не работает». Токен из паблика собирают ботами-сканерами за минуты. Лечение: /revoke в @BotFather, выпуск нового, хранение в wp-config.php, который исключён из git (.gitignore). Это часть общей гигиены безопасности сайта – комплексные меры (2FA для админки, защита от брутфорса, reCAPTCHA на формах) разобраны в статье «Безопасная авторизация в WordPress».
2. Отсутствие проверки chat_id. Опечатка в id – и заявки месяцами уходят в никуда или чужому пользователю. Перед запуском проверьте адресата:
$check = wp_remote_get(
'https://api.telegram.org/bot' . PT_TG_TOKEN . '/getChat?chat_id=' . PT_TG_CHAT_ID
);
if ( 200 !== wp_remote_retrieve_response_code( $check ) ) {
error_log( 'Telegram: неверный chat_id – ' . wp_remote_retrieve_body( $check ) );
}3. Блокировки Bot API. Рассылки без согласия пользователя, игнорирование ошибки 429. Лечение: очередь отправки с паузой retry_after секунд, рассылки только тем, кто сам написал боту и дал согласие.
4. Нет обработки ошибок wp_remote_post. Таймауты и недоступность api.telegram.org с хостинга – обычное дело. Минимум: проверка is_wp_error(), код ответа и error_log (как в функции pt_telegram_send выше). Иначе вы узнаете о поломке от клиентов.
5. Webhook без secret_token. Любой, кто найдёт URL endpoint'а, сможет слать поддельные обновления – например, фейковые обращения «клиентов». Параметр secret_token в setWebhook + проверка заголовка X-Telegram-Bot-Api-Secret-Token закрывают вопрос одной строкой.
6. Персональные данные. Заявка с ФИО и телефоном, летящая в общий групповой чат, – это обработка персональных данных по 152-ФЗ. Минимизируйте риски: в групповой чат отправляйте только необходимое (телефон можно частично маскировать), ограничьте состав группы, пропишите обработку в политике конфиденциальности сайта и получайте согласие в форме.
Чек-лист запуска и заключение
Перед тем как считать интеграцию готовой, пройдитесь по списку:
- бот создан в @BotFather, токен хранится в
wp-config.phpи не попадает в git; - chat_id проверен через
getChat, тестовая заявка дошла в нужный чат; - ошибки отправки пишутся в лог (
is_wp_error, код ответа); - webhook (если используется) установлен с
secret_token, endpoint всегда отвечает 200; - согласие на обработку персональных данных есть в форме.

С чего начать: с первого сценария. Уведомления о заявках – это 30 минут работы и сразу ощутимый эффект: ни одна заявка больше не зависнет в почтовом ящике. Двустороннюю поддержку и автоворонки с кнопками добавляйте по мере роста потребностей – архитектура из статьи это позволяет без переделок.
Следующий логичный шаг после настройки уведомлений – передача заявок в CRM, чтобы вести сделки, а не только получать сигналы: об этом подробно в статье «Интеграция WordPress с российскими CRM: Битрикс24, amoCRM и МойСклад».
Если задача выходит за рамки типовых сценариев – нестандартные формы, связка с CRM, сложные воронки со статусами и напоминаниями – эффективнее поручить настройку специалистам: интеграция под ключ обойдётся дешевле, чем неделя экспериментов собственного администратора.


