Разработка · 6 мин чтения

Интеграция с телеграм: заявки с сайта на WordPress без плагинов

Заявку с сайта проще получать не на почту, а сразу в Telegram, в чат, который я и так открываю каждые пять минут. Интеграция с телеграм для приёма заявок с WordPress не требует стороннего плагина: хватает бота, токена и десятка строк кода в functions.php или в обработчике формы. Ниже рабочая схема, которую ставлю клиентам на связках с Contact Form 7, WooCommerce и обычной HTML-формой без фреймворков.

Как работает интеграция с телеграм без плагинов

Форма на сайте отправляет POST-запрос, PHP-хук перехватывает данные, собирает текст сообщения и через wp_remote_post уходит запрос к Telegram Bot API методом sendMessage. Никакого постоянного соединения или опроса сервера не нужно: сообщение долетает за секунду, как обычный HTTP-запрос к внешнему API.

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

Создаю бота и узнаю chat_id для отправки сообщений

Бота регистрирую через @BotFather: команда /newbot, имя, юзернейм с окончанием bot, в ответ прилетает токен вида 123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Дальше нужен chat_id, куда слать заявки.

Если принимаю заявки лично, пишу боту любое сообщение и запрашиваю getUpdates, там будет мой id. Если заявки должны видеть несколько человек в отделе продаж, создаю группу, добавляю туда бота администратором, пишу в группу что угодно и снова смотрю getUpdates, у групп id отрицательный.

curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates"

curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
  -d "chat_id=<CHAT_ID>" \
  -d "text=Проверка связи"

Если второй curl вернул ok:true и сообщение прилетело в чат, токен и chat_id рабочие, можно переходить к коду на сайте.

Подключаю форму WordPress к Telegram через functions.php

Для самописной формы без плагинов делаю обработчик через admin-post.php: форма отправляется на wp-admin/admin-post.php с action, WordPress сам роутит запрос на нужную функцию.

add_action( 'admin_post_send_to_telegram', 'kd_send_to_telegram' );
add_action( 'admin_post_nopriv_send_to_telegram', 'kd_send_to_telegram' );

function kd_send_to_telegram() {
    if ( ! isset( $_POST['kd_nonce'] ) || ! wp_verify_nonce( $_POST['kd_nonce'], 'kd_form' ) ) {
        wp_die( 'Проверка не пройдена' );
    }

    $name  = sanitize_text_field( $_POST['name'] ?? '' );
    $phone = sanitize_text_field( $_POST['phone'] ?? '' );

    $token   = 'ВАШ_ТОКЕН';
    $chat_id = 'ВАШ_CHAT_ID';

    wp_remote_post( "https://api.telegram.org/bot{$token}/sendMessage", array(
        'body' => array(
            'chat_id' => $chat_id,
            'text'    => "Новая заявка с сайта\nИмя: {$name}\nТелефон: {$phone}",
        ),
    ) );

    wp_redirect( home_url( '/spasibo/' ) );
    exit;
}

В форме на странице добавляю скрытое поле action со значением send_to_telegram и nonce-поле через wp_nonce_field, метод POST, действие на admin-post.php. Токен и chat_id храню в wp-config.php через define, а не прямо в коде темы, чтобы не светить их при обновлении файлов.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Что делать с Contact Form 7 и WooCommerce без установки моста

У Contact Form 7 есть хук wpcf7_mail_sent, который срабатывает после успешной отправки письма, и в нём можно достать все поля формы без единого дополнительного плагина.

add_action( 'wpcf7_mail_sent', 'kd_cf7_to_telegram' );

function kd_cf7_to_telegram( $contact_form ) {
    $submission = WPCF7_Submission::get_instance();
    if ( ! $submission ) {
        return;
    }

    $data  = $submission->get_posted_data();
    $token   = 'ВАШ_ТОКЕН';
    $chat_id = 'ВАШ_CHAT_ID';
    $text  = "Заявка с формы: {$contact_form->title()}\n";

    foreach ( $data as $key => $value ) {
        if ( is_string( $value ) && $value !== '' ) {
            $text .= "{$key}: {$value}\n";
        }
    }

    wp_remote_post( "https://api.telegram.org/bot{$token}/sendMessage", array(
        'body' => array(
            'chat_id' => $chat_id,
            'text'    => $text,
        ),
    ) );
}

Для WooCommerce беру хук woocommerce_thankyou или woocommerce_new_order и собираю в сообщение состав заказа, сумму и способ оплаты. Если магазин принимает платежи через T‑Bank, полезно сразу писать в тексте статус оплаты, чтобы менеджер видел не просто заказ, а уже оплаченный заказ и брал его в работу без проверки в личном кабинете эквайринга.

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

Учитываю лимиты и безопасность отправки

У Telegram Bot API есть ограничение около 30 сообщений в секунду на бота и около 20 в минуту в один групповой чат. Для формы обратной связи это не проблема, а вот для магазина с потоком заказов в пиковые часы стоит закладывать очередь через cron или через отдельный сервис, а не слать напрямую из хука на каждый заказ.

Входящие данные из формы всегда экранирую перед отправкой: если в тексте есть символы разметки Markdown или HTML и в sendMessage указан parse_mode, чужой ввод может сломать форматирование сообщения. Проще не указывать parse_mode вообще и отправлять обычный текст, тогда экранировать почти нечего.

Персональные данные из заявок (имя, телефон, почта) храню только на сервере в РФ, где стоит сам WordPress, и не дублирую в сторонние облачные таблицы за рубежом. Сам чат в Telegram для внутренней команды это одно, а вот выгрузка контактов клиентов в зарубежный сервис для аналитики уже требует отдельной проверки по 152-ФЗ.

Сравниваю способы: код на functions.php, n8n и готовый плагин

Способ Что настраивается Гибкость
Код в functions.php или отдельном обработчике Хук на отправку формы, запрос к Bot API Полная, меняю текст, кнопки и условия под задачу
Сценарий в n8n Webhook-нода на сайте, HTTP-запрос к Telegram, без правки кода темы Высокая, легко добавить ветку в CRM или таблицу без нового кода
Готовый плагин-интегратор Установка и настройка в админке Ограничена возможностями конкретного плагина

Если сайт уже у меня на поддержке (от 15 000 ₽ в месяц), такую доработку добавляю в текущую работу. Если это разовая задача на сайте, который я вижу впервые, оцениваю стоимость после того, как посмотрю, сколько форм на сайте и куда заявки должны попадать кроме Telegram.

Когда клиент просит собрать всё через no-code без изменения кода WordPress, обычно предлагаю n8n: одна нода принимает вебхук с формы, другая пишет в Telegram, третья параллельно создаёт карточку в CRM. Такой сценарий с несколькими системами беру от 25 000 ₽. Двусторонний бот с командами и ответами клиенту на aiogram, а не просто пересылка заявок, оцениваю от 30 000 ₽, потому что там добавляется логика диалога и хранение состояния.

Если у клиента сайт на Tilda, а не на WordPress, принцип тот же, но код вставляется через встроенный редактор скриптов страницы, такую разовую доработку обычно веду от 3 000 ₽.

Частые вопросы

Нужен ли особый хостинг, чтобы WordPress мог отправлять запросы в Telegram

Нужен хостинг, с которого разрешены исходящие HTTPS-запросы к api.telegram.org. На практике это почти любой обычный хостинг, но встречаются провайдеры, которые режут исходящие соединения по расписанию или блокируют определённые IP-диапазоны Telegram. Если wp_remote_post возвращает ошибку соединения, а curl с того же сервера тоже не проходит, дело в сетевых ограничениях хостинга, а не в коде.

Как защититься от спама ботов, которые долбят форму на сайте

Добавляю honeypot-поле, скрытое от человека через CSS, но видимое ботам, и проверку nonce на стороне PHP. Если honeypot заполнен или nonce не совпадает, запрос в Telegram вообще не уходит. Капчу ставлю только если спам продолжается после этого, потому что она снижает конверсию формы для реальных посетителей.

Можно ли получать заявки одновременно в Telegram и на почту

Да, это просто два независимых действия в одном обработчике: сначала отправляю письмо через wp_mail как обычно, следом делаю запрос wp_remote_post к Telegram. Одно не мешает другому, а если Telegram по какой-то причине недоступен, письмо всё равно уйдёт, потому что вызовы не связаны между собой.

Что делать, если часть посетителей сайта не пользуется Telegram

Для клиента интеграция с телеграм касается только внутреннего уведомления команды, а не способа связи с посетителем сайта. Форма на сайте остаётся обычной, посетитель просто заполняет поля и жмёт отправить, а куда уходит уведомление, будь то почта, Telegram или оба канала сразу, для него никак не проявляется.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно