通过 WordPress 嵌入发布的旧主题缺少 x-robots: noindex 和 canonical 标签

大家好,

我注意到从 WordPress 自动发布到 Discourse(用作评论区)的旧帖子存在一个奇怪的问题。

通常情况下,以这种方式发布帖子时,Discourse 会正确地在 HTTP 头中添加 X-Robots-Tag: noindex,并将 canonical URL 设置回指向 WordPress 博客文章。

然而,我发现较旧的帖子正在丢失这些标签noindex 头消失了,canonical 标签也不再存在。以下是出现此问题的一些帖子示例:

有人知道如何解决这个问题吗?

请注意,我无法确切知道目前有多少帖子受到了影响,但看起来数量相当多。

如果能在分类(或标签?)设置中有一个复选框,启用后自动为在该分类下发布的所有帖子添加 noindex,那就太好了。类似于:

[ ] 在搜索结果中隐藏此分类下的帖子

嘿,Thiago,

为了确认我的理解,你的意思是:

  1. 你启用了站点设置“Embed set canonical URL”,并且一直启用着。
  2. 你通过 WordPress Discourse 插件,在一段时间内将多个话题从 WordPress 发布到了 Discourse。
  3. 直到最近,所有按上述第 2 点发布的话题,其 <head> 中都包含一个 link rel="canonical",且 href 指向 WordPress 的 URL。
  4. 最近某个时间点,你认为其中一部分原本符合第 3 点描述的话题,现在其 link rel="canonical"href 已改为指向 Discourse 的 URL。

是这样吗?

嗨,Angus!

是的,没错。

“嵌入设置规范 URL”也已启用:

可以在此处看到,新主题发布时带有 noindex 和 canonical 标签。但我发现旧主题缺少这些标签。

Thiago,如果你有服务器访问权限,能否请找一个规范 URL 无法生效的主题,获取其 ID,然后在 Rails 控制台中运行以下命令,并分享结果。

./launcher enter app
rails c
TopicEmbed.with_deleted.find_by(topic_id: 在此处添加主题 ID)
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:73608)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:79015)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:74248)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:76598)
=> nil

这就是问题所在。为了让嵌入功能的规范 URL 正常工作,主题必须拥有 topic_embed 记录。你能想到这些主题可能没有嵌入记录的任何原因吗?

说实话,我不清楚是什么导致这些主题缺失了它们的 topic_embed 记录。

但从整体来看,采用我之前建议的配置岂不是更合理?如果我们在分类设置中直接添加一个复选框,以便为该分类下的所有主题应用 noindex,我们就不必依赖嵌入功能,也不必担心这些记录是否存在了。

虽然这对您的网站来说可能合理,但这与主题嵌入的规范 URL 工作方式属于不同的功能。您可以自行构建,但需要将其作为自定义插件来实现。

嵌入功能的规范 URL 按预期工作,但似乎您的网站在某处删除了嵌入记录,或执行了其他操作。Discourse 不会硬删除主题嵌入记录,因此一定发生了其他情况。除非您进行一些自定义开发,否则您需要重新发布这些主题以重新创建嵌入记录。

虽然这与主题嵌入的行为不同,但类别级别的索引控制是任何现代内容管理系统(CMS)的基本 SEO 需求。关于这一点已有多个 Meta 主题讨论,将其原生化将一次性解决多种用例。

我可能会尝试利用 AI 开发一个插件,因为 Ruby 并非我的技术栈,但这确实应该作为一个原生功能实现。

关于缺失的记录:我们并未执行任何可能导致此问题的数据库命令或操作。此外,重新发布并不可行。我们拥有近 5 万篇帖子,甚至不清楚哪些受到了影响。要解决这个问题,需要编写复杂的 API 脚本来查找、删除并重新发布所有内容……