拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
サブカテゴリも含めたブログ記事数とコメント数を出力する
SuperSortプラグインに対して先日いただいたご質問に対し、さらに以下のご質問をいただきました。
ページの最初に、該当カテゴリとそのサブカテゴリに含まれる全ブログ記事と全コメントの件数を表示したい
各カテゴリの記事を全件出力するなら、タグの組み合わせだけで可能です(各カテゴリから先頭の数件ずつ記事を出力する場合は不可)。
その方法を解説します。
1.各カテゴリのブログ記事数とコメント数を合計する
MTSubCategoriesタグでカテゴリごとに記事を出力する場合、MTSubCategoriesタグのブロックの中でMTCategoryCountタグを使うと、個々のカテゴリに属する記事数が出力されます。
そこで、「該当カテゴリとそのサブカテゴリに含まれる全ブログ記事数」を求めるには、変数を利用して、各カテゴリのブログ記事数を合計するという手法をとります。
同様に、カテゴリ内の各記事についたコメントの件数を合計するのにも、変数を利用します。
ブログ記事数/コメント数を、それぞれ「entry_count」「comment_count」という変数に求めるとすると、以下のようにタグを組みます。
<MTSetVar name="entry_count" value="0"> <MTSetVar name="comment_count" value="0"> <MTSubCategories include_current="1" sort_method="SortCatFld::Sort"> <MTSetVarBlock name="entry_count" op="+"><$MTCategoryCount$></MTSetVarBlock> カテゴリの情報を出力する処理 <MTSortedEntries> <MTSetVarBlock name="comment_count" op="+"><$MTEntryCommentCount$></MTSetVarBlock> ブログ記事の情報を出力する処理 </MTSortedEntries> <MTSubCatsRecurse> </MTSubCategories>
各カテゴリの情報を出力する前(4行目)に、MTSetVarBlockタグの行があります。
この行では、変数entry_countに、MTCategoryCountタグの出力(各カテゴリのブログ記事数)を足す処理を行っています。
この処理によって、すべてのカテゴリの処理が終わると、変数entry_countには各カテゴリのブログ記事数を合計した値が求められます。
また、ブログ記事の情報を出力する前(8行目)にも、MTSetVarBlockタグの行があります。
この行では、カテゴリの記事数を合計するのと同じ考え方で、ブログ記事ごとのコメント数(MTEntryCommentCount)を合計し、変数comment_countに求めます。
2.ブログ記事数/コメント数をブログ記事一覧の前に出力する
上記の手順で、サブカテゴリも含むブログ記事数/コメント数を求めることができます。
ただ、結果が出るのは、カテゴリ内のすべてのブログ記事を出力し終わった後です。
しかし、いただいたご質問では、「ブログ記事数/コメント数をページの先頭に出力したい」ということでした。
つまり、ブログ記事を出力する前に、ブログ記事数/コメント数を出力することが必要です。
このようなことも、変数を使って実現することができます。
一連のタグ群Aの処理を行うことによって、変数xに何らかの値が求められるとします。
そして、タグ群Aの処理結果を出力するより前に、変数xの値を出力したいとします。
このような処理は、以下のように書くことができます。
なお、「some_var」は仮の変数名で、ご自分の好きな名前を使うことができます。
<MTSetVarBlock name="some_var"> タグ群A </MTSetVarBlock> <MTGetVar name="x"> <MTGetVar name="some_var">
最初の3行は、タグ群Aの処理を行って、その出力全体を変数some_varに代入する処理です。
変数に代入するので、この段階ではファイルには出力されません。
また、タグ群Aの処理は行われますので、最初の3行の処理が終わった時点で、変数xには値が求められます。
そこで、4行目のMTGetVar文で、変数xの値を先に出力します。
その後に、5行目の文で変数some_varの値(=タグ群Aの処理結果)を出力します。
ここまでの話に基づいて、ブログ記事数/コメント数をブログ記事一覧の前に出力するようにするには、以下のようにタグを組みます。
最初の行の<MTSetVarBlock>タグから、最後から2行前の</MTSetVarBlock>タグまでの部分で、サブカテゴリも含めた記事一覧が、変数entriesに求められます。
それとともに、変数entry_count/comment_countには、サブカテゴリも含めた記事数/コメント数が求められます。
そして、最後の1行前の文で変数entry_count/comment_countの値を先に出力し、最後の行で変数entriesの値(=サブカテゴリも含めた記事一覧)を出力します。
<MTSetVarBlock name="entries"> <MTSetVar name="entry_count" value="0"> <MTSetVar name="comment_count" value="0"> <MTSubCategories include_current="1" sort_method="SortCatFld::Sort"> <MTSetVarBlock name="entry_count" op="+"><$MTCategoryCount$></MTSetVarBlock> カテゴリの情報を出力する処理 <MTSortedEntries> <MTSetVarBlock name="comment_count" op="+"><$MTEntryCommentCount$></MTSetVarBlock> ブログ記事の情報を出力する処理 </MTSortedEntries> <MTSubCatsRecurse> </MTSubCategories> </MTSetVarBlock> <p>ブログ記事数 = <$MTGetVar name="entry_count"$>, コメント数 = <$MTGetVar name="comment_count"></p> <$MTGetVar name="entries"$>