Комментарии Telegram в WordPress: canonical URL и подключение виджета

При подключении комментариев Telegram к WordPress иногда вместо виджета появляется ошибка про отсутствие канонического URL. Текст сообщения обычно такой:

Discussion is not available at the moment. Please add a <link rel="canonical" href="%page_url%"> tag in the page header with the canonical URL of the current page.

Виджет не может привязать обсуждение к странице, пока в <head> нет канонического адреса текущей записи. Ниже: как добавить canonical и корректно подключить скрипт комментариев на single-страницах.

В чём суть проблемы

Canonical часто уже выводит WordPress или SEO-плагин (Yoast, Rank Math, SEO Framework и т.п.). Если тега нет (отключён в плагине, кастомная тема без вывода, конфликт шаблонов), Telegram Comments не находит URL страницы и отказывается показывать обсуждение.

Что такое канонический URL

Канонический URL: основной адрес страницы. Для поисковиков он задаёт предпочтительный вариант индексации (с www или без, со слешем или без). Для Telegram Comments тот же тег служит идентификатором: по нему система связывает тред с конкретной записью.

Добавление канонического URL

Если SEO-плагин canonical не выводит, его можно добавить вручную в functions.php дочерней темы. Пример для типов post и project (подставьте свои CPT при необходимости):

function add_canonical_url() {
    if ( is_singular( 'post' ) || is_singular( 'project' ) ) {
        echo '<link rel="canonical" href="' . esc_url( get_permalink() ) . '" />' . "\n";
    }
}
add_action( 'wp_head', 'add_canonical_url' );

Кратко по коду:

  • is_singular( 'post' ) / is_singular( 'project' ): только single записи и проектов, не архивы и не главная.
  • get_permalink(): постоянная ссылка текущей записи; её и отдаём как canonical. esc_url() страхует вывод.
  • add_action( 'wp_head', ... ): вставка в <head> страницы.

Важно: не дублируйте canonical. Если Yoast или другой SEO-плагин уже печатает rel="canonical", либо отключите вывод у плагина для нужных типов, либо не добавляйте свой хук. Два тега с разными URL хуже, чем один согласованный.

Подключение скрипта Telegram Comments

Сам виджет подключают скриптом с telegram.org. Имеет смысл грузить его только там, где нужны комментарии: на single постах и проектах, а не на всём сайте.

function add_telegram_script_before_comments() {
    if ( is_singular( 'post' ) || is_singular( 'project' ) ) {
        echo '
        <script async
                  src="https://telegram.org/js/telegram-widget.js?21"
                  data-telegram-discussion="drslon_channel"
                  data-comments-limit="30"
                  data-color="5282FF"
                  data-dark="0"></script>
        ';
    }
}
add_action( 'comment_form_before', 'add_telegram_script_before_comments' );

Параметры виджета:

  • data-telegram-discussion: username канала или ссылка на группу/топик, с которым связаны обсуждения (в примере drslon_channel; замените на свой).
  • data-comments-limit: сколько комментариев показывать (здесь 30).
  • data-color: акцентный цвет виджета в hex без #.
  • data-dark: 0 светлая тема, 1 тёмная.
  • Хук comment_form_before: вывод перед стандартной формой комментариев WordPress. Если форма отключена или шаблон другой, можно повесить на wp_footer или вывести скрипт в шаблоне single.

Полный фрагмент для functions.php

Canonical + виджет в одном блоке:

// Канонический URL в head (если его ещё не выводит SEO-плагин)
function add_canonical_url() {
    if ( is_singular( 'post' ) || is_singular( 'project' ) ) {
        echo '<link rel="canonical" href="' . esc_url( get_permalink() ) . '" />' . "\n";
    }
}
add_action( 'wp_head', 'add_canonical_url' );

// Скрипт Telegram Comments перед формой комментариев
function add_telegram_script_before_comments() {
    if ( is_singular( 'post' ) || is_singular( 'project' ) ) {
        echo '
        <script async
                  src="https://telegram.org/js/telegram-widget.js?21"
                  data-telegram-discussion="drslon_channel"
                  data-comments-limit="30"
                  data-color="5282FF"
                  data-dark="0"></script>
        ';
    }
}
add_action( 'comment_form_before', 'add_telegram_script_before_comments' );

Проверка

  1. Откройте single-запись, «Просмотр кода страницы» и найдите rel="canonical" с URL этой записи.
  2. Убедитесь, что на странице один такой тег, без расхождений с фактическим адресом.
  3. Проверьте загрузку telegram-widget.js и появление блока обсуждения (нужна привязка канала/группы к сайту в настройках Telegram).
  4. После правок functions.php сбросьте кэш страницы и CDN, если они есть.

Краткий итог

Ошибка «Discussion is not available…» почти всегда лечится появлением корректного <link rel="canonical"> на single-странице. Дальше остаётся вывести виджет только там, где нужны комментарии, и указать свой data-telegram-discussion. Если canonical уже даёт SEO-плагин, достаточно проверить его наличие и подключить скрипт без дублирования тега.

Источники и ссылки


Комментарии загружаются…