制作記事 Web制作アプリケーションMovableTypeカテゴリー別に記事一覧を表示する

カテゴリー別に記事一覧を表示する

インデックスアーカイブ、ブログ記事アーカイブにおいて使うのに最適。
※カテゴリーアーカイブにおいては、コンテキストの関係でうまくいかないので、要注意。

サンプルソースはこんな感じ。

<ul>
<MTTopLevelCategories>
<MTIfNonZero tag="categorycount">
<li><a href="<mt:categoryarchivelink>"><mt:categorylabel remove_html="1"></a><span> (<mt:categorycount>)</span>
<MTEntries lastn="9999">
<MTEntriesHeader><ul></MTEntriesHeader>
<li><a href="<mt:entrylink>"><mt:entrytitle /></a></li>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>
<MTElse>
<li><mt:categorylabel remove_html="1">
</MTIfNonZero>
<MTHasSubCategories>
<ul></MTHasSubCategories>
<mt:subcatsrecurse />
<MTHasSubCategories></ul></MTHasSubCategories>
</li>
</MTTopLevelCategories>
</ul>

とりあえず、分かりやすくするためにhtmlタグを取っちゃいます。

<MTTopLevelCategories>
<MTIfNonZero tag="categorycount">
<mt:categoryarchivelink /><mt:categorylabel /> (<mt:categorycount />)
<MTEntries lastn="9999">
<mt:entrylink /><mt:entrytitle />
</MTEntries>
<MTElse>
<mt:categorylabel />
</MTIfNonZero>
<mt:subcatsrecurse />
</MTTopLevelCategories>

やっていることは

  1. 一番親カテゴリに対して処理することにする
  2. もし、そのカテゴリに記事がある場合はカテゴリ名に記事リストアーカイブへのリンクをつけ、記事数を表示する
    1. さらに記事のタイトルと記事へのリンクを追加する
  3. もし、そのカテゴリに記事がない場合はカテゴリ名だけ表示する
  4. そんな処理を子階層を親要素と見立てて処理する

ポイントは、mt:subcatsrecurse。
このMTタグを使うと、MTTopLevelCategories内で処理したことをそのまま、下階層で処理をすることができる特殊なMTタグ。
htmlタグをうまく使うことで、Web標準に則したマークアップを構築することができます。

今回の例では、MTSubCatIsFirst の変わりに MTHasSubCategories を使った。MTSubCatIsFirst の使いどころがちょっと難しく、実際どういう使い方をすればメリットになるのか、いまいちつかめなかった。

ソース上をすっきりさせるために、改行を調整して完成!

<ul><MTTopLevelCategories>
<MTIfNonZero tag="categorycount"><li><a href="<mt:categoryarchivelink>"><mt:categorylabel remove_html="1" /></a><span> (<mt:categorycount />)</span><MTEntries lastn="9999"><MTEntriesHeader>
<ul></MTEntriesHeader>
<li><a href="<mt:entrylink>"><mt:entrytitle /></a></li><MTEntriesFooter>
</ul>
</MTEntriesFooter></MTEntries><MTElse><li><mt:categorylabel remove_html="1" /></MTIfNonZero><MTHasSubCategories>
<ul></MTHasSubCategories><mt:subcatsrecurse /><MTHasSubCategories>
</ul>
</MTHasSubCategories></li></MTTopLevelCategories>
</ul>