{"id":315714,"date":"2026-05-27T08:46:59","date_gmt":"2026-05-27T08:46:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dfx-telegram-channel-feed\/"},"modified":"2026-05-27T16:02:59","modified_gmt":"2026-05-27T16:02:59","slug":"dfx-feed-for-telegram-channels","status":"publish","type":"plugin","link":"https:\/\/fuc.wordpress.org\/plugins\/dfx-feed-for-telegram-channels\/","author":10024063,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.3","stable_tag":"2.0.3","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"DFX Feed for Telegram Channels","header_author":"David Mar\u00edn","header_description":"Display messages from one or more Telegram channels on your WordPress site, with full media support, via shortcode, Gutenberg block, or Elementor widget.","assets_banners_color":"","last_updated":"2026-05-27 16:02:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/davefx\/dfx-feed-for-telegram-channels","header_author_uri":"http:\/\/www.davefx.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":76,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"2.0.1":{"tag":"2.0.1","author":"DaveFX","date":"2026-05-27 08:45:35"},"2.0.2":{"tag":"2.0.2","author":"DaveFX","date":"2026-05-27 09:19:53"},"2.0.3":{"tag":"2.0.3","author":"DaveFX","date":"2026-05-27 16:02:59"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3550941,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3550941,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3550941,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"dfxfftc\/channel-feed":{"name":"dfxfftc\/channel-feed","title":"Dfxfftc Channel Feed"},"dfxfftc\/channel-browser":{"name":"dfxfftc\/channel-browser","title":"Dfxfftc Channel Browser"}},"tagged_versions":["2.0.1","2.0.2","2.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[1220,5325,252,80,9171],"plugin_category":[43],"plugin_contributors":[141515],"plugin_business_model":[],"class_list":["post-315714","plugin","type-plugin","status-publish","hentry","plugin_tags-block","plugin_tags-channel","plugin_tags-feed","plugin_tags-shortcode","plugin_tags-telegram","plugin_category-customization","plugin_contributors-davefx","plugin_committers-davefx"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/dfx-feed-for-telegram-channels\/assets\/icon.svg?rev=3550941","icon":"https:\/\/ps.w.org\/dfx-feed-for-telegram-channels\/assets\/icon.svg?rev=3550941","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>DFX Feed for Telegram Channels mirrors messages from one or more Telegram channels onto your WordPress site. Messages are fetched via a Telegram bot you control, stored locally as a custom post type, and rendered through a shortcode, Gutenberg block, or Elementor widget. Both public and private channels are supported.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Three rendering surfaces<\/strong> \u2014 shortcode, Gutenberg block, or Elementor widget. The block exposes per-instance styling controls (border, background, padding, typography per element).<\/li>\n<li><strong>Full media support<\/strong> \u2014 photos at the highest resolution available, video and animation thumbnails, static stickers, animated TGS stickers via Lottie, and WEBM video stickers.<\/li>\n<li><strong>Bot token never reaches the client<\/strong> \u2014 Telegram file URLs (which embed your bot token) are resolved server-side; the frontend only receives a token-less proxy URL. Media is cached on disk for performance.<\/li>\n<li><strong>Edits sync automatically<\/strong> with a small \"(edited)\" marker carrying the edit timestamp.<\/li>\n<li><strong>Background refresh every 2 minutes<\/strong> via WP-cron, plus on-demand refresh on frontend visits as a fallback for low-traffic sites.<\/li>\n<li><strong>Per-message admin controls<\/strong> \u2014 Hide (reversible, suppresses on frontend) and Move to Trash (sticky against refresh) row actions.<\/li>\n<li><strong>Theme template overrides<\/strong> \u2014 drop <code>dfxfftc\/feed.php<\/code> or <code>dfxfftc\/browser.php<\/code> into your theme to fully customize the output.<\/li>\n<li><strong>Works with private channels<\/strong> if your bot is admin in them.<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<ul>\n<li>Use <code>[dfxfftc_channel_feed channel=\"yourchannel\" count=\"5\"]<\/code> to show the N latest messages.<\/li>\n<li>Use <code>[dfxfftc_channel_browser channel=\"yourchannel\"]<\/code> to show the full channel history.<\/li>\n<\/ul>\n\n<h3>Behaviour and known limitations<\/h3>\n\n<ul>\n<li><strong>Bot-only access.<\/strong> Messages are fetched via the Telegram Bot API, which only sees posts that arrived in the channel after the bot was added. There is no access to historical messages from before that point.<\/li>\n<li><strong>Background refresh every 2 minutes.<\/strong> The plugin schedules a WP-cron task that pulls fresh updates from Telegram for every channel you have stored data for. This keeps the local feed within ~2 minutes of the live channel without any manual action. Note that WP-cron only fires when traffic hits your site \u2014 on low-traffic installations you may want to disable WP-cron and trigger <code>wp-cron.php<\/code> from a real system cron job for reliable execution. The on-demand refresh on frontend visits is also kept as a fallback.<\/li>\n<li><strong>Edits sync automatically.<\/strong> When a message is edited in Telegram, the local copy is updated on the next refresh and a small \"(edited)\" marker is shown next to the date.<\/li>\n<li><strong>Deletions are not syncable automatically.<\/strong> The Telegram Bot API does not notify bots about channel message deletions \u2014 there is no <code>deleted_channel_post<\/code> update type. To remove a message that has been deleted in Telegram from the local feed, use the per-message <strong>\"Move to Trash\"<\/strong> admin row action. Trashed messages are sticky: refresh will not bring them back.<\/li>\n<li><strong>Hide vs. Trash.<\/strong> Use <strong>Hide<\/strong> to keep a message in the database but suppress it on the frontend (reversible via \"Unhide\"). Use <strong>Move to Trash<\/strong> for a permanent local removal.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the <strong>Telegram Bot API<\/strong> to fetch channel messages, resolve media file URLs, and verify bot credentials.<\/p>\n\n<h4>What data is sent<\/h4>\n\n<ul>\n<li><strong>Bot token<\/strong> (configured in Settings) \u2014 sent with every API call to authenticate your bot.<\/li>\n<li><strong>Channel username or ID<\/strong> \u2014 sent when fetching messages via <code>getUpdates<\/code> and when testing the bot configuration via <code>getChatMember<\/code>.<\/li>\n<li><strong>File IDs<\/strong> \u2014 sent when resolving media URLs via <code>getFile<\/code> so the plugin can proxy photos, stickers, and video thumbnails to the frontend without exposing the bot token.<\/li>\n<\/ul>\n\n<h4>When data is sent<\/h4>\n\n<ul>\n<li>On every WP-cron background refresh cycle (every ~2 minutes when site traffic is present).<\/li>\n<li>On frontend page loads when the on-demand refresh fallback fires (at most once per 10 minutes per channel).<\/li>\n<li>When an admin clicks \"Refresh Messages\" in the admin list page.<\/li>\n<li>When an admin clicks \"Test Connection\" on the Settings page.<\/li>\n<li>When a visitor views a page containing a message with media (the media proxy fetches the file from Telegram on first access and caches it locally).<\/li>\n<\/ul>\n\n<h4>Service provider<\/h4>\n\n<p>Telegram Bot API, provided by Telegram FZ-LLC.<\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/telegram.org\/tos<\/li>\n<li>Privacy Policy: https:\/\/telegram.org\/privacy<\/li>\n<li>Bot API documentation: https:\/\/core.telegram.org\/bots\/api<\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>GPL v3 or later<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to the <code>\/wp-content\/plugins\/<\/code> directory, or install via the WordPress plugins screen.<\/li>\n<li>Activate the plugin through the 'Plugins' menu.<\/li>\n<li>In WordPress admin, go to <strong>Settings \u2192 Telegram Feed<\/strong>.<\/li>\n<li>Create a Telegram bot via <a href=\"https:\/\/t.me\/botfather\">@BotFather<\/a>, paste the bot token into the settings page, and save.<\/li>\n<li>Add the bot as an <strong>administrator<\/strong> of every channel you want to mirror.<\/li>\n<li>Add a shortcode such as <code>[dfxfftc_channel_feed channel=\"@yourchannel\" count=\"10\"]<\/code> to a page, or use the \"Feed for Telegram Channels\" Gutenberg block \/ Elementor widget.<\/li>\n<\/ol>\n\n<p>Note: messages posted in the channel <strong>before<\/strong> the bot was added are not retrievable via the Bot API.<\/p>\n\n<!--section=changelog-->\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Add plugin icons for the WordPress.org directory page.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Replace all remaining old plugin name references with new name.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Sanitize nonce inputs with sanitize_text_field(wp_unslash()) before wp_verify_nonce().<\/li>\n<li>Escape _n() translation output in bulk action admin notices.<\/li>\n<li>Rename dfxTgAdmin JS global to dfxfftcAdmin for prefix consistency.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Renamed plugin from \"DFX Telegram Channel Feed\" to \"DFX Feed for Telegram Channels\" to comply with WordPress.org trademark naming guidelines.<\/li>\n<li>Changed plugin slug to <code>dfx-feed-for-telegram-channels<\/code> and internal prefix from <code>dfxtgfeed<\/code> to <code>dfxfftc<\/code>.<\/li>\n<li>Text domain updated to <code>dfx-feed-for-telegram-channels<\/code>.<\/li>\n<li>Replaced all <code>_e()<\/code> with <code>esc_html_e()<\/code> and wrapped unescaped <code>__()<\/code> outputs in <code>esc_html()<\/code> for proper output escaping.<\/li>\n<li>Moved inline <code>&lt;script&gt;<\/code> and <code>&lt;style&gt;<\/code> blocks to use <code>wp_add_inline_script<\/code> and <code>wp_add_inline_style<\/code> per WordPress enqueue best practices.<\/li>\n<li>Bundled Lottie library locally instead of loading from cdnjs.cloudflare.com.<\/li>\n<li>Documented Telegram Bot API usage in the \"External services\" readme section.<\/li>\n<li>Lowered admin menu position to avoid colliding with core WordPress menu items.<\/li>\n<li>Made GitHub repository public so the Plugin URI resolves correctly.<\/li>\n<li>Added DB migration path from <code>dfxtgfeed_*<\/code> identifiers to <code>dfxfftc_*<\/code> for existing installs.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed Plugin Check warnings: text domain now matches the plugin slug, and the unused <code>Domain Path<\/code> header was removed.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Removed the experimental \"Sync Deletions\" feature (which scraped the public <code>t.me\/s\/&lt;channel&gt;<\/code> preview) ahead of WordPress.org submission.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Internal release (not published to WordPress.org).<\/li>\n<\/ul>","raw_excerpt":"Display messages from Telegram channels on your WordPress site, with full media support, via shortcode, Gutenberg block, or Elementor widget.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315714"}],"author":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/davefx"}],"wp:attachment":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315714"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315714"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315714"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315714"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315714"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}