Johani
(Joe)
7
在不了解具体背景的情况下,要回应您的观点确实有些困难。如果您能提供更多具体信息,说明您指的是哪个广告网络,以及它具体是如何无法为您正常工作的,那将非常有帮助。
这并不完全正确,实际情况取决于您尝试使用的广告网络。如果确实严格要求广告网络的脚本必须放置在 </body> 标签旁边——这种情况不太可能——那么问题其实出在广告网络自身,因为它们设定了如此严格且不合理的限制。
在主题中添加的脚本会被整合到一个 theme.js 文件中,然后注入到文档的 <head> 标签中。
这为我们提供了一定程度的控制能力,使我们能够实现一些有益的功能,例如防止损坏的主题导致整个网站瘫痪。
这也只是部分正确。主题可以修改客户端上的任何内容。这意味着在 Discourse 中用 JavaScript 编写的任何内容都可以被主题访问。
事实上,整个 官方广告插件 都可以转换为一个主题组件,并且能够正常工作。唯一缺失的功能是无法添加 ads.txt 文件,因为这需要访问后端。我们尚未这样做的原因是,插件是更干净的实现方式——特别是因为它支持多个广告提供商。所以,主题确实存在一些限制,但这并不是这里的关键问题。
这里有一个非常重要的说明:Discourse 是一个单页应用(SPA)。这意味着一旦您在初始页面加载时启动了应用,之后发生的所有导航都由 Discourse 处理,而不是由您的浏览器处理。
这一点很重要,因为广告网络必须提供必要的钩子(hooks),以便单页应用能够更新页面信息并投放新广告。我对 Adbutler 或 Openx 不太了解,但我找不到任何关于这两个提供商支持单页应用的文档。
因此,如果广告网络没有提供必要的钩子,这真的是 Discourse 的错吗?
您并没有真正被迫使用 DFP。它只是官方广告插件中可用的六个选项之一,我在这里列出供您参考:
- DFP
- AdSense
- Google ads
- Amazon 广告
- Codefund
- Carbon Ads
再次强调,由于 Discourse 是单页应用,“通用”方案根本无法奏效。
当然,您可以在主题中加载任何您想要的广告脚本,但它们只会在初始页面加载时触发。之后发生的任何页面变化都会被广告网络脚本忽略——除非该广告网络提供了必要的钩子。
以下是支持单页应用的广告网络集成示例:
https://github.com/discourse/discourse-adplugin/blob/master/assets/javascripts/discourse/components/google-dfp-ad.js.es6#L191-L230
实际上,您确实需要为每个广告网络编写特定的代码实现。
此外,我认为您混淆了自家广告(house ads)与广告网络投放的广告。该输入框仅支持 HTML 的原因在于,它旨在让您创建自己的自家广告。这是一个非常简单的实现,插件中已经完成了相关配置,因此如果您只想投放自己的广告,就无需折腾单页应用的钩子。
此外,如果您真的希望将另一个广告网络纳入广告插件,我们已有基于社区贡献添加新广告网络的成功先例。
最近的例子是 Carbon Ads 的集成:
不过,正确完成所有集成的责任在于您自己。
如果您觉得这样的实现过于棘手,那也无妨。我很擅长给汽车换轮胎或更换机油,但如果需要检修变速箱,我就会找一位比我更专业的人,并付费请他们完成。
我想表达的是,如果您真的想使用另一个广告网络,但自己无法完成,我建议您先在 Marketplace 板块创建一个主题。如果您有合适的预算,我相信一定会有开发者注意到并愿意提供帮助。