カテゴリページのトピック総数 / 月別トピック数

端的に言えば、管理者であるあなたには異なるカテゴリリストが表示されています。管理者はプライベートカテゴリにアクセスできるためです。ここでは簡単にするために管理者と言いましたが、これはプライベートカテゴリにアクセスできる一般ユーザーにも当てはまります。そのため、リスト上のカテゴリの総数は多くなります。なお、ここではカテゴリのみについて話しており、サブカテゴリについては触れていません。サブカテゴリは今は無視して構いません。

では、これがDiscourseがあなたに「週2件」または「月17件」または「4.4k件」を表示するかどうかとどう関係するのでしょうか?

これはアクティビティの指標として設計されており、より関連性の高いものにするために、あなたがアクセスできるカテゴリの総数を考慮に入れています。

では、この魔法はどのように機能するのでしょうか?まず、Discourseが各カテゴリについて保存している基本的な情報から始めましょう。各カテゴリには、次の4つのプロパティがあります。

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件」と表示します。

では、アクティブな週次カテゴリの数が 7.92 より少ない場合はどうでしょうか?Discourseは同じことを月次アクティビティでチェックします。

この数が 7.92 より大きい場合(今月アクティブなカテゴリが8つ以上)、Discourseは該当する各カテゴリの横に「月22件」と表示します。

週次または月次のアクティブカテゴリの数が 7.92 より大きくない場合、Discourseはデフォルトの時間枠 all にフォールバックし、topics_all_time の数、つまりスクリーンショットのような「4.4k件」を表示します。

注:適用可能な場合、週次/月次の時間枠に加えて、合計または「すべて」は常にモバイルで表示されます。

では、あなたの投稿の問題を特定してみましょう。新規ユーザーは「月22件」を表示し、管理者であるあなたは「4.4k件」を表示しているのはなぜでしょうか?

覚えてますか?

端的に言えば、管理者であるあなたには異なるカテゴリリストが表示されています。管理者はプライベートカテゴリにアクセスできるためです。

では、計算してみましょう…

あなたのサイトには、例の新規ユーザーに見えるトップレベルカテゴリが7つあります。したがって、魔法の数字は

7 * 0.66 = 4.62

つまり、「週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%がアクティブであることは、依然としてかなりまともな割合です。#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 だけです。残りは機能するはずです。

「いいね!」 7