Общее количество тем / Тем в месяц на странице категории

Короткий ответ: у вас, как у администратора, другой список категорий. Как администратор, вы имеете доступ к приватным категориям. Я говорю «администратор», чтобы упростить объяснение, но это также касается обычных пользователей, имеющих доступ к приватным категориям. Поэтому общее количество категорий в вашем списке выше. Обратите внимание: речь идёт только о категориях, а не о подкатегориях. Пока что подкатегориями можно пренебречь.

Так как же это связано с тем, что Discourse показывает вам 2 / неделю, 17 / месяц или 4,4 тыс.?

Этот показатель предназначен для отображения активности и, чтобы сделать его более релевантным, учитывает общее количество категорий, к которым имеете доступ именно вы.

Так как же работает вся эта магия? Начнём с базовой информации, которую 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 / неделю рядом с каждой категорией, если это применимо.

А что, если количество активных за неделю категорий меньше 7,92? Тогда Discourse проверит то же самое, но для месячной активности.

Если число больше 7,92 (8 или более активных категорий за месяц), Discourse покажет 22 / месяц рядом с каждой из этих категорий, если это применимо.

Если ни недельное, ни месячное количество активных категорий не превышает 7,92, Discourse вернётся к периоду по умолчанию all и покажет число topics_all_time, то есть 4,4 тыс., как на вашем скриншоте.

Примечание: помимо периодов «неделя/месяц», если они применимы, на мобильных устройствах всегда отображается общее число или период all.

Итак, давайте попробуем разобраться с проблемой в вашем сообщении. Новый пользователь видит 22 / месяц, а вы, как администратор, видите 4,4 тыс.. В чём дело?

Помните это?

Короткий ответ: у вас, как у администратора, другой список категорий. Как администратор, вы имеете доступ к приватным категориям.

Сделаем немного математики…

На вашем сайте 7 категорий верхнего уровня, видимых нашему новому пользователю. Значит, магическое число равно:

7 * 0,66 = 4,62

Другими словами, чтобы Discourse показал 11 / неделю, нужно, чтобы в 5 категориях за эту неделю появились новые темы. На вашем сайте это не так, поскольку только 4 категории соответствуют этому критерию — помните, речь о новых темах, а не о ответах.

Затем Discourse проверяет месячную активность. В вашем случае 6 категорий имели новые темы за этот месяц. 6 больше 4,62, поэтому наш примерный пользователь видит 4 / месяц, как на вашем скриншоте.

Теперь посчитаем для вас, как для администратора. Я не знаю, сколько у вас приватных категорий, но предположим, что их 4. Тогда общее количество категорий составит 11, а магическое число будет:

11 * 0,66 = 7,26

Чтобы вы увидели 11 / неделю, нужно, чтобы как минимум 8 категорий имели новые темы за эту неделю. Если нет, система перейдёт к проверке месячной активности, и тогда нужно как минимум 8 категорий с новыми темами за месяц, чтобы увидеть 4 / месяц. Если ни один из этих условий не выполняется, вы получите 4,4 тыс., как на вашем скриншоте администратора.

Сказав это, стоит отметить, что магическое число в 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;

  // категория считается активной, если за эту неделю в ней появилось как минимум это количество тем
  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 на количество новых тем, созданных за неделю в категории, при котором она считается активной. Остальное должно работать автоматически.