広告スクリプトの設置場所はどこですか?

文脈がないとご指摘の点に回答するのは少し難しいですね。どの広告ネットワークを指しているのか、具体的にどのように機能しなかったのか、より詳細な情報をいただけると非常に助かります。

それは完全に正しいわけではありません。使用する広告ネットワークによって状況は異なります。広告ネットワークのスクリプトを <body> タグの直下に配置することが厳密な要件である場合(それはあまり考えられませんが)、そのように厳格で不合理な要件を課しているのは広告ネットワーク側の問題です。

テーマに追加されたスクリプトは theme.js ファイルに読み込まれ、その後、ドキュメントの <head> タグに注入されます。

これにより、ある程度の制御が可能になり、壊れたテーマがサイト全体をダウンさせるのを防ぐなどの便利な機能を実装できるようになります。

これも部分的にしか正しくありません。テーマはクライアントサイドのあらゆるものを変更できます。つまり、Discourse で JavaScript で記述されたものはすべてテーマからアクセス可能です。

実際、公式広告プラグイン 全体をテーマコンポーネントに変換しても動作します。唯一欠けるのは ads.txt ファイルを追加する機能ですが、これはバックエンドへのアクセスが必要になるためです。私たちがそうしていない理由は、プラグインの方がこの目的にはよりクリーンな実装であるためです。具体的には、複数のプロバイダーを含むためです。つまり、テーマには制限がありますが、それが今回の主な点ではありません。

ここで非常に重要な点があります。Discourse はシングルページアプリケーション(SPA)です。つまり、初期ページ表示時にアプリをロードした後、その後のすべてのナビゲーションはブラウザではなく Discourse によって処理されます。

これは重要です。なぜなら、広告ネットワークは、シングルページアプリケーションがページ情報を更新し、新しい広告を提供するために必要なフックを提供する必要があるからです。Adbutler や Openx については詳しく知りませんが、どちらのプロバイダーもシングルページアプリケーション対応に関するドキュメントは見つけられませんでした。

つまり、広告ネットワークが必要なフックを提供しない場合、それがサポートされていないのは本当に Discourse の責任なのでしょうか?

DFP を使用することを強制されているわけではありません。公式広告プラグインで利用可能な 6 つのオプションの 1 つに過ぎません。参考までにリストします。

  1. DFP
  2. AdSense
  3. Google ads
  4. Amazon advertizing
  5. Codefund
  6. Carbon Ads

繰り返しになりますが、Discourse はシングルページアプリケーションであるため、「汎用的」なスクリプトでは機能しません。

もちろん、テーマ内で好きな広告スクリプトを読み込むことはできますが、それらは初期ページ表示時のみ発火します。その後に行われることは、広告ネットワークのスクリプトによって検知されません。ただし、広告ネットワークが必要なフックを提供する場合を除きます。

以下は、シングルページアプリケーションをサポートする広告ネットワークでの統合の例です。

https://github.com/discourse/discourse-adplugin/blob/master/assets/javascripts/discourse/components/google-dfp-ad.js.es6#L191-L230

実際には、各広告ネットワークごとに具体的なコード実装が必要です。

また、社内広告と広告ネットワークからの広告を混同されているように思われます。ボックスが HTML のみである理由は、そこで独自の社内広告を作成することを想定しているためです。これは非常にシンプルな実装であり、すでにプラグイン内で連携されているため、自社の広告を配信したい場合、シングルページフックについて悩む必要はありません。

さらに、他の広告ネットワークを広告プラグインに含めたい場合は、コミュニティからの貢献に基づいて新しい広告ネットワークを追加する前例があります。

最近の例として、Carbon Ads の統合があります。

ただし、すべてを正しく連携させる負担はあなたにあります。

そのような実装が難しすぎると思われる場合は、それまでです。私は車のタイヤ交換やオイル交換は得意ですが、トランスミッションのメンテナンスが必要であれば、私よりも詳しい人を探して報酬を支払い、やってもらいます。

言いたいことは、もし本当に他の広告ネットワークを使いたいのに自分でうまくいかない場合は、Marketplace でトピックを作成することをお勧めします。適切な予算があれば、きっと開発者の注意を引くことができるでしょう。