我使用了搜索功能,但没有找到相关信息,尽管我确信之前已经讨论过……
当我登录论坛(作为管理员)时,分类页面显示如下:
作为新注册用户或访客,它显示如下:
为什么“主题”列的内容不同?是否可以在两种情况下显示相同的内容?我该如何选择在这里显示什么?
简短的回答是:你——作为管理员——拥有不同的分类列表。作为管理员,你可以访问私密分类。这里说“管理员”是为了简化表述,但这同样适用于有权访问私密分类的普通用户。因此,你列表中的分类总数会更高。请注意,我指的仅仅是分类,不包括子分类。你可以暂时忽略子分类。
那么,这与 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。
注意:除了适用的“周/月”时间框架外,在移动设备上始终显示总数或“全部”。
所以,让我们试着找出你帖子中的问题。新用户看到 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 更改为一个数字,当该分类在本周创建的新主题数量达到该数字时,它将被视为活跃。其余部分应该可以直接工作。
感谢您提供的代码,但它似乎只能在嵌套级别最多为 max_category_nesting = 2 的类别上运行。
目前此代码适用于:
父级
父级 > 子级
对我来说,以下情况不起作用:
祖父级 > 父级 > 子级
它并没有破坏任何东西,似乎只是应用于默认嵌套(2)的类别。
有没有办法修改它,使其也能用于 max_category_nesting = 3?
谢谢!