在 Header 后插入自定义脚本

大家好,

我已经在我的网站上成功运行了官方的 Discourse 广告插件并显示广告。问题是,如果有人想放置任何自定义脚本或广告,而这些并非 Discourse 内置的选项,该怎么办?

我尝试进入“自定义”→“主题”→“编辑 HTML/CSS”→“页眉之后”。我在那里粘贴了一个脚本块,然后重新加载了我的网站,但并没有看到它。事实上,只有当我把它放在 <body></body> 之间时才能看到它,但这会导致广告出现在页面最底部。而“页眉之后”本应是最佳位置,但它却不加载。请注意,这个脚本中包含了 async 属性。

我的意思是,为什么我们需要一个复杂的插件来简单地复制粘贴一个 HTML 块?即使是 Google 也提供了他们的脚本,你可以直接在页眉后复制粘贴。这通常是网站的标准做法,但在 Discourse 中似乎行不通,因为某些东西正在阻止脚本执行。这不是 CSP(内容安全策略)的问题,因为我已经在过滤器中设置了 https:inline-code,这应该允许所有以“https”开头的 JavaScript 运行。以下是一个 Google 广告代码示例:

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Ad 1 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3368174556925488"
     data-ad-slot="4362547659"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>

请尝试在不使用 Adsense 插件的情况下,手动让上述代码生效,并将其放置在主题的“页眉之后”区域。

#plugin:advertising

更新:看来答案是“自家广告”(House Ads)。然而,即使我在“自家广告”中发布一些脚本,这些广告也不会显示,这说明 Discourse 正在阻止某些内容。因为如果我在任何 HTML 页面上发布相同的脚本,它就能正常显示。

1 个赞

你现在可以尝试使用主题组件来实现。你试过吗?

剧透:广告不会刷新,因为 Discourse 是一个单页应用。如果 AdSense 已经更新,现在可以在不使用 adsbygoogle.push({}) 的情况下自动刷新广告,那对我来说就是新消息了。

1 个赞

实际上,我最终使用了 iframe。我在“自家广告”模块中嵌入了一个 iframe,效果很好。Google AdSense 的广告在刷新页面后会自动更新。

唯一的缺点是,如果我想在页面底部放置一个来自“自家广告”的联盟广告,目前无法实现。我只能将其放在话题列表的顶部或中间。如果能增加底部位置选项,将为我们提供更多灵活性。

不过,Google 无法识别你论坛的主题,会向你的访客展示相关性极低的广告,导致收入大幅下滑。

但如果你只是跳转到另一个页面,广告就不会更新。

2 个赞

请提供该说法的参考依据。

对于 Google AdSense 及其他广告爬虫抓取网站内容以获取上下文而言,广告是通过 IFRAME 标签还是 SCRIPT 标签加载,应该没有任何区别。

我们非常期待能读到一些 Google 开发者的相关参考资料!

谢谢。

当 AdSense 广告在嵌套 iframe 中展示时,浏览器的安全功能会阻止广告检测页面 URL 或域名以用于定向。因此,无法投放最相关的广告,广告收入也低于潜在水平。

3 个赞

是的,但这只是一个细节,并非广告上下文生成的全貌。

所有运行 AdSense 的网站都会被 Google AdSense 爬虫抓取,因此 Google 服务器会根据爬虫抓取到的网站内容,在上下文中投放相关广告。

这意味着,一个讨论 Ruby on Rails 的技术网站,在站点层面会获得与该上下文相关的广告(如果有的话)。

不过,在页面层面,嵌套的 IFRAME 标签确实存在上下文问题。

并非所有在 IFRAME 标签中投放的广告标签都是嵌套的。

以下是嵌套 IFRAME 标签的示例:

<iframe src="http://www.w3schools.com" width="1000" height="1000" id="frame1" name="frame1">
   <iframe width="200" height="200" src="http://www.bing.com" id="frame2" name="frame2">
   </iframe>
</iframe>

老实说,我个人很少在实际操作中遇到这种情况;而且当我们检查时(过去 15 年左右我们已多次进行此类检查),唯一遇到此问题的情况是回退标签(passback tags)。

希望这能有所帮助。

你想要一个参考。但“嵌套”并不是那个意思。从段落标题“如何在 iFrame 中嵌入 AdSense 广告?”可以清楚地看出这一点。在早期,使用 iframe 本身就已经违反政策了。

自 2007 年以来,我尝试了各种与 AdSense 相关的技巧,并与 @michaeld 一起编写了 第一个 Discourse AdSense 插件

我想我们两人的经验有所不同。很高兴听说你成功规避了限制。对于其他想尝试的人:我可不会来为你擦眼泪。

3 个赞

坦率地说,过去十年我们已投放了超过 10 亿次广告,而且多年来我们从未直接投放过 AdSense(出于多种原因,我们并不喜欢 AdSense)。因此,让我们从宏观角度,从当前展示广告的现状来审视“广告投放”这一问题。

上下文(相关性)

大多数投放直接购买广告的广告网络(例如 IDN Technet 或其他基于上下文的广告网络)并不会爬取网站内容。它们向广告主推介网站,例如会说:“嘿,这是 Discourse 社区讨论区,这里有大量关于技术开发、Ruby、JavaScript 等优质内容。”我们非常推荐它们。

如今,它们会为发布者提供 ads.txt 条目,并基于网站类别和子类别向其广告网络投放广告,而不是通过爬虫(如 AdSense 爬虫)来识别内容。

这是如今的常态,而非例外。

视频内容和视频广告亦是如此。我们的视频合作伙伴基于网站上下文(在宣传册中说明)为我们网站销售广告,而不是依赖“爬虫机器人”来寻找上下文。

事实上,我们已经多年未通过任何依赖爬虫来分类网站的广告网络投放广告,尤其是回传标签(passback tags)。当上下文被硬编码到广告网络中,而非由爬虫进行分类时,回传标签的效果总是最佳。

回传(Passbacks)

从回传广告(标签)中获取相关上下文始终很困难。

作为一名发布者,多年来我已投放超过 10 亿次展示广告。我的经验是:不要使用依赖爬虫生成上下文的广告网络来处理回传广告。

根据我过去十年发布广告的经验,最好使用基于硬编码上下文的回传标签。例如,如果我有一个技术网站,并希望向印度用户投放回传广告,那么我会使用对印度技术爱好者感兴趣的技术类回传标签。

AdSense

我们大概在 15 到 10 年前使用过 AdSense,过去十年中我甚至记不清我们是否曾直接投放过 AdSense。在我看来,AdSense 并非创收的最佳方式。

AdSense 确实通过其爬虫生成上下文,因此,一般来说,如果你的标签不是嵌套的 IFRAME 标签(即 IFRAME 回传标签嵌套在另一个 IFRAME 标签内),那么使用 IFRAME 标签通常没有问题。

IFRAME 标签的一些优势

  • 浏览器会预先为内联框架分配空间,并在渲染文档时考虑这一点。

  • Iframes 实现了跨域同源策略,这对于从其他域名拉取网站/内容/广告非常有用,而且它们相对安全,这也是大多数网络广告解决方案基于 iframes 的原因。

  • 如果需要先加载内容再加载广告,可以使用 Iframe 实现。

  • Iframe 有助于提升性能。

  • Iframe 独立于页面其他组件加载。

  • 即使用户禁用了 JavaScript,iframes 也能正常工作。

  • iframe 标签具有“高度”和“宽度”属性,允许设计师在尺寸和格式上拥有极大的灵活性,例如 300×250、728×90,具体取决于广告尺寸。

  • iframe 标签可以出现在页面的任何位置,如果需要,还可以添加多个 iframe。

IFRAME 标签的一些劣势

  • iframe 标签可能会导致无障碍访问问题。

  • 并非所有浏览器都支持 iframe 标签,可能导致显示不当,甚至显示为空白。

  • 在 Web 广告中使用 iframe 的一个关键原因是其在跨域支持方面的安全性,但性能并非完美。

  • 许多手持设备无法显示 iframe。

  • iframe 有时已知会降低 SEO 效果。

JS 标签的优缺点:

  • 如果感兴趣,稍后再补充。

供需关系

现在是 2020 年。自 2000 年以来,为广告主提供广告的网站数量呈指数级增长。广告供应已远远超过需求。这意味着,对于大多数网站(包括那些正在讨论在 Discourse 上设置广告的网站)而言,除非拥有强劲的需求和成熟的细分受众,否则不太可能获得优质广告流量。

在 2020 年,每个技术爱好者及其亲友都可以在自己的博客和论坛上发布广告,而他们确实这么做了。这意味着,未来展示广告的供应将继续超过需求。大多数细分网站在成为知名站点之前,都很难通过新网站获得广告收入。

Discourse 与爬虫

Discourse 不会向爬虫提供单页应用(SPA),这意味着广告爬虫也无法看到 SPA。至于其全部影响,据我所知,尚未有“第三方客观”分析(由独立第三方进行)。

总结

我认为,绝大多数使用 Discourse 作为 JavaScript SPA 的新用户,很难从展示广告网络(如 AdSense)中获得可观收入。这一点在 2020 年尤为明显,因为疫情导致广告主的预算大幅缩减。此外,供应过剩,需求不足。

如果你投放展示广告,由于页面“不重新加载”的特性,所有 SPA 都会遇到问题,这对 JS 标签和 IFRAME 标签都是如此。因此,需要更好的插件代码来优化 SPA 上的各类第三方标签。

结语

我们已多年未投放 AdSense,未来也无此计划;因此,AdSense 如何获取上下文对我们而言已无关紧要。对于其他人来说,与其费力解决 SPA 带来的第三方脚本标签和 CORS 问题,不如直接运行可用的 IFRAME 标签,依我之见,这才是明智之举。

先爬后走,先走后跑。

希望这对你有帮助。

保重。


附言:如有错别字,敬请见谅。我妻子正等在门口,想在雨前出门购物!

这并非针对 Google。正如之前讨论的,这是用于非 Google、非 Amazon 等的联盟广告单元。对于 Google,我已经使用了内置的 Adsense 插件。我的 Google 广告已经能够正常工作,并根据访客调整广告主题。此外,我还可以通过 Adsense 控制广告的类型。

我的问题涉及一个静态的联盟广告,它将始终保持不变。因此,我想使用专为该目的设计的“自家广告”(House ads)。然而,这限制了我在放置该广告单元时的位置选择。

目前,我刚刚使用 iframe 将其放置在主题 HTML 的页脚,效果很好。唯一的问题是,iframe 会向所有用户组显示,包括高信任级别的用户。而在此之前,我可以通过 Discourse 中的广告管理器选择不向信任级别为 3 或更高的用户显示广告单元。