外部サイトにDiscourseのトピックリストを埋め込む

:bookmark: このガイドでは、JavaScriptを使用してDiscourseトピックのリストを外部ウェブサイトに埋め込み、表示する方法について説明します。これにより、ブログ、ウェブサイト、または外部コンテンツプラットフォームでディスカッションやアナウンスなどのフォーラムコンテンツを公開できます。
:person_raising_hand: 必要なユーザーレベル:管理者

まとめ

Discourseトピックを外部ウェブサイトに埋め込むことで、Discourseフォーラムのトピックリストを他のサイトに直接表示できます。この統合は、フォーラムへのトラフィックを促進し、オーディエンスをコミュニティコンテンツに引き付け続けるのに役立ちます。埋め込まれたトピックはJavaScriptウィジェットとして表示され、サイトのDOM構造と統合されるため、CSSによるカスタマイズが容易になります。

トピックの埋め込みを有効にする

外部サイトでトピックの埋め込みを設定するには、次の手順を実行します。

  1. Discourse管理ダッシュボードに移動し、site_settingsをクリックします。embed_topics_listサイト設定を検索して有効にします。

  1. 埋め込みスクリプトを外部サイトのHTMLのheadセクションに追加します。
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

discourse.example.comを実際のDiscourseフォーラムのURLに置き換えてください。

  1. トピックを表示したい場所にトピックリスト要素を配置します(ブログ投稿や個々のサイトページなど)。
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Discourseサイトとは異なるドメインにトピックを埋め込んでいる場合は、DiscourseサイトのAdmin > Advanced > Embedding > Hostsに外部サイトのドメインを追加します。

たとえば、Discourseサイトがyourdiscourseforum.comにあり、yourexternalsite.comにトピックを埋め込みたい場合は、yourexternalsite.comを許可ホストリストに追加する必要があります。

:warning: ログインが必要なプライベートDiscourseサイトからトピックを埋め込むことはできません。

設定パラメータ

d-topics-list要素は、トピック表示をカスタマイズするために次の属性をサポートしています。

  • discourse-url - DiscourseサイトのURL(必須)
  • template - 表示スタイルのオプション:
    • basic(デフォルト)-最小限のトピック情報を表示します
    • complete -タイトル、ユーザー名、アバター、作成日、サムネイルを表示します
  • per-page -表示するトピックの数
  • category -特定のカテゴリのトピックをフィルタリングするためのカテゴリID
  • tags -特定のタグでトピックをフィルタリングします
  • allow-create - trueに設定すると、「新しいトピック」ボタンが表示されます
  • 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>

外観のカスタマイズ

DiscourseのAdmin > Customize > ThemesパネルでカスタムSCSSを使用して、埋め込まれたトピックをスタイル設定できます。現在のテーマまたはデフォルトのテーマをクリックし、「コードの編集」をクリックします。「詳細を表示」を選択し、「埋め込み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サイトのAdmin > Customize > Embedding > Allowed Hostsに外部ドメインを追加します。正しいサブドメインを含めるようにしてください(例:サイトがwww.example.comを使用している場合、example.comだけでなくwww.example.comを追加します)。

スクリプト読み込みエラー

問題:埋め込みスクリプトが読み込まれないか、接続エラーが返されます。

解決策

  • スクリプトソースのDiscourse URLが正しいこと、およびアクセス可能であることを確認します。
  • embed_topics_listサイト設定が有効になっていることを確認します。
  • Discourseサイトが公開トピックに対してログインを必要としないことを確認します。

SameSiteコンテキストの動作

埋め込みサイトとフォーラムが親ドメインを共有するSameSiteコンテキストでは、Discourseはログインステータスを尊重し、それに応じて結果を表示します。ログインしているユーザーは、匿名ユーザーがアクセスできないセキュアカテゴリのコンテンツを表示できる場合があります。

よくある質問

Q:プライベートDiscourseサイトのトピックを埋め込むことはできますか?
A:いいえ、トピックの埋め込みは公開Discourseサイトでのみ機能します。ログインが必要なプライベートサイトは埋め込むことができません。

Q:同じページに複数のトピックリストを埋め込むことはできますか?
A:はい、さまざまなトピックコレクションを表示するために、同じページに異なるパラメータを持つ複数の<d-topics-list>要素を含めることができます。

Q:注目の画像を含むトピックを埋め込むにはどうすればよいですか?
A:<d-topics-list>要素でtemplate="complete"パラメータを使用して、サムネイルと注目の画像を含むトピックを表示します。

Q:トピックリンクが開く場所を変更できますか?
A:デフォルトでは、トピックリンクは親ウィンドウで開きます。この動作は、CSSまたはJavaScriptのカスタマイズを通じて変更できます。

追加リソース

「いいね!」 9

Discourseサブスクリプションで動作しますか?実装しようとしましたが、トピックではなくフォーラム全体がフレーム化されました。

「いいね!」 1

はい、これはDiscourse Subscriptions プラグインと問題なく連携するはずです。

埋め込みは、ウェブサイトの HTML 内の d-topics-list タグを通じて、categorytags、または per-page のような表示するトピックを制御するための特定のパラメータを設定することに依存します。埋め込みがフォーラム全体をフレーム化してしまった場合は、Discourse の URL と d-topics-list タグ内のパラメータが、表示したいトピックを反映するように正しく設定されていることを確認したい場合があります。

「いいね!」 4

こんにちは、とても良いですね!ありがとうございます!

topic-list-item の a 要素の target 値を “_blank” に変更したいです(デフォルトは “_parent” で、クロスドメインの問題があり、私が望むものではありません)。

どうすればよいですか?

こんにちは。これらを2つの異なるサイトに表示しようとしています。

私のDiscourseのURLは 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 は異なるドメイン上にあります。

この状況を解決する方法を説明するセクションをガイドに追加しました。

したがって、あなたの状況では、Discourseサイトの「Embedding」→「Allowed Hosts」に michaelbakerdigital.com を追加することで、そのドメインにトピックを正しく埋め込めるようになるはずです。

「いいね!」 6

URL を以下のように許可しましたが、\n

\n\nテスト URL は次のとおりです。\nhttps://www.michaelbakerdigital.com/discourse-test/ \n\n空白の灰色のエラーボックスが表示されるだけです。\n\n\n\nそして、michaelbakerdigital.com 内のコードは次のとおりです。\n\n\n<div id='discourse-comments'></div>\n<meta name='discourse-username' content='MikeB'>\n\n<script type=\"text/javascript\">\n DiscourseEmbed = {\n discourseUrl: 'https://learn.getupearlier.com/',\n discourseEmbedUrl: 'michaelbakerdigital.com',\n // className: 'CLASS_NAME',\n };\n\n (function() {\n var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;\n d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';\n (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);\n })();\n</script>\n\nまたは、こちらです。\n\n<d-topics-list discourse-url=\"https://learn.getupearlier.com\" category=\"5\" per-page=\"5\"></d-topics-list>\n\n\n解決にずっと苦労しているので、どんな助けでも感謝します。

こんにちは、ここの解決策は、埋め込みセクションに追加された私のドメイン名にwwwが必要だったことです。

それだけです!4文字のために多くの時間を費やしましたが、DiscourseとWP Engineのサポートの助けを借りて解決しました。

外部サイトにフィーチャー画像を出力するサンプルコードはありますか?

よろしくお願いします。

ヘルプが必要:Next.jsサイトへのDiscourseトピックリストの埋め込み

皆さん、こんにちは。

Next.jsフレームワークとNode.jsで構築され、Vercel経由でデプロイされている私のウェブサイト(example.io)にDiscourseのトピックリストを埋め込もうとしています。この目的のために、test-discourse.appにウェブサイトのテストレプリカを作成しました。

これまでに実施したことは以下の通りです。

  1. Discourseの埋め込み設定にホストを追加しました。
  2. 環境でCORSを有効にし、CORSオリジンにホストを追加しました。
  3. CSP(Content Security Policy)を無効にしました。

これらの手順に従い、必要なスクリプトを追加しても、ウェブサイトにトピックリストが表示されません。

使用しているコードは以下の通りです。

headセクション:

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

bodyセクション:

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

投稿に示されているように、カテゴリの埋め込みも試しました。

何か見落としている点や、間違っている点があればご指摘いただけますでしょうか?トピックリストをウェブサイトに表示させるための提案があれば、大変ありがたいです。

ご協力に感謝いたします。

VPSでDiscourseインスタンスを実行しています。
別のVPSで別のウェブサイトを実行しています。
どちらも同じルートドメインを使用しています。例:

community.mydomain.com
mydomain.com

フォーラムサーバー(Discourse)から他のウェブサイトにトピックリストを埋め込むために、この方法を正常に使用しました。ウェブサイトからフォーラムへのトラフィックを生成するのに非常に役立ちます。

discourse-calendarプラグインを使用してカレンダーから「今後のイベント」をリストするために、右サイドバーブロックコンポーネントを使用しています。

「今後のイベント」を他のウェブサイトで再現したいと思います。このトピックで説明されている方法を使用してカレンダーカテゴリのすべてのトピックを取得できますが、それらは最も最近投稿された順に並べ替えられています。

右サイドバーブロックコンポーネントは、イベントの日付で並べ替えます。
例:

これを行う方法はありますか?両方のウェブサイトの管理権限を持っています。
APIなど、Discourseサーバーからデータを抽出する他の方法はありますか?APIはデフォルトですべてのDiscourseインスタンスにインストールされていますか、それともインストールする必要がありますか?

「いいね!」 1

ヒントが得られなかったので、自分でいくつかの質問に答えて、誰かが見たときのために共有しようと思います。

参考までに、はい、セルフホストの公式インストールにはREST APIが含まれています。

ターミナルからcURL呼び出しを行う方法については、APIの例のスレッドからヒントを得ました。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" は機能しません。HTML5では scrolling は標準規格から廃止され、代替となるものが提供されなかったようです。iframeは年々良くなっていきますね。

テストしたところ、iframe内の <body>overflow: hidden に変更すると、横スクロールバーは消えます。縦スクロールバーを消す方法は見つかっていません。私のプラグインから、埋め込みページを変更して overflow: hidden を設定する方法はありますか?

トピックのリストを埋め込む場合、埋め込まれたすべてのトピックから水平スクロール可能なカルーセルを作成したい場合、「最善」の方法は何でしょうか?

各トピックリンクを新しいタブ/ウィンドウで開くように変更する方法はありますか?