Discourse をテーマやプラグインでカスタマイズする際は、原則として CSS、JavaScript プラグイン API、またはプラグイン outlets を使用してください。これらではご自身のユースケースに対応できない場合は、Discourse コアへの PR を提出するか、Meta の Development トピックで議論を開始してください。カスタマイズを容易にするための新しい outlet や API の追加について議論できることを常に嬉しく思います。
他のすべての選択肢を試し尽くした場合、テンプレートのオーバーライドに頼る必要があるかもしれません。この手法を使えば、テーマやプラグインから任意の Ember コンポーネントやルートのテンプレート全体をオーバーライドできます。
これは Discourse をカスタマイズする推奨される方法ではありません。 Discourse コアの日々の変更は、最終的にテンプレートオーバーライドと競合し、フォーラムのレンダリング時に壊滅的なエラーを引き起こす可能性があります。
このアプローチを採用する場合は、回帰を検出するための十分な自動化されたテストと QA プロセスを備えていることを確認してください。テンプレートオーバーライドを含むテーマやプラグインを配布する場合は、そのテーマやプラグインが持つ安定性のリスクについてフォーラム管理者が認識していることを必ず確認してください。
![]()
![]()
2023 年 10 月更新: 新機能については、Discourse は Ember の
.gjsファイル形式を使用して記述されたコンポーネントの使用へと移行しつつあります。これらのコンポーネントのテンプレートはインラインで定義されるため、テーマやプラグインによるオーバーライドはできません。今後は、すべてのテンプレートのカスタマイズは プラグイン outlets を使用して行う必要があります。
近い将来に機能しなくなることは理解しているが、とにかくドキュメントを見せてほしい
コンポーネントテンプレートのオーバーライド
Ember コンポーネントのテンプレート(Discourse コアの components/* 以下にあるもの)をオーバーライドするには、テーマやプラグイン内に同名の .hbs ファイルを作成してください。例えば、Discourse コア内の badge-button コンポーネントのテンプレートをオーバーライドするには、テーマやプラグインの以下の場所にテンプレートファイルを作成します。
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
オーバーライドは、コアコンポーネントが「コローケート(同一場所)」されたテンプレートを持っていた場合でも、常に /templates ディレクトリ内にネストされている必要があります。
ルートテンプレートのオーバーライド
ルートテンプレート(templates/* 以下にあるコンポーネント以外のすべてのテンプレート)のオーバーライドは、コンポーネントの場合と同じ方法で行われます。テーマやプラグイン内に同名のテンプレートを作成してください。例えば、コア内の discovery.hbs をオーバーライドするには、以下のようなファイルを作成します。
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
複数のテーマ / プラグイン間の相互作用
複数のインストールされたテーマやプラグインが同じテンプレートをオーバーライドする場合、「勝者」となるのは、以下のリストで番号が最も低い順位を持つものです。
- テーマのオーバーライド(最も高いテーマ「id」が優先)
- プラグインのオーバーライド(アルファベット順で最も新しいプラグイン名が優先)
- コア
この優先順位により、テーマからプラグインのテンプレートをオーバーライドすることも可能です。技術的には、他のテーマからテーマのテンプレートを、あるいは他のプラグインからプラグインのテンプレートをオーバーライドすることも可能ですが、プラグイン名やテーマ id に依存するため、予期せぬ動作を招く可能性があります。
これはどのように機能するのか?
Discourse は、DiscourseTemplateMap クラス内でテンプレートを収集し、優先順位付けを行います。コローケートされたコンポーネントテンプレートの場合、その情報はアプリの初期化時 に使用され、コアのテンプレート関連付けを置き換えます。その他のすべてのテンプレートについては、マップがランタイムでのresolver によって使用され、正しいテンプレートを取得します。
このドキュメントはバージョン管理されています。変更は GitHub で提案してください。