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

:bookmark: このガイドでは、JavaScript を使用して外部ウェブサイトに Discourse トピックのリストを埋め込み表示する方法について説明します。これにより、ブログ、ウェブサイト、または外部コンテンツプラットフォーム上で、ディスカッションやお知らせなどのフォーラムコンテンツを紹介できます。

:person_raising_hand: 必要なユーザーレベル:管理者

概要

外部ウェブサイトに Discourse トピックを埋め込むことで、Discourse フォーラムからのトピックリストを他のサイトに直接表示できます。この統合により、フォーラムへのトラフィックを誘導し、コミュニティコンテンツを通じてオーディエンスのエンゲージメントを維持することが可能になります。埋め込まれたトピックは、サイトの DOM 構造に統合される JavaScript ウィジェットとして表示され、CSS によるカスタマイズが容易になります。

トピック埋め込みの有効化

外部サイトでトピック埋め込みを設定するには、以下の手順に従ってください:

  1. 管理 > 高度な設定 > 埋め込み に移動し、設定 タブに切り替えます。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 サイトが yourdiscourseforum.com にあり、yourexternalsite.com にトピックを埋め込みたい場合、yourexternalsite.com を許可されたホストリストに追加する必要があります。

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

設定パラメータ

d-topics-list 要素では、トピック表示をカスタマイズするために以下の属性がサポートされています:

  • discourse-url - Discourse サイトの URL(必須)
  • 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 を使用している場合、example.com だけでなく www.example.com を追加する必要があります)。

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

問題: 埋め込みスクリプトの読み込みに失敗するか、接続エラーが返される。

解決策:

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

SameSite コンテキストの動作

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

よくある質問(FAQ)

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 を設定する方法はありますか?

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

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