카테고리 페이지의 총 주제 수 / 월별 주제 수

I used the search function, but I didn’t find any information on that though I’m sure this have been discussed before…

When I’m logged in on my forum (as an admin), here’s how the category page appears:

As a newly registered user, or as a guest, here’s how it appears:

Why is the Topics column content different? Is it possible to have the same content in both cases? How do I choose what I show here?

간단히 말하면, 관리자이신 여러분은 다른 카테고리 목록을 보게 됩니다. 관리자는 비공개 카테고리에 접근할 수 있습니다. 여기서는 간단히 설명하기 위해 '관리자’라고 했지만, 비공개 카테고리에 접근 권한이 있는 일반 사용자들에게도 동일하게 적용됩니다. 따라서 여러분 목록에 표시되는 카테고리 총수가 더 많습니다. 참고로 여기서 말하는 것은 카테고리이며, 하위 카테고리는 아닙니다. 지금은 하위 카테고리는 무시하셔도 됩니다.

그렇다면 이것이 Discourse가 2 / 주 또는 17 / 월 또는 4.4k를 표시하는 것과 어떻게 관련이 있을까요?

이것은 활동성을 나타내는 지표로 설계되었으며, 관련성을 높이기 위해 여러분이 접근할 수 있는 카테고리 총수를 고려합니다.

그렇다면 이 모든 마법이 어떻게 작동할까요? Discourse가 각 카테고리에 대해 저장하는 기본 정보부터 시작해 보겠습니다. 각 카테고리에는 다음 네 가지 속성이 있습니다:

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

각 값은 해당 기간 동안 해당 카테고리나 그 하위 카테고리에서 생성된 새 토픽의 수를 나타냅니다. 여기서는 관련이 없는 '일(day)'과 ‘연(year)’ 기간은 무시합시다.

다음 코드를 살펴봅시다:

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를 표시합니다.

참고: week/month 기간 외에도, 적용 가능한 경우 모바일에서는 항상 전체(all) 수치가 표시됩니다.

자, 이제 여러분 게시글의 문제를 파악해 보겠습니다. 신규 사용자는 22 / 월을 보지만, 관리자이신 여러분은 4.4k를 보고 있습니다. 무엇이 문제일까요?

이것을 기억하시나요?

간단히 말하면, 관리자이신 여러분은 다른 카테고리 목록을 보게 됩니다. 관리자는 비공개 카테고리에 접근할 수 있습니다.

자, 계산을 해 보겠습니다…

여러분의 사이트에는 예시 신규 사용자에게 보이는 최상위 카테고리가 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개여야 합니다. 그렇지 않으면 월간 활동성으로 되돌아가며, 4 / 월을 보려면 이번 달에 새 토픽이 있는 카테고리가 최소 8개여야 합니다. 이 두 조건 중 어느 것도 충족되지 않으면, 관리자 스크린샷과 같이 4.4k가 표시됩니다.

결론적으로, Discourse의 마법 숫자인 0.66은 다소 높은 것으로 보이며, 중간 정도 활동성을 가진 카테고리가 많은 사이트를 위해 낮추는 것이 유리할 수 있습니다. 사이트 카테고리의 40%가 활동성 있는 것은 여전히 꽤 괜찮은 수치입니다. 또한 Contribute > 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만입니다. 이 값은 카테고리에서 이번 주에 생성된 새 토픽의 수 중 활동성 있는 것으로 간주되는 임계값입니다. 나머지는 그대로 작동할 것입니다.

Thank you for the above code, but it seems to work only on categories with up to max_category_nesting = 2 level.

Right now this code works on:

Parent
Parent > Sub

Not working for me with:

Grandparent > Parent > Sub

It does not break anything, it just gets applied up to default nesting (2) categories it seems.

Is there a way to modify it so it also works on max_category_nesting = 3?

Thanks!