Вместо комментариев из Telegram на странице записи иногда появляется ошибка:
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.
Так Discussion Widget от Telegram сообщает, что не может понять, к какой странице привязать обсуждение. Ему нужен тег <link rel="canonical"> в <head> с адресом текущей страницы. Ниже разберу, откуда берётся ошибка в WordPress и как подключить виджет только на страницах записей.
Как работает Discussion Widget
У виджета два режима. В первом вы даёте ссылку на конкретный пост в публичном канале, и на сайте показывается обсуждение этого поста. Во втором указываете только канал. Тогда, как пишет Telegram в документации, обсуждение появится на сайте, как только вы опубликуете в канале ссылку на статью. Чтобы связать пост в канале со страницей, виджет берёт её адрес из canonical.
Если канал не нужен и хочется просто комментарии через Telegram-аккаунт, у Telegram для этого есть отдельный сервис Comments.app.
Откуда берётся ошибка в WordPress
Само ядро WordPress выводит canonical на страницах записей: функция rel_canonical() висит на хуке wp_head по умолчанию. SEO-плагины вроде Yoast или Rank Math обычно убирают её и печатают свой тег. Поэтому если тега нет, причина почти всегда в одном из трёх мест:
- тема не вызывает
wp_head()в шаблоне, и в шапку не попадает ничего из хуков; - в теме или плагине стоит
remove_action( 'wp_head', 'rel_canonical' ); - в SEO-плагине canonical выключен для этого типа записей.
Проверить просто: откройте запись, посмотрите код страницы и найдите rel="canonical". Тег должен быть один и с адресом именно этой записи.
Если canonical всё же нужно добавить
Лучше сначала найти, кто убрал тег, и вернуть штатный вывод. Если это невозможно, можно добавить его в functions.php дочерней темы. Код ниже использует wp_get_canonical_url() и включается, только если стандартный rel_canonical() снят, чтобы не получить два тега:
function krv_canonical_fallback() {
if ( ! is_singular() ) {
return;
}
$url = wp_get_canonical_url();
if ( $url ) {
echo '<link rel="canonical" href="' . esc_url( $url ) . '" />' . "\n";
}
}
// только если rel_canonical() из ядра кто-то снял с wp_head
if ( ! has_action( 'wp_head', 'rel_canonical' ) ) {
add_action( 'wp_head', 'krv_canonical_fallback' );
}
Два тега canonical с разными адресами хуже, чем ни одного: и поисковики, и виджет могут выбрать не тот. Если SEO-плагин уже печатает тег, свой код не нужен.
Подключение виджета
Сам виджет это скрипт с telegram.org. Грузить его стоит только там, где нужны комментарии, то есть на страницах записей, а не на всём сайте. Пример для записей и типа project:
function krv_telegram_discussion() {
if ( ! is_singular( array( 'post', 'project' ) ) ) {
return;
}
echo '<script async src="https://telegram.org/js/telegram-widget.js?24"
data-telegram-discussion="drslon_channel"
data-comments-limit="30"
data-color="5282FF"></script>' . "\n";
}
add_action( 'comment_form_before', 'krv_telegram_discussion' );
data-telegram-discussion: имя публичного канала (как drslon_channel в примере) или ссылка на конкретный пост вида канал/номер.data-comments-limit: сколько комментариев показывать.data-color: акцентный цвет в hex без решётки.data-dark="1"включает тёмную тему.
Точный код с нужными параметрами удобнее собрать в конструкторе на странице виджета, он сразу показывает превью. Хук comment_form_before срабатывает перед стандартной формой комментариев, и только если комментарии на записи открыты. Если они закрыты или шаблон свой, допишите скрипт в конец текста записи через фильтр the_content или вставьте его прямо в шаблон записи.
Проверка
- В коде страницы записи один тег
rel="canonical"с её точным адресом. - На странице грузится telegram-widget.js.
- Ссылка на эту статью опубликована в канале, который указан в data-telegram-discussion, и у канала включены комментарии через привязанную группу.
- После правок сброшен кэш страниц и CDN, если они есть.
В итоге ошибка «Discussion is not available» почти всегда означает, что на странице нет корректного тега canonical. WordPress выводит его сам, так что сначала стоит найти, кто его убрал. Дальше остаётся подключить виджет только на страницах записей и указать свой канал в data-telegram-discussion.