外部 URL 的重定向页面

你正在寻找的功能被称为“帖子装饰器”(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>

再次强调,重定向用户会带来太多摩擦,很快就会让人厌烦。因此,我建议你考虑其他方法,比如在外部链接旁边添加一个微妙的图标,并教导你的用户其含义,怎么样?

5 个赞