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

フォーラムで検索機能を使ってみましたが、以前に議論されたことがあるはずなのに、それに関する情報が見つかりませんでした。

フォーラムに管理者としてログインしている場合、カテゴリページは次のように表示されます。

新規登録ユーザーまたはゲストとして表示される場合は次のようになります。

「トピック」列の内容が異なるのはなぜですか?両方のケースで同じ内容を表示することは可能ですか?ここで表示する内容をどのように選択しますか?

短く言うと、あなた(管理者として)は異なるカテゴリリストを持っているからです。管理者として、あなたはプライベートカテゴリにアクセスできます。ここでは分かりやすく「管理者」と言っていますが、プライベートカテゴリにアクセスできる一般ユーザーにも同様のことが当てはまります。つまり、あなたのリストにあるカテゴリの総数は多くなります。なお、ここではサブカテゴリではなくカテゴリのみについて話しています。サブカテゴリについては一旦無視してください。

では、これが Discourse が 2 / 週17 / 月 または 4.4k のような表示をするかどうかとどう関係しているのでしょうか?

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

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

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

となります。つまり、Discourse が 11 / 週 を表示するためには、今週新しいトピックのあるカテゴリが5つ必要です。あなたのサイトでは、条件に一致するのは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 トピックで、それを制御するサイト設定をリクエストしてみることもできます。

それ以外の場合、テーマコンポーネントでこれらすべてを回避できます。テーマの共通ヘッダータブに以下のようなものを追加します。

<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 レベルまでのカテゴリにしか機能しないようです。

現在、このコードは以下で機能します。

Parent
Parent > Sub

私には以下で機能しません。

Grandparent > Parent > Sub

何も壊れるわけではありませんが、デフォルトのネスト(2)カテゴリまでは適用されるようです。

max_category_nesting = 3 でも機能するように変更する方法はありますか?

よろしくお願いします!