月別アーカイブリストで特定のカテゴリの記事を除外してカウントする

MTQに以下のような質問が上がっていました。

月別アーカイブリストを出力する際に、カテゴリAの記事数を除外して、他のカテゴリの記事数だけを出力するようにしたいです。

この質問に答えます。

1.考え方

MTArchiveListタグでアーカイブの一覧を出力する際に、MTArchiveCountタグで個々のアーカイブの記事数を出力することができます。
しかし、記事数を集計する際に、集計の条件を追加するような機能はありません。

ただ、今回の事例だと、以下のような方法が考えられます。

  • 月別カテゴリ別アーカイブリストを利用し、各月のカテゴリAの記事数をあらかじめ求めておきます。
  • 月別アーカイブリストを出力する際に、上で求めたカテゴリAの記事数を引き算します。

2.テンプレートの書き方

上記の考え方に基づいてテンプレートを組むと、以下のようになります。

<mt:ArchiveList archive_type="Category-Monthly">
  <mt:If tag="CategoryLabel" eq="カテゴリA">
    <$mt:ArchiveDate format="%Y%m" setvar="month"$>
    <mt:SetVarBlock name="sub_count" key="$month"><$mt:ArchiveCount$></mt:SetVarBlock>
  </mt:If>
</mt:ArchiveList>

<ul>
<mt:ArchiveList archive_type="Monthly">
  <$mt:ArchiveCount setvar="count"$>
  <$mt:ArchiveDate format="%Y%m" setvar="month"$>
  <$mt:GetVar name="sub_count" key="$month" setvar="sub"$>
  <$mt:SetVar name="count" op="-" value="$sub"$>
  <li><$mt:ArchiveTitle"$>(<$mt:GetVar name="count"$>)</li>
</mt:ArchiveList>
</ul>

前半は、月別カテゴリ別アーカイブリストを使って、カテゴリAの月別記事数を求め、「sub_count」というハッシュに代入する処理です。
3行目のMTArchiveDateタグで、「201507」のようにアーカイブの月を求め、それを変数monthに代入します。
そして、4行目のMTSetVarBlockタグで、ハッシュsub_countの各月の要素に、その月のカテゴリAの記事数(MTArchiveCountタグ)を代入します。

後半は、月別アーカイブリストを出力する部分です。
まず、2行目のMTArchiveCountタグで、各月の記事数をいったんcountに代入します。
次に、3行目と4行目で、ハッシュsub_countから、その月に該当する要素の値(=その月のカテゴリAの記事数)を取り出し、変数subに代入します。
そして、5行目で変数countから変数subの値を引いて、カテゴリAの記事数を除いた各月の記事数を求めます。

3.問題点

上記の方法では、1つ問題があります。
カテゴリAの記事が他のカテゴリにも属している場合、その記事はカウントに含まれなくなります。

例えば、2015年7月の記事が3件で、そのすべての記事がカテゴリAとカテゴリBに属しているとします。
この場合、カテゴリを考慮しない2015年7月の全記事数は3件ですが、カテゴリAのみの2015年7月の全記事数も3件で、前者から後者を引くと0になってしまいます。

このように、集計から除外したいカテゴリの記事は、そのカテゴリにのみ属していなければならないという制約があります。