简而言之,您(作为管理员)拥有不同的类别列表。作为管理员,您可以访问私有类别。我说管理员是为了简单起见,但这同样适用于有权访问私有类别的普通用户。因此,您列表中的类别总数会更高。请注意,我只谈论类别,不谈子类别。现在您可以忽略子类别。
那么,这与 Discourse 显示您 2 / week、17 / 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,即类别本周创建的新主题数量,超过该数量即被视为活跃。其余的应该可以正常工作。
