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

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

Как это связано с тем, показывает ли Discourse вам 2 / нед, 17 / мес или 4,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 / нед рядом с каждой соответствующей категорией.

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

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

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

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

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

Вспомните это?

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

Давайте сделаем некоторые расчеты…

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

7 * 0,66 = 4,62

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

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

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

11 * 0,66 = 7,26

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