Встраивание списка тем Discourse на внешний сайт

:bookmark: Это руководство объясняет, как с помощью JavaScript встроить и отобразить список тем Discourse на внешних сайтах, что позволит вам демонстрировать контент форума (например, обсуждения или объявления) на блогах, веб-сайтах или внешних платформах.

:person_raising_hand: Требуемый уровень пользователя: Администратор

Краткое описание

Встраивание тем Discourse на внешние сайты позволяет отображать списки тем из вашего форума Discourse непосредственно на других ресурсах. Эта интеграция помогает привлекать трафик на ваш форум и удерживает аудиторию, вовлекая её в контент сообщества. Встроенные темы отображаются в виде виджета на JavaScript, который интегрируется в структуру DOM вашего сайта, что упрощает кастомизацию с помощью CSS.

Включение встраивания тем

Для настройки встраивания тем на вашем внешнем сайте:

  1. Перейдите в раздел Администрирование > Дополнительно > Встраивание и переключитесь на вкладку Настройки. Включите настройку сайта embed_topics_list.

  1. Добавьте скрипт встраивания в секцию <head> HTML-кода вашего внешнего сайта:
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

Замените discourse.example.com на реальный URL вашего форума Discourse.

  1. Разместите элемент списка тем в том месте, где вы хотите отображать темы (например, в записи блога или на отдельной странице сайта):
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Если вы встраиваете темы на домен, отличный от домена вашего сайта Discourse, добавьте домен вашего внешнего сайта в раздел Администрирование > Дополнительно > Встраивание > Хосты.

Например, если ваш сайт Discourse находится по адресу yourdiscourseforum.com, а вы хотите встроить темы на yourexternalsite.com, вам нужно добавить yourexternalsite.com в список разрешённых хостов.

:warning: Вы не можете встраивать темы с частного сайта Discourse, требующего входа в систему.

Параметры конфигурации

Элемент d-topics-list поддерживает следующие атрибуты для настройки отображения тем:

  • discourse-url — URL вашего сайта Discourse (обязательно)
  • template — Варианты стиля отображения:
    • basic (по умолчанию) — Отображает заголовки тем в виде ссылок
    • complete — Отображает заголовок, имя пользователя, аватар, дату создания, время последнего ответа, количество лайков, количество ответов и главное изображение/миниатюру
  • per-page — Количество тем для отображения (ограничено скрытой настройкой сайта embed_topic_limit_per_page, по умолчанию 200)
  • category — ID категории для фильтрации тем из конкретной категории
  • tags — Фильтрация тем по конкретным тегам
  • allow-create — При значении true отображается кнопка «Новая тема»
  • embed-class — Добавляет пользовательский CSS-класс к контейнеру встроенного списка тем (допустимы только буквы, цифры, дефисы и нижние подчёркивания)
  • top-period — Показывает лучшие темы за определённый период:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Вы можете комбинировать несколько параметров для уточнения отображения списка тем. Например:

<d-topics-list 
  discourse-url="https://discourse.example.com" 
  category="5" 
  tags="announcements" 
  per-page="10"
  template="complete">
</d-topics-list>

Настройка внешнего вида

Вы можете стилизовать встроенные темы с помощью пользовательского SCSS в панели Администрирование > Внешний вид > Темы и компоненты. Нажмите на вашу текущую или стандартную тему и выберите Редактировать код. Затем выберите опцию Show_advanced и нажмите Встроенный CSS, чтобы добавить свой код:

Вот пример SCSS для создания сеточной раскладки:

.topics-list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  
  .topic-list-item {
    .main-link {
      border: 1px dotted gray;
      padding: 0;
    }
    
    .topic-column-wrapper {
      flex-direction: column-reverse;
      
      .topic-column.details-column {
        width: 100%;
      }
      
      .topic-column.featured-image-column .topic-featured-image img {
        max-width: initial;
        max-height: initial;
        width: 100%;
      }
    }
  }
}

Рекомендации по использованию

  • Используйте осмысленные фильтры по категориям и тегам для отображения релевантного контента для вашей аудитории
  • Устанавливайте подходящее значение per-page, чтобы не перегружать посетителей
  • Тестируйте встроенные темы на экранах разных размеров, чтобы обеспечить адаптивный дизайн
  • Рассмотрите возможность использования шаблона complete для более привлекательного визуального оформления, если позволяет место
  • Регулярно проверяйте список разрешённых хостов, чтобы убедиться, что только авторизованные домены могут встраивать ваши темы

Распространённые проблемы и решения

Темы не отображаются на внешнем домене

Проблема: Встроенные темы отображаются как пустой или серый блок при просмотре с внешнего домена.

Решение: Добавьте внешний домен в раздел Администрирование > Дополнительно > Встраивание > Хосты вашего сайта Discourse. Убедитесь, что указан правильный поддомен (например, если ваш сайт использует www.example.com, добавьте www.example.com, а не только example.com).

Ошибки загрузки скрипта

Проблема: Скрипт встраивания не загружается или возвращает ошибки соединения.

Решение:

  • Проверьте правильность и доступность URL сайта Discourse в источнике скрипта
  • Убедитесь, что включена настройка сайта embed_topics_list
  • Проверьте, что ваш сайт Discourse не требует входа для доступа к публичным темам

Поведение в контексте SameSite

В контекстах SameSite, когда сайт встраивания и форум имеют общий родительский домен, Discourse учитывает статус входа в систему и отображает результаты соответствующим образом. Пользователи, вошедшие в систему, могут видеть контент из защищённых категорий, недоступный анонимным пользователям.

Часто задаваемые вопросы

В: Могу ли я встроить темы с частного сайта Discourse?
О: Нет, встраивание тем работает только с публичными сайтами Discourse. Частные сайты, требующие входа, встроить нельзя.

В: Могу ли я встроить несколько списков тем на одной странице?
О: Да, вы можете добавить несколько элементов <d-topics-list> на одной странице с разными параметрами для отображения различных коллекций тем.

В: Как встроить темы с главными изображениями?
О: Используйте параметр template="complete" в элементе <d-topics-list>, чтобы отображать темы с миниатюрами и главными изображениями.

В: Могу ли я изменить место, где открываются ссылки на темы?
О: По умолчанию ссылки на темы открываются в родительском окне. Вы можете изменить это поведение с помощью кастомизации CSS или JavaScript.

Дополнительные ресурсы

10 лайков

Работает ли это с подписками Discourse? Я попытался внедрить это, и оно обрамляло весь мой форум, а не темы?

1 лайк

Да, это должно работать без проблем в связке с плагином Discourse Subscriptions.

Встраивание основано на настройке конкретных параметров для управления отображаемыми темами, таких как category, tags или per-page, с помощью тега d-topics-list в HTML вашего сайта. Если при встраивании у вас получилось, что в рамку попал весь форум, убедитесь, что URL-адрес Discourse и любые параметры в теге <d-topics-list> правильно настроены для отображения именно тех тем, которые вы планируете показывать.

4 лайка

Привет, очень приятно! Спасибо!

Я хочу изменить значение атрибута target у элемента a в topic-list-item на “_blank” (по умолчанию стоит _parent, из-за этого возникают проблемы с переходом между доменами, и это не то, что мне нужно).

Что мне нужно сделать?

Привет! Я пытаюсь отобразить их на двух разных сайтах.

Мой URL Discourse: https://learn.getupearlier.com

Этот скрипт внедрён здесь, и он работает:

А этот же скрипт внедрён здесь, но не работает:

Вот что в заголовке:

<script src="https://learn.getupearlier.com/javascripts/embed-topics.js"></script>

А вот что на странице:

<d-topics-list discourse-url="https://learn.getupearlier.com" category="5" per-page="10"></d-topics-list>

Буду признателен за любую помощь!

2 лайка

Привет, Майкл,

Проблема, с которой вы столкнулись, скорее всего, связана с использованием домена, отличного от домена вашего сайта Discourse, для встраивания тем.

Ваш скрипт работает на getupearlier.com, потому что этот домен совпадает с доменом вашего сайта Discourse learn.getupearlier.com, тогда как michaelbakerdigital.com находится на другом домене.

Я добавил этот раздел в руководство, где объясняется, как решить эту ситуацию.

Таким образом, в вашей ситуации добавление michaelbakerdigital.com в список «Встраивание» → «Разрешённые хосты» вашего сайта Discourse позволит вам правильно встраивать темы на этом домене.

6 лайков

Привет! Как видно ниже, я разрешил этот URL:

Вот тестовый URL:

У меня просто появляется пустое серое окно с ошибкой:

А вот код внутри michaelbakerdigital.com:

<div id='discourse-comments'></div>
<meta name='discourse-username' content='MikeB'>

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'https://learn.getupearlier.com/',
    discourseEmbedUrl: 'michaelbakerdigital.com',
    // className: 'CLASS_NAME',
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

Или этот:

<d-topics-list discourse-url="https://learn.getupearlier.com" category="5" per-page="5"></d-topics-list>

Буду признателен за любую помощь. Я уже застрял здесь надолго и постоянно планирую решить эту проблему.

Привет, решение заключалось в том, что к доменному имени, добавленному в раздел встраивания, нужно было добавить «www».

Вот и всё! Столько времени из-за четырёх символов, но проблема была решена с помощью поддержки Discourse и WP Engine.

Есть ли пример кода для вывода избранного изображения также на внешний сайт?

Огромное спасибо

Требуется помощь: Встраивание списка тем Discourse на сайт Next.js

Всем привет,

Я пытаюсь встроить список тем Discourse на свой сайт (example.io), который создан с использованием фреймворка Next.js и Node.js, и развернут через Vercer. Для этой цели я создал тестовую копию сайта на test-discourse.app.

Вот что я уже сделал:

  1. Добавил хост в настройки встраивания Discourse.
  2. Включил CORS в окружении и добавил хост в список разрешенных CORS-происхождений.
  3. Отключил CSP (политику безопасности контента).

Несмотря на выполнение этих шагов и добавление необходимых скриптов, я все еще не вижу список тем на своем сайте.

Вот код, который я использую:

В секции head:

<script src="my-website/javascripts/embed-topics.js"></script>

В секции body:

<d-topics-list discourse-url="my-website" tags="example"></d-topics-list>

Также пробовал встраивать категории, как показано в посте.

Не могли бы вы подсказать, что я мог упустить или сделать неправильно? Любые предложения по отображению списка тем на моем сайте будут очень кстати.

Заранее спасибо за помощь!

У меня есть экземпляр Discourse, запущенный на VPS.
Также у меня есть другой веб-сайт, работающий на другом VPS.
Оба используют один и тот же корневой домен, например:

community.mydomain.com
mydomain.com

Я успешно использовал этот метод для встраивания списка тем с сервера форума (Discourse) на другой веб-сайт. Это отлично подходит для привлечения трафика с моего сайта на форум.

Я использую компонент боковой панели справа для отображения «предстоящих событий» из календаря с помощью плагина discourse-calendar.

Хочу воспроизвести список «предстоящих событий» на другом моем сайте. Я могу использовать метод, описанный в этой теме, чтобы получить все темы из категории календаря, но они сортируются по дате последнего сообщения.

Компонент боковой панели справа сортирует их по дате события:
пример

Есть ли способ сделать это? У меня есть административный контроль над обоими сайтами.
Существует ли другой способ извлечения данных с моего сервера Discourse, например через API? Установлен ли API по умолчанию на всех экземплярах Discourse или его нужно устанавливать отдельно?

1 лайк

Поскольку я не получил никаких подсказок, я решил ответить на несколько своих собственных вопросов для тех, кто будет искать эту информацию.

Только для справки: ДА, в официальной инструкции по установке для самостоятельного хостинга уже включён REST API.

Я нашёл подсказки в темe с примерами работы API, как выполнять вызовы cURL из терминала. Как только команды cURL заработали, я использовал этот сайт для преобразования версии командной строки в PHP:

Мой другой сервер работает на PHP в качестве бэкенда, и я делаю AJAX-вызовы со страницы веб-сайта к функциям на сервере. Discourse выдаёт JSON и JavaScript, который он сам создаёт для декодирования этого. Стилизуем по необходимости… суп.

Обратите внимание, что это может работать только потому, что

и я использую API-ключ и пользователя согласно инструкции, которую можно найти здесь.

Надеюсь, это кому-то поможет :+1:

1 лайк

Похоже, мы также можем использовать ссылку для встраивания внутри сообщения на форуме, например так:

<iframe width="500" height="400" src="https://meta.discourse.org/embed/topics?tags=release-notes" frameborder=0 scrolling="no"></iframe>

(здесь это не сработает, так как они не включили свой собственный сайт в настройках администратора iframe)

Однако атрибут scrolling=“no” не работает… Оказывается, комитет по стандартам отменил использование атрибута scrolling в HTML5 и не предложил ничего взамен. IFrame становятся всё лучше с каждым годом, да?

В моих тестах, если я изменяю стиль <body> внутри iframe на overflow: hidden, горизонтальная полоса прокрутки исчезает. Я пока не нашёл способа убрать вертикальную полосу прокрутки. Можно ли из моего плагина изменить страницу встраивания, чтобы установить overflow: hidden?

При встраивании списка тем, какой будет «лучший» способ создать карусель из всех встроенных тем с горизонтальной прокруткой?

Можно ли настроить открытие каждой ссылки на тему в новой вкладке/окне?