最新10件の記事で使われているタグのうち5つのタグをタグクラウドで表示
Movable Type 4.1 では、いくつかのテンプレータグが強化されました。中にはハッシュ変数や、配列変数を作成したり、値を加算、減算するものなど、プログラミング言語のように扱うことができるものもたくさんあります。これまでも Movable Type では、変数を設定したり、条件判断を行ったりと、さまざまな処理が可能でしたが、このテンプレートタグの強化でさらにその可能性が拡がりました。
今回は強化されたテンプレートタグを利用したサンプルとして、最新10件の記事で使われているタグのうち5つのタグをタグクラウドで表示するウィジェットを作成してみたいと思います。
このウィジェットでは、過去のブログ記事に付けた最近はあまり付けないタグではなく、最近よく付けるタグのみを、タグクラウドに表示することができます。これは MTTags
ブロックタグなどに sort_by="modified_on"
を設定しても実現できそうですが、この場合の modified_on
は、タグに変更があった場合になります。
ではサンプルをみてみましょう。解説は部分的に切り出して順に行います。
<div class="widget-tag-cloud widget"> <h3 class="widget-header">タグクラウド</h3> <div class="widget-content"> <MTSetVar name="i" value="5"> <MTEntries lastn="10"> <MTEntryTags> <$MTTagName setvar="tagname"$> <MTUnless name="seen{$tagname}"> <MTIf name="i" gt="0"> <MTSetVar name="i" op="--"> <MTSetVar name="seen" key="$tagname" value="1"> <MTSetVarBlock name="push(tag_htmls)"> <li class="rank-<$mt:TagRank max="10"$> widget-list-item"><a href="<$mt:TagSearchLink$>"><$mt:TagName$></a></li> </MTSetVarBlock> </MTIf> </MTUnless> </MTEntryTags> </MTEntries> <ul class="widget-list"> <MTLoop name="tag_htmls"> <MTVar name="__value__"> </MTLoop> </ul> </div> </div>
- タグクラウドに表示するタグの件数
-
<MTSetVar name="i" value="5">
変数 i に値 5 を代入します。この値はタグクラウドに表示するタグの最大件数になります。
- 対象となるブログ記事の件数
-
<MTEntries lastn="10">...</MTEntries>
ブログで管理している最新10件ブログ記事分、繰り返し処理します。
- ブログ記事に付けられたタグ
-
<MTEntryTags>...</MTEntryTags>
ブログ記事に付けられたタグ分、繰り返し処理します。
これより先は、最新10件のブログ記事に付けられたタグひとつひとつに対し処理を行います。
- 変数 tagname の設定
-
<$MTTagName setvar="tagname"$>
MTTagName
ファンクションタグに setvar グローバルモディファイアを設定し、変数 tagname に代入します。 - 既に処理したタグかどうかを判別
-
<MTUnless name="seen{$tagname}">...</MTUnless>
ハッシュ変数 seen に変数 tagname に代入された値(ブログ記事に付けられたタグ)と同じものが無い場合のみ囲まれな内容を処理します。サンプルでは、最新10件のブログ記事を対象としていますが、全てのブログ記事全てに別のタグが付けられているとは限りません。この部分では同じタグが複数回処理されないように条件判断を行っています。この条件にあてはまったら、次の処理へ移ります。
- 繰り返し処理する条件を設定
-
<MTIf name="i" gt="0">...</MTIf>
処理されるたび、変数 i に代入された値が 0 以上の場合にのみ囲まれた内容を処理します。
- 変数 i の値を処理する度にデクリメントする
-
<MTSetVar name="i" op="--">
変数 i の値をデクリメント(1ずつ減)します。何からデクリメントするかというと、サンプルテンプレートの最初に変数 i に代入した 5 という値からです。この前にある条件分岐は変数 i の値が 0 以上の場合実行するというものですので、ここからは5回以上処理されません。
- ハッシュ変数 seen の key に処理したタグを代入
-
<MTSetVar name="seen" key="$tagname" value="1">
ハッシュ変数 seen を作成します。key には変数 tagname 値 (タグ) を、value には 1 を代入します。このハッシュ変数 seen は同じタグが処理されないように条件判断を行った
MTUnless
ブロックタグで参照されます。 - 出力される HTMl を配列変数 tag_htmls に代入
-
<MTSetVarBlock name="tag_htmls" function="push"><li class="rank-<mt:tagrank max="10"> widget-list-item"><a href="<mt:tagsearchlink>"><$MTTagName$></a></li></MTSetVarBlock>
ここまで条件にあてはまり処理されてきたタグは、
MTSetVarBlock
ブロックタグで囲まれたテンプレートで、出力用の HTML に出力され配列変数 tag_htmls に push (追加) されます。
ここまでで出力される内容は最新10件のブログ記事に付けられたタグで一回目に現れるもの5件分のリスト (li) が配列変数 tag_htmls に代入されました。最後に各々の値を順に出力します。
- 配列変数 tag_htmls を参照、値を出力
-
<ul class="widget-list"> <MTLoop name="tag_htmls"> <MTVar name="__value__"> </MTLoop> </ul>
配列変数 tag_htmls の値を順に参照し出力するには
MTLoop
ブロックタグを使用します。name
モディファイアに参照する配列の名前 (この場合、tag_htmls) を設定し、その中でMTVar
ファンクションタグを使用します。MTVar
ファンクションタグには name モディファイアで __value__ という値を設定します。この __value__ 変数は、配列変数の値を順番に出力します。
あとは、ウィジェットとして使用できるように、HTML を整えます。対象とするブログ記事の件数や出力するタグの件数は、モディファイアの値を変更することで柔軟に変更することができます。ぜひサンプルをカスタマイズしてオリジナルのウィジェットを作成してみてください。