WP Manifestindependent plugin directory
manifest / social / wp-tgpost

WP TgPost

WordPress Plugin for Telegram channel autoposting

★ 0stars

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/geliorn/wp-tgpost/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

WP TgPost (wp-tgpost)

Версия 0.1.0 · WordPress-плагин для автопубликации записей в Telegram-каналы через Bot API. Один бот обслуживает сколько угодно каналов. У каждого канала свои условия отбора по таксономиям, шаблон сообщения и расписание: публикация при выходе записи и ротация старых записей без повторов. Картинка поста берётся из записи (готовый пин github-repos, обложка, картинка из текста, мета-поле), а если её нет, плагин генерирует инфографику с тезисами от модели. Пресеты те же, что в wp-pinfeed. Анонс тоже может писать модель. Для Bot API есть HTTP(S)- и SOCKS5-прокси. Плагин самодостаточен: ACF и CPT UI не нужны, на любой сайт сети переносится копированием папки.

Быстрый старт

  1. В @BotFather создайте бота (/newbot) и получите токен.
  2. Telegram → Настройки → Боты: вставьте токен. Плагин проверит его запросом getMe.
  3. Добавьте бота администратором в каждый канал с правом «Публикация сообщений».
  4. Telegram → Добавить канал: выберите бота и укажите канал. Публичный канал задаётся как @username или t.me/username, закрытый — числовым ID -100…. ID закрытого канала покажет кнопка «Найти каналы бота» в настройках. Отметьте типы записей и условия, затем опубликуйте канал. После сохранения плагин сам проверит, что бот может публиковать (getChat + getChatMember). Повторить проверку можно кнопкой «Проверить доступ бота».

Как это работает: очередь

Telegram, в отличие от Pinterest, сам ничего не забирает, поэтому публикует плагин. Каждая пара «запись × канал» — это строка в таблице {prefix}wptp_queue с уникальным ключом p<запись>:c<канал>. Поэтому запись уходит в канал не больше одного раза, и это гарантирует база данных. Повторить можно только вручную, кнопкой «Отправить ещё раз».

  • При публикации: хук wp_after_insert_post срабатывает после сохранения рубрик и мета, в том числе для редактора, REST, импорта и отложенных записей. Новая запись встаёт в очередь каждого подходящего канала на время «публикация + задержка».
  • Ротация: раз в N часов канал получает одну подходящую запись, которой в нём ещё не было. Порядок — сначала старые, сначала новые, случайно или по числовому мета-полю. Можно ограничить возраст записи. Когда записи кончатся, ротация остановится сама (одна отметка в журнале).
  • Перед отправкой запись проверяется ещё раз: опубликована ли, нет ли флажка «Не публиковать в Telegram», подходит ли под условия канала. Если не подходит, отправка помечается как «пропущено». Здесь же модель пишет анонс и тезисы.
  • Ограничения задаются на весь канал, и все они необязательны: пусто или 0 — без ограничения. Это задержка после публикации, «не чаще одного поста в N минут», тихие часы (по времени сайта, можно через полночь) и дневной лимит. Записи, которые не уместились, ждут своей очереди: массовый импорт не превращается в залп сообщений.

Статусы: в очереди → отправлено (номер сообщения и ссылка на пост сохраняются), ошибка (после 6 попыток) или пропущено. На ошибку 429 плагин ждёт столько, сколько сказал Telegram, и это не считается попыткой. Остальные ошибки повторяются через 5 мин, 15 мин, 1 ч, 3 ч и 6 ч. Если группа стала супергруппой, плагин сам переходит на её новый ID.

Настройки канала

Какие записи

Это те же поля, что у ленты pinfeed: типы записей, условия по таксономиям (любой из, ни один из, все сразу, есть любой термин, нет терминов; флажок «с дочерними»; связь между условиями И / ИЛИ; термины задаются слагами), исключённые ID и флажок у записи.

Сообщение

Поле Что делает
Формат Картинка + подпись (по умолчанию, до 1024 символов) / текст + превью ссылки (до 4096, превью Telegram строит из OG-тегов) / только текст
Текст Шаблон с подстановками и HTML-разметкой Telegram: <b> <i> <u> <s> <code> <pre> <a href> <blockquote [expandable]> <tg-spoiler>. Значения подстановок и остальной текст экранируются
Предел длины 0 — предел Telegram. Если текст длиннее, сначала сокращается самая длинная подстановка (обычно отрывок) по границе слова; если этого мало — все. Заголовок и хэштеги остаются целыми
Кнопка-ссылка Inline-кнопка под постом («Читать на сайте»). Пусто — без кнопки
Без звука disable_notification

По умолчанию шаблон такой: <b>{tg_title|llm_title|seo_title|title}</b>, пустая строка, {tg_text|llm_description|seo_description|short_description|excerpt|content:600}, пустая строка, {hashtags:post_tag:5}.

Подстановки те же, что в pinfeed: {title} {excerpt} {content:N} {seo_*} {terms:…} {hashtags:…} {meta:…} {gh_*} {primary_keyword} {site_*}, цепочки {a|b|"текст"}. Новые подстановки:

Подстановка Значение
{tg_title} {tg_text} Ручной текст из блока «Telegram» у записи
{llm_title} {llm_description} Анонс от модели
{link} Ссылка на запись с UTM-метками
{channel_title} {channel_slug} Канал
{palette} Вариант картинки (для utm_content)

Картинка

Работает так же, как в pinfeed. 1. Плагин перебирает источники сверху вниз, порядок меняется перетаскиванием. Источники: готовый пин github-repos, изображение записи (обложка), первое изображение в тексте, мета-поле записи (ID вложения или URL; ключ вводится в пункте). Отдельного поля картинки у записи нет. 2. Горизонтальные картинки по умолчанию берутся как есть: в Telegram они выглядят хорошо. 3. Если картинки нет, по умолчанию генерируется инфографика. Можно вместо этого отправлять текст с превью ссылки или не отправлять запись. Если инфографику собрать не удалось (нет ключей модели, мало текста), уйдёт текст с превью.

Картинку плагин отправляет ссылкой: Telegram скачивает её сам, до 5 МБ. С локального сайта (*.local, *.test, localhost) картинка уходит файлом, до 10 МБ. Если Telegram не смог скачать картинку по ссылке, плагин сам повторит отправку файлом. Сгенерированные картинки лежат в uploads/wptp-images/<ID записи>/ и в медиатеку не попадают.

Инфографика и пресеты

Экран Пресеты картинок перенесён из pinfeed один к одному: те же поля, пределы значений, живой предпросмотр на записи, экспорт и импорт JSON. Все поля: цвета (из пресета / палитра темы / ротация палитр) и раскладка цветов, размер, поля, фон, формат, шрифт; фон-картинка с фильтрами и затемнением; градиент; акцентная полоса; заголовок (кегль с автоподбором, строки, выравнивание); список или сетка с колонками и зазорами; плашки; маркер; метка; текст тезиса; подпись; логотип. Пресет, экспортированный из pinfeed, импортируется без правок. Кнопка «Импортировать пресеты из WP PinFeed» копирует их с префиксом pf-.

Отличаются только стартовые значения: квадрат 1080×1080, 4 тезиса, кегли под меньшую высоту. Вертикаль 2:3 в ленте Telegram слишком высокая, но её можно выставить в пресете вручную. Тезисы задаются вручную в блоке «Telegram» записи или их пишет модель. Текст не обрезается: если тезис не влезает, модель переписывает его короче, иначе он убирается целиком.

Анонс от модели

Включается в канале. Модель получает заголовок, описание, термины и начало текста и возвращает {title, description} — это {llm_title} и {llm_description}. Настраиваются язык, длина, ключевые слова и свободные требования. Модель вызывается перед отправкой (запись в очереди ждёт ответа, пока есть бюджет запросов) или заранее, пока запись ждёт своё время. Ответ кэшируется в _wptp_llm. Если модель ошиблась, запись откладывается на 6 часов, а шаблон берёт следующий вариант цепочки. Провайдеры те же, что в соседних плагинах: Yandex, DeepSeek, Qwen, Timeweb, OpenRouter. Кнопка «Скопировать провайдера и ключи» умеет брать их из llm-agent-articles, llm-agent-github-repos и wp-pinfeed.

Ссылка

UTM-метки по умолчанию: utm_source=telegram, utm_medium=social, utm_campaign={channel_slug}, utm_content={palette}. Подстановки работают, метки отключаются флажком.

Соединение с Telegram и прокси

Настройки → Соединение с Telegram. Эти настройки действуют только на запросы к Bot API, остальной сайт ходит в сеть как обычно.

  • HTTP(S)-прокси: адрес, порт, логин и пароль.
  • SOCKS5: DNS резолвится на стороне прокси (CURLPROXY_SOCKS5_HOSTNAME), это важно при блокировке по DNS. Логин и пароль поддерживаются. Нужно PHP-расширение cURL; если его нет, плагин так и пишет.
  • Адрес Bot API: вместо https://api.telegram.org можно указать свой telegram-bot-api или обратный прокси (nginx, Cloudflare Worker).
  • Кнопка «Проверить соединение с Telegram» (и wp tgpost ping) делает getMe и показывает время ответа.

MTProxy не поддерживается и не может поддерживаться. Он проксирует MTProto — протокол, на котором работают приложения Telegram. Bot API — это обычный HTTPS, и через MTProxy он не ходит. Если MTProxy уже стоит на своём сервере, поднимите там же SOCKS5 (например, dante или ssh -D) и укажите его в плагине.

Блок «Telegram» у записи

Заголовок и текст анонса ({tg_title}, {tg_text}), тезисы для инфографики, «Другой цвет инфографики» и «Не публиковать в Telegram». Для администратора здесь же статус записи в каждом канале (отправлено и ссылка на пост / в очереди до… / ошибка / пропущено) и ссылки «Отправить сейчас» и «Отправить ещё раз». Ручная отправка не смотрит на условия и расписание канала, но учитывает флажок «Не публиковать».

Админка

  • Обзор: каналы (куда, когда, отправлено за сутки и всего, в очереди, сколько осталось для ротации, может ли канал отправлять прямо сейчас) и очередь с фильтрами по каналу и статусу. Действия в очереди: отправить сейчас, пропустить, убрать из очереди. Строка, убранная из очереди, снова сможет попасть в канал, а пропущенная — нет.
  • Каналы — список CPT tgchannel. Управлять каналами могут только администраторы.
  • Пресеты картинок, Настройки (боты, соединение, отправка, LLM, шрифты, фоновая задача), Журнал.

Фоновая задача

Как в соседних плагинах, у одного тика три равноправных триггера:

  1. WP-Cron раз в 10 минут, плюс разовый запуск к моменту, когда подходит время записи (события округляются до минуты);
  2. HTTP-эндпоинт за секретом: curl "https://site/?tgpost_cron=СЕКРЕТ" (троттлинг раз в минуту);
  3. прямой PHP CLI: php wp-content/plugins/wp-tgpost/cron.php.

За один тик плагин планирует ротацию, отправляет то, что подошло по времени (настройка «Сообщений за тик», по умолчанию 20 на все каналы), а оставшийся бюджет запросов к модели тратит на записи, которые ещё ждут своего времени.

WP-CLI

wp tgpost channels                     # каналы: куда, сколько подходит/отправлено, что сдерживает
wp tgpost bots [<bot>]                 # боты; с id — getMe и чаты из getUpdates
wp tgpost check <channel>              # может ли бот публиковать в канал
wp tgpost ping                         # соединение с Bot API (прокси, адрес)
wp tgpost preview <post> <channel> [--render]
wp tgpost send <post> <channel> [--again]
wp tgpost queue [--channel=<id>] [--status=failed] [--limit=50]
wp tgpost tick
wp tgpost import-llm --from=pinfeed    # или articles, github_repos

Хуки

Хук Назначение
wptp_query_args (filter) Последнее слово о WP_Query канала ($mode: match / rotation)
wptp_placeholder (filter) Свои подстановки
wptp_image_sources / wptp_image_source (filter) Свой источник картинки
wptp_message (filter) Последнее слово об одном сообщении (формат, текст, ссылка, картинка)
wptp_profiles (filter) Свои профили быстрого старта
wptp_metabox_post_types (filter) Типы записей с блоком «Telegram»

Данные плагина

  • CPT tgchannel — каналы (непубличный), мета _wptp_*, _wptp_check, _wptp_last_rotation_at.
  • Таблица {prefix}wptp_queue.
  • Опции: wptp_settings, wptp_bots (токены; не загружается автоматически), wptp_infographic_presets, wptp_log, wptp_last_tick, wptp_palette_cursor, wptp_db_ver.
  • Мета записей: _wptp_title, _wptp_text, _wptp_theses_manual, _wptp_exclude, _wptp_llm, _wptp_theses, _wptp_palette.
  • Файлы: uploads/wptp-images/, uploads/wptp-fonts/, журнал uploads/wptp-tgpost.log.

Удаление плагина стирает всё перечисленное, включая таблицу. Посты, уже опубликованные в Telegram, остаются.

Требования

  • WordPress 6.0+, PHP 7.4+.
  • PHP cURL — для прокси. Без прокси подходит любой транспорт WordPress.
  • GD с FreeType — для инфографики. Без него записи без картинки уходят текстом с превью ссылки.
  • Ключи одной из моделей — для тезисов инфографики и, если включено, анонса.

Безопасность

Каналы, боты, настройки и ручная отправка доступны только с правом manage_options. Все формы и действия защищены нонсами. Токен в форме не показывается, а в журнале, ошибках и CLI маскируется (123456:AAH…xYz): он входит в URL Bot API, и сообщения cURL могут его повторить. HTTP-триггер работает по секрету (hash_equals) с троттлингом. Значения подстановок экранируются под HTML Telegram. Если Telegram не разобрал разметку, сообщение повторно уходит простым текстом.