Declaration of VAR

and some other stuff

Плагин WordPress для бота Telegram

2015-11-08 00:57:03 +0100

2015-11-08 00:57:03 +0100 | Comments

Хотим, чтобы Telegram-бот постил в канал о новых постах и комментариях на WordPress-сайте. Под такое дело напишем плагин для WordPress.

Предполагается, что у вас уже есть канал в Телеграм (для примера, @testchannel), где размещаются новости сайта; а также имеется бот, вы знаете его токен, и он входит в число администраторов канала.

Идея такова: при событии публикации поста или комментария отправлять HTTP-запрос к боту с помощью cURL, а бот будет постить объявление на канале.

Итак, идём туда, где лежит наш сайт на WordPress (у меня сейчас версия 4.3.1), переходим в каталог с плагинами (/wp-content/plugins/), создаём там новый каталог, например notify-telegram-bot, а в нём создаём файл notify-telegram-bot.php следующего содержания:

<?php
    /*
      Plugin Name: Оповещение для бота в Телеграм
      Description: Отправляет боту сообщение о новом посте
      Version: 1.0
      Author: ТВАЁИМЯ
      Author URI: mailto:ТВАЁИМЯ@udaff.com
      License: MIT
    */

    // активация плагина
    function ntb_plugin_install() { }
    register_activation_hook( __FILE__, 'ntb_plugin_install' );

    // функция отправки оповещения
    function publish_on_channel( $ID, $post ) {
      // если пост опубликован и это не апдейт
      if ($post->post_status == "publish" && $post->post_modified_gmt == $post->post_date_gmt)
      {
        try
        {
          // можно добавить название поста: $post->post_title
          // но Open Graph и так всё вытащит в превью (если стоит плагин WP Open Graph)
          $msg = "Новая статья на сайте! Ссылка: " . get_permalink( $ID );
          // так как пишем в канал, то вместо ID пользователя-получателя подставляется имя канала
          $ch = curl_init("https://api.telegram.org/botТУТПОСТАВИТЬТОКЕНБОТА/sendMessage?chat_id=@testchannel&text=" . $msg);
          curl_setopt($ch, CURLOPT_POST, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
          curl_exec($ch);
          curl_close ($ch);
        }
        catch(Exception $ex)
        {
          // тут какая-нибудь обработка ошибки
        }
      }
    }
    // цепляемся к hook'у публикации поста
    add_action( 'publish_post', 'publish_on_channel', 10, 2 );

    // отправка оповещения о новом комментарии
    function publish_comment_on_channel($commentID, $isApproved) {
        // сам комментарий
        $cmmnt = get_comment($commentID);
        // пост
        $pst = get_post($cmmnt->comment_post_ID);
        
        try
        {
          // сообщение будет с поддержкой Markdown
          $msg = "Новый комментарий к посту \"_" . $pst->post_title . "_\" (" . str_replace("_", "\_", get_permalink($cmmnt->comment_post_ID)) . ")!" . "%0A%0A"
            . "*Автор*: " . $cmmnt->comment_author . "%0A"
            . "*Опубликован*: " . ($cmmnt->comment_approved == 1 ? "да" : "нет") . "%0A"
            . "*Текст комментария*: " . $cmmnt->comment_content;
          $ch = curl_init("https://api.telegram.org/botТУТПОСТАВИТЬТОКЕНБОТА/sendMessage?chat_id=@testchannel&text=" . trim(preg_replace('/\s+/', ' ', $msg)) . "&parse_mode=Markdown&disable_web_page_preview=true");
          curl_setopt($ch, CURLOPT_POST, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
          curl_exec($ch);
          curl_close ($ch);
        }
        catch(Exception $ex)
        {
          // тут какая-нибудь обработка ошибки
        }
    }
    // цепляемся к hook'у добавления комментария
    add_action( 'comment_post', 'publish_comment_on_channel', 10, 2 );

Разумеется, бот может писать не только в канал, но и конкретному пользователю (списку пользователей) или в группу - для этого просто нужно вместо имени канала поставить ID пользователя или группы.

Очевидно, что новый метод для бота создавать не нужно, так как это простая отправка сообщения.

Теперь идём в админку сайта и в разделе плагинов активируем только что созданный. Всё, теперь при публикации нового поста, бот будет получать об этом сигнал и постить в канал заданное сообщение с ссылкой.

Подробнее о создании плагинов для WordPress вы можете прочитать в документации.

А вот все мои плагины для интеграции Telegram с CMS.