Данила Пантелеев
Плагины2026-09-1016 мин чтения20

WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом

WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом

WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом Введение: почему заявки из WordPress должны приходить в Telegram Классическая ситуация: клиент...

WordPress + Telegram: 3 готовых сценария автоматизации заявок, уведомлений и поддержки с рабочим кодом

Введение: почему заявки из WordPress должны приходить в Telegram

Классическая ситуация: клиент оставил заявку в форме на сайте, письмо упало на почту менеджеру, а менеджер проверяет ящик раз в час. К моменту звонка клиент уже ушёл к конкуренту, который ответил за три минуты. Скорость первой реакции на заявку – один из главных факторов конверсии лида в сделку, и почта здесь проигрывает мессенджеру по всем параметрам: доставка, пуш-уведомления на телефоне, привычка открывать.

Интеграция WordPress с Telegram решает эту проблему напрямую: заявка из формы Contact Form 7 или новый заказ WooCommerce приходит менеджеру в Telegram за секунды, а не за час. Но уведомления – только первый уровень. Полноценная wordpress telegram integration позволяет построить:

  1. Мгновенные уведомления о заявках из форм и заказах магазина.
  2. Двустороннюю поддержку: клиент пишет боту, менеджер отвечает из того же чата.
  3. Автоворонки с инлайн-кнопками: заявка приходит с кнопками «Взять в работу» / «Перезвонить», статус меняется прямо из Telegram, без CRM.

Менеджер проверяет уведомление о заявке с сайта в Telegram на смартфоне

В статье разберём все три сценария по шагам – от простого к сложному – с рабочим 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.

Схема связки WordPress и Telegram Bot API: от заявки на сайте до сообщения менеджеру

Регистрация бота через @BotFather

  1. Откройте @BotFather в Telegram, отправьте /newbot.
  2. Задайте имя и username (обязательно заканчивается на bot).
  3. Получите токен вида 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():

php
/** * Отправка сообщения в 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 – не в базе, не в репозитории:

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 заявка в такой ситуации терялась бы молча:

php
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:

php
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/) – надёжнее, переживает смену темы. Это предпочтительный вариант.

Проверка и отладка

Отправьте тестовую заявку. Если сообщение не пришло, смотрите по порядку:

  1. WP_Error в логе – хостинг блокирует исходящие соединения к api.telegram.org (встречается на части российских shared-хостингов). Решение: VPS, прокси или хостинг без таких ограничений.
  2. Код 400 – неверный chat_id (проверьте минус у группового id).
  3. Код 401 – неверный токен.
  4. Код 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, подставив свои значения):

text
https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://site.ru/wp-json/tg/v1/webhook&secret_token=<СЕКРЕТ>

Endpoint в WordPress

Регистрируем REST-маршрут как точку приёма:

php
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):

php
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:

php
$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-метки сохраняются на фронте и подставляются в скрытое поле формы.
javascript
// Сохраняем 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/WooCommerce1Бесплатно / 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 – и заявки месяцами уходят в никуда или чужому пользователю. Перед запуском проверьте адресата:

php
$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;
  • согласие на обработку персональных данных есть в форме.

Чек-лист запуска интеграции WordPress с Telegram

С чего начать: с первого сценария. Уведомления о заявках – это 30 минут работы и сразу ощутимый эффект: ни одна заявка больше не зависнет в почтовом ящике. Двустороннюю поддержку и автоворонки с кнопками добавляйте по мере роста потребностей – архитектура из статьи это позволяет без переделок.

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

Если задача выходит за рамки типовых сценариев – нестандартные формы, связка с CRM, сложные воронки со статусами и напоминаниями – эффективнее поручить настройку специалистам: интеграция под ключ обойдётся дешевле, чем неделя экспериментов собственного администратора.

Автор: Данила Пантелеев · 2026-09-10

Нужна помощь с реализацией?

Описывайте задачу – разберём что подойдёт под ваш проект

Написать в TelegramЗаказать на Kwork

Ещё статьи

📝
Безопасность2026-09-1210 мин

Безопасность плагинов WordPress: аудит, обновления и защита от уязвимостей

Безопасность плагинов WordPress: аудит, обновления и защита от уязвимостей Ядро WordPress обновляется централизованно и регулярно – и взламывают сайты на нём в подавляющем большинстве случаев не...

Читать
Метод fill() в ORM 1С-Битрикс: зачем он нужен и чем отличается от set()
Разработка2026-09-0610 мин

Метод fill() в ORM 1С-Битрикс: зачем он нужен и чем отличается от set()

Метод fill в ORM 1С-Битрикс: зачем он нужен и чем отличается от set Введение: почему fill и set постоянно путают Работая с EntityObject в D7 ORM, вы постоянно меняете значения полей сущности:...

Читать
Кэширование в Django: Redis, Memcached и кэширование фрагментов шаблонов
Django2026-07-2414 мин

Кэширование в Django: Redis, Memcached и кэширование фрагментов шаблонов

Кэширование в Django: Redis, Memcached и кэширование фрагментов шаблонов Введение: зачем Django-проекту кэширование Симптомы знакомы каждому, кто выкатывал Django под реальную нагрузку: страница...

Читать