【Movable Type】ブログ一覧をID順で出力する
概要
MT(PowerCMS含む)においてブログ一覧を出力する際に、ブログID順で出力する方法について解説しています。
ブログやウェブサイトの一覧を出力するMTBlogs
やMTWebsites
には、MTEntries
におけるsort_by
やsort_order
といったモディファイアが存在せず、一覧の並び順はブログ名を基準とした文字コードの昇順(管理画面のブログ一覧やウェブサイト一覧にデフォルトで表示されている順)で出力されます。
ブログやウェブサイトの一覧をID順で出力するには、ループ出力の部分をハッシュ(連想配列)としてデータ単位で格納し、MTLoop
を使用して出力します。
この方法は、以前公開した複数のコンテンツタイプをまとめて出力する記述とおおむね構造は同じです。
構造
ブログ一覧をID順で出力するMTMLは、おおまかに以下の構造です。
<!-- ブログ一覧のループ部分をハッシュに格納する -->
<mt:Blogs blog_ids="[複数のブログID]">
<mt:BlogID zero_pad="[num]" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<!-- 出力する内容 -->
</mt:SetVarBlock>
</mt:Blogs>
<!-- 出力表示部分 -->
<mt:Loop name="menu" sort_by="key">
<mt:Var name="__value__">
</mt:Loop>
MTBlogs
内でMTSetVarBlock
を利用し、中身はハッシュ(連想配列)としてデータ単位で格納します。ブログID順で出力する場合はMTBlogID
をハッシュのkey
としますが、格納する桁数を揃えないとうまくソートされないため(ブログIDが3と10の場合、10のあとに3がきます)、グローバルモディファイアのzero_pad
を利用して桁数を調整します。
MTLoop
内の<mt:Var name="__value__">
が実際の出力部分です。
MTBlogs
内のsetvar="key"
のkey
とname="menu{$key}"
の{$key}
、name="menu{$key}"
のmenu
とMTLoop
のname="menu"
のmenu
がそれぞれ対応しています。これらの値は任意のもので構いません。
コード例
以下出力例です。先述のとおり、以前公開した複数のコンテンツタイプをまとめて出力する記述とおおむね構造は同じです。
<mt:Blogs blog_ids="children">
<mt:BlogID zero_pad="2" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<li><a href="<$mt:BlogURL$>"><$mt:BlogName$></a></li>
</mt:SetVarBlock>
</mt:Blogs>
<mt:Loop name="menu" sort_by="key">
<mt:If name="__first__">
<ul>
</mt:If>
<mt:Var name="__value__">
<mt:If name="__last__">
</ul>
</mt:If>
</mt:Loop>
コード例ではMTSetVarBlock
内を見やすいように改行・インデント処理していますが、エラーとなり処理がうまくいかない可能性があるため、実際のテンプレートでは改行やインデントはせず1行で記述するようにしてください。
解説:MTBlogs部分
以下、MTBlogs
のMTMLです。
<mt:Blogs blog_ids="children">
<mt:BlogID zero_pad="2" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<li><a href="<$mt:BlogURL$>"><$mt:BlogName$></a></li>
</mt:SetVarBlock>
</mt:Blogs>
blog_ids="children"
としていますが、モディファイアや値は環境に合わせて適宜変更してください。
MTBlogID
をハッシュのkey
に指定していますが、桁数が合わないとうまくソートされないため、zero_pad
で桁数を調整します。例では2桁になるようにしています。
上記のコードは、以下のハッシュ(連想配列)を生成します(わかりやすいようにPHPなどでの表記に合わせています / 概念的なものとしてご参考ください)
{ "[BlogID]": "<li>(省略)</li>" },
{ "[BlogID]": "<li>(省略)</li>" },
{ "[BlogID]": "<li>(省略)</li>" },
.
.
.
<mt:BlogID zero_pad="2" setvar="key">
でブログIDを変数key
として定義します。ハッシュのkey
の値になります(setvar
の値はkey
以外でも問題ありません)
今回はブログIDでソートしていますが、ソートに使うkey
の値は他の値でも問題ありません。
<mt:SetVarBlock name="menu{$key}">〜</mt:SetVarBlock>
がハッシュのvalue
の値です。name="menu{$key}"
の$key
は、MTBlogID
で定義したsetvar
と同じものを$
をつけて指定します。
以下の記述は同じです。どちらで記述するかはお好みで。
name="menu{$key}"
(name="menu" key="$key"
)のmenu
の値は任意のもので構いません。
<!-- これと -->
<mt:SetVarBlock name="menu{$key}"></mt:SetVarBlock>
<!-- これは同じ -->
<mt:SetVarBlock name="menu" key="$key"></mt:SetVarBlock>
<mt:SetVarBlock name="menu{$key}">〜</mt:SetVarBlock>
の中身は出力する中身にあわせて適宜変更してください。この部分は通常のMTMLの記述と同じです。
MTBlogs
部分の記述は以上です。
解説:MTLoop部分
以下はMTLoop
のMTMLです。MTBlogs
で生成したハッシュ(連想配列)データを出力します。
<mt:Loop name="menu" sort_by="key">
<mt:If name="__first__">
<ul>
</mt:If>
<mt:Var name="__value__">
<mt:If name="__last__">
</ul>
</mt:If>
</mt:Loop>
MTLoop
のname
モディファイアの値は、MTBlogs
内のMTSetVarBlock
で指定したname
モディファイアの値です。
ソートの基準はkey
(今回の例では[BlogID]
)です。降順で出力する場合は、sort_by
にreverse
を追加で指定します。
MTLoop
内ではMTEntriesHeader
のような独自タグが存在しないため、ループ内で最初あるいは最後だけ出力するにはMTIf
の予約変数(__first__
や__last__
)を利用します。
MTBlogs
で定義した出力部分は以下です。
<mt:Var name="__value__">
MTLoop
部分および本記事の解説は以上です。
公式リファレンスなど
MT
- https://www.movabletype.jp/documentation/appendices/tags/blogs.html
- https://www.movabletype.jp/documentation/appendices/tags/websites.html
Discussion