Install
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.zipWP TgPost (wp-tgpost)
Версия 0.1.0 · WordPress-плагин для автопубликации записей в Telegram-каналы через Bot API.
Один бот обслуживает сколько угодно каналов. У каждого канала свои условия отбора по
таксономиям, шаблон сообщения и расписание: публикация при выходе записи и ротация
старых записей без повторов. Картинка поста берётся из записи (готовый пин
github-repos, обложка, картинка из текста, мета-поле), а если её нет, плагин генерирует
инфографику с тезисами от модели. Пресеты те же, что в
wp-pinfeed. Анонс тоже может писать модель.
Для Bot API есть HTTP(S)- и SOCKS5-прокси. Плагин самодостаточен: ACF и CPT UI не нужны,
на любой сайт сети переносится копированием папки.
Быстрый старт
- В @BotFather создайте бота (
/newbot) и получите токен. - Telegram → Настройки → Боты: вставьте токен. Плагин проверит его запросом
getMe. - Добавьте бота администратором в каждый канал с правом «Публикация сообщений».
- 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, шрифты, фоновая задача), Журнал.
Фоновая задача
Как в соседних плагинах, у одного тика три равноправных триггера:
- WP-Cron раз в 10 минут, плюс разовый запуск к моменту, когда подходит время записи (события округляются до минуты);
- HTTP-эндпоинт за секретом:
curl "https://site/?tgpost_cron=СЕКРЕТ"(троттлинг раз в минуту); - прямой 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 не
разобрал разметку, сообщение повторно уходит простым текстом.