通过 Javascript 将 Discourse 评论嵌入到另一个网站上

您的使用场景在 Discourse 中确实不支持开箱即用,需要进行一些自定义开发。建议您考虑开发插件,或聘请顾问协助您实现该功能。

2 个赞

我建议在“故障排除”部分补充:如果 Discourse 无法解析您的页面或博客文章内容以创建新话题,嵌入将会失败(且不会给出任何提示)。请先尝试嵌入某个特定话题,然后再利用解析页面的相关选项。

3 个赞

太棒了!我遇到的唯一小问题是,我无法确定如何正确使用 CSS 选择器来提取 meta-description 并将其用作首帖。
我尝试过几种类似的方法。有什么建议吗?

1 个赞

如果您试图从您网站的 <head> 部分提取 meta 标签的内容,我认为这无法实现。

2 个赞

我仍然感到遗憾,为什么不能简单地为嵌入中提供的链接生成一个信息框,而不是进行更复杂的文本和潜在图片导入。

对于拥有复杂页面数据/布局的网站,难道没有人想到过这样的场景:主题既作为讨论的占位符,又作为引导用户前往远程网站查看文章或故事的方式吗?

拜托了? :slight_smile:

3 个赞

因此,我们考虑在我们的主站的一些博客和文章上实施这一方案,并使用论坛。今天早上开会时,我的市场人员说这是个坏主意,因为论坛上发布的每篇文章都会与我们的博客内容重复,因为它们标题相同,且显示相同的开头段落。他通过一次谷歌搜索示例展示了这一点。是否有内置功能可以帮助向谷歌表明这些并非重复内容?或者,能否对这些帖子设置 no-index?

4 个赞

嗯,这很有趣,因为如果我们添加了 noindex,评论也不会被索引,这并不理想。有没有办法告诉谷歌“页面的这部分是重复内容”?

我们可以将其应用于原始发帖人(OP)。

1 个赞

这确实是我们讨论时我担心的问题。我不想损害博客的 SEO 价值,但也不希望隐藏论坛的问答内容,因为有时它的吸引力与某些博客文章不相上下。目前我还不确定如何告诉 Google 索引帖子的某一部分,而不索引另一部分。

Discourse 提供了一个名为“嵌入设置规范 URL"(embed set canonical url)的站点设置。启用该设置后,嵌入主题的标准 URL 将被设置为嵌入内容的 URL。这是否有助于改善重复内容问题?

1 个赞

听起来这有助于解决问题。您是否认识正在使用此功能的人,以便我能查看并分享一个示例?

另一种选择是在讨论标题前加上“关于______的评论”。

1 个赞

这个问题比较棘手,因为我无法分享有关我们客户网站的具体细节。关于此问题,这里有更多详细信息:https://meta.discourse.org/t/add-option-to-set-canonical-url-to-embed-url/103915。我已在该主题中询问,看看是否有人愿意提供关于启用该设置如何影响其 SEO 的详情。

1 个赞

仅更改标题是否足够?帖子内容仍会被分享。

1 个赞

不知为何,我甚至无法查看该页面,即使禁用了广告拦截器,系统仍提示需要禁用它。

就我的经验而言,仅一段“重复”内容还不足以引发任何重复内容问题——毕竟你用的是我博客里的截图 :wink:

这就像引用某篇随机文章中的一段话。

我今天尝试过这个方法,把页面 URL 放进了一个隐藏的 div 里。但脚本只是把链接作为普通文本插入,很遗憾没有生成预览卡片。:frowning:

我成功让嵌入功能从页面抓取了我的照片。问题出在我这边,因为代码使用了一个名为 lazyload 的预加载/淡入图像 JavaScript。一旦移除它,创建主题时就能在类选择器区域设置任何图像。然而……

主题已创建,并在几分钟内正常工作。图像可以通过点击缩放查看。但几分钟后刷新页面,主题内容发生变化,图像位置被替换为“上传”文本行。

![](upload://s9ULowF5G9GnR4SQ1STdj1d9JtO.jpeg)

这似乎是图像未能远程上传到论坛服务器的问题。有人知道为什么会失败吗?另外,如果确实失败,为什么系统不保留原始 URL 位置?这似乎很奇怪。

我还想补充一点,这并非个别案例。所有最初包含图像的主题(约 10 多个)都一致出现了这个问题。

[更新:解决方法是将我的网站添加到不下载图像的黑名单中。这样 HTML 就会直接从远程站点获取图像。对我而言有效。]

1 个赞

当 URL 发生变化(例如博客标题更新)时,我们能否阻止创建新主题?

1 个赞

是的,但您的博客软件需要跟踪首次调用时创建的帖子 ID,并在后续的嵌入请求中将其作为参数传递。

请参阅主贴中的“链接到现有帖子”部分。

3 个赞

我无法通过 TypeScript 在 Angular 中嵌入,请帮忙

let window: any;

window.DiscourseEmbed = { discourseUrl: 'xyz.com',
  topicId: 26 };

let script = this._renderer2.createElement('script');
script.type = "text/javascript";
script.src = window.DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
script.async = true;
this._renderer2.appendChild(this._document.body, script);
1 个赞