分类页面上的主题总数/每月主题数

简短的回答是:你——作为管理员——拥有不同的分类列表。作为管理员,你可以访问私密分类。这里说“管理员”是为了简化表述,但这同样适用于有权访问私密分类的普通用户。因此,你列表中的分类总数会更高。请注意,我指的仅仅是分类,不包括子分类。你可以暂时忽略子分类。

那么,这与 Discourse 显示 2 / week 还是 17 / month4.4k 有什么关系呢?

该设计旨在作为活跃度的指示,并且为了使其更具相关性,它考虑了可以访问的分类总数。

那么,这一切的“魔法”是如何运作的呢?让我们从 Discourse 为每个分类存储的一些基本信息开始。每个分类都有这四个属性:

topics_day: 12
topics_month: 95
topics_week: 53
topics_year: 874
topics_all_time: 13982

每个属性代表在该时间框架内,该分类或其任一子分类中创建的新主题数量。让我们忽略天和时间框架,因为它们在这里无关紧要。

让我们看一些代码:

discourse/app/assets/javascripts/discourse/app/models/category-list.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

让我们特别关注这一部分

这里发生了什么?好吧,我们首先以 all(全部)作为默认的时间框架。然后我们看到 minCategories(最小分类数)。

这里的 minCategories 是决定上述情况的关键因素。它有点像一个“魔法数字”。用英语来说,它所做的只是将你可用的顶级分类数量乘以 0.66

所以,假设你有 5 个分类。我们将这个数字乘以 0.66,得到 7.92

然后,Discourse 会遍历每个分类并检查 topics_week(周主题数)属性。如果该分类本周有新主题,则被视为本周活跃,并计为 1。Discourse 随后统计被视为活跃的分类数量。然后将该数字与我们上面得到的 7.92 进行比较。

你可以在这里看到

if (filteredCategories.length >= minCategories) {
  statPeriod = period;
  return true;
}

如果该数字大于 7.92(即本周有 8 个或更多活跃分类),Discourse 将在每个相关分类旁边显示 11 / week

那么,如果每周活跃分类的数量低于 7.92 呢?Discourse 将检查相同的内容,但针对的是月度活跃度。

如果该数字大于 7.92(即本月有 8 个或更多活跃分类),Discourse 将在每个相关分类旁边显示 22 / month

如果每周或每月的活跃分类数量都不大于 7.92,Discourse 将回退到默认周期 all(全部),并显示 topics_all_time(所有时间主题数)数字,或者像你截图中那样显示 4.4k

注意:除了适用的“周/月”时间框架外,在移动设备上始终显示总数或“全部”。

所以,让我们试着找出你帖子中的问题。新用户看到 22 / month,而作为管理员的你看到 4.4k,这是怎么回事?

还记得这个吗?

简短的回答是:你——作为管理员——拥有不同的分类列表。作为管理员,你可以访问私密分类。

那么,让我们做一些数学计算……

你的网站对示例中的新用户可见的顶级分类有 7 个。所以魔法数字是

7 * 0.66 = 4.62

换句话说,你需要有 5 个分类在本周有新主题,Discourse 才会显示 11 / week。在你的网站上并非如此,因为只有 4 个符合标准——记住,是新主题,而不是回复。

因此,Discourse 然后检查月度活跃度,在你的情况下,你有 6 个分类在本月有新主题。6 大于 4.62,所以我们的示例用户像你截图中那样看到 4 / month

现在,让我们为你——作为管理员——做一些数学计算。我不知道你有多少私密分类,但让我们假设你有 4 个私密分类。在这种情况下,总数将是 11 个分类,魔法数字将是

11 * 0.66 = 7.26

因此,为了让你看到 11 / week,你需要至少有 8 个分类在本周有新主题。如果不是,它将回退到月度活跃度,你需要至少有 8 个分类在本月有新主题才能看到 4 / month。如果两者都不适用,你将得到 4.4k,就像你的管理员截图一样。

话虽如此,Discourse 中的魔法数字——0.66——似乎有点高,可能需要减少一些,以适应拥有大量中度活跃分类的网站。40% 的网站分类处于活跃状态仍然相当不错。你也可以尝试在 Contribute > Feature 主题中请求一个站点设置来控制这一点。

除此之外,你可以在主题组件中绕过所有这些操作。在你的主题“common header”(通用页眉)选项卡中,可以像这样:

<script type="text/discourse-plugin" version="0.8">
  const { on } = require("discourse-common/utils/decorators");
  const { number } = require("discourse/lib/formatter");
  const I18n = require("I18n").default;

  // 如果本周至少有这么多主题,则分类被视为活跃
  const WEEK_THROSHOLD = 2;

  api.modifyClass("component:parent-category-row", {
    pluginId: "category-activity-indicator",
    @on("didReceiveAttrs")
    setCategoryActivityStats() {
      const category = this.category;

      if (category.topics_week < WEEK_THROSHOLD) {
        return;
      }

      const statPeriod = "week";
      const stat = category[`topics_${statPeriod}`];
      const unit = I18n.t(`categories.topic_stat_unit.${statPeriod}`);

      category.setProperties({
        pickAll: false,
        stat: I18n.t("categories.topic_stat", {
          count: stat,
          number: `<span class="value">${number(stat)}</span>`,
          unit: `<span class="unit">${unit}</span>`,
        }),
        statTitle: I18n.t(`categories.topic_stat_sentence_${statPeriod}`, {
          count: stat,
        }),
      });
    },
  });
</script>

你需要做的唯一更改是将 WEEK_THROSHOLD 更改为一个数字,当该分类在本周创建的新主题数量达到该数字时,它将被视为活跃。其余部分应该可以直接工作。