你正在寻找的功能被称为“帖子装饰器”(post decorator)。它是一个钩子,允许你在每个帖子渲染之前运行脚本。它是 插件 API 的一部分。
现在,关于你想做的事情(重定向所有外部链接)。我认为增加这么多摩擦并不是个好主意,所以我无法在这方面帮助你——况且你已经自己解决了那部分问题。不过,这里有一个带注释的示例,展示如何创建一个针对帖子中所有外部链接的设置。
这段代码应放在你的主题/主题组件的 header 部分:
<script type="text/discourse-plugin" version="0.8">
// 存储主机名以便重复使用。
const siteHostname = location.hostname;
// 让我们创建一个装饰器,在每个帖子中执行此操作
api.decorateCooked(
post => {
// 帖子中有链接吗?
const links = [...post[0].querySelectorAll("a")];
// 如果没有链接,直接退出。
if (!links.length) return;
// 有链接,让我们过滤它们,只获取外部链接
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// 如果有外部链接,我们可以做一些处理。例如,我们可以
// 为每个外部链接添加一个类,如下所示。
externalLinks.forEach(link => {
link.classList.add('external-link');
// 在这里做更多处理。
});
},
// 我们给装饰器一个 ID 以防止内存泄漏。
{ id: "external-link-decorator" }
);
</script>
再次强调,重定向用户会带来太多摩擦,很快就会让人厌烦。因此,我建议你考虑其他方法,比如在外部链接旁边添加一个微妙的图标,并教导你的用户其含义,怎么样?
