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

简而言之,您(作为管理员)拥有不同的类别列表。作为管理员,您可以访问私有类别。我说管理员是为了简单起见,但这同样适用于有权访问私有类别的普通用户。因此,您列表中的类别总数会更高。请注意,我只谈论类别,不谈子类别。现在您可以忽略子类别。

那么,这与 Discourse 显示您 2 / week17 / month 还是 4.4k 有何关系?

它的设计目的是指示活动情况,并且为了使其更具相关性,它会考虑您可以访问的类别总数。

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

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

每个属性代表在该时间范围内,在类别或其任何子类别中创建的新主题的数量。让我们忽略日和年时间范围,因为它们在这里不相关。

让我们看一些代码:

并特别关注这一部分:

这里发生了什么?嗯,我们从默认时间范围 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,就像您屏幕截图中的一样。

注意:除了适用的 week/month 时间范围外,总数或 all 始终在移动设备上显示。

所以,让我们试着弄清楚您帖子中的问题。新用户看到 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% 的网站类别活跃仍然相当不错。您也可以尝试在 #feature 主题中请求一个站点设置来控制它。

除此之外,您可以通过主题组件绕过所有这些。在您的主题的通用标题选项卡中可以这样做。

<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;

  // category is considered active if it had at least this many topics this week
  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,即类别本周创建的新主题数量,超过该数量即被视为活跃。其余的应该可以正常工作。

7 个赞