【Movable Type】記事をカテゴリIDでフィルタリングする方法

Posted on
【Movable Type】記事をカテゴリIDでフィルタリングする方法

カテゴリIDで絞り込んだ記事を最新5件表示したかったのですがうまくいかなかったのでその時のメモです。

<mt:Entries lastn="5">
<mt:If tag="categoryID" eq="3">
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><a href="<mt:EntryPermalink>"><mt:EntryTitle></a></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:If>
</mt:Entries>

上記はmt:Entries内でmt:ifを使用して絞り込む方法ですが、この方法だとカテゴリに関係なく記事全体から最新の5件を取得したあとにカテゴリIDが3のものを絞り込んで表示するため、そもそも最新5件にカテゴリIDが3のものがなければ記事は表示されなくなってしまいます。

そこで記事を取得したあとに絞り込むのではなく、mt:Entriesのモディファイアとして用意されているcategoryフィルタで絞り込もうと思ったのですがIDではなく以下のようなカテゴリ名での絞り込みしかできませんでした。

<mt:Entries category="カテゴリ名">
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><a href="<mt:EntryPermalink>"><mt:EntryTitle></a></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:Entries>

カテゴリ名でもやりたいことは実現できるのですが、運用中にカテゴリの名称が変わってしまうと動作しなくなってしまうためできればカテゴリIDでフィルタリングする方法を探していたところ良い方法がありました。

カテゴリ名を変数にしてフィルタリングする

上記と同様にmt:Entriesのcategoryフィルタを使用するのですが、カテゴリ名をそのまま入れるのではなく一度カテゴリ名を変数にいれ、その変数を使ってフィルタリングします。

<mt:ToplevelCategories>
<mt:If tag="categoryID" eq="3">
<mt:SetVarBlock name="catID3Label"><mt:CategoryLabel></mt:SetVarBlock>
</mt:If>
</mt:ToplevelCategories>  

<mt:Entries category="$catID3Label" lastn="5">
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><a href="<mt:EntryPermalink>"><mt:EntryTitle></a></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:Entries>

まずはmt:ToplevelCategories内でmt:Ifを使用してカテゴリIDが3のものを絞り込んだうえでカテゴリ名をcatID3Labelという変数に入れます。
設定した変数は頭に「$」をつけた$catID3Labelという形にすることでモディファイアの値として利用することができるのでこれをmt:Entriesのcategoryモディファイアに設定すればOKです。

このようにしておくことでカテゴリ名が変更されたとしてもテンプレートを変更することなく記事の絞り込みができますし、最新5件など件数を指定した場合でもそのカテゴリの記事だけを対象にフィルタリングしてくれるようになります。

おしまい。