おぉぉ!これはフォローしとかねばならんですばい。
先日「MT4分からんことだらけ」という記事で新着順のタグクラウドについて言及しましたが、何でもプラグインを使わずに新着順タグクラウドを作る方法があるらしい?
- ハッシュ変数を使って最近のタグ一覧表示 (Movable Type備忘録)
- 最新10件の記事で使われているタグのうち5つのタグをタグクラウドで表示 (MovableType.jp)
先日も紹介させてもらいました「Movable Type備忘録」と、Movable Type公式ブログからの記事。どちらも「ハッシュ変数を使って」とあるけど、全く方法が違うのが面白いですね。はてどちらがいいものか?プログラムを解読せねばならんなぁ…と、悩んでおりました。
あらかじめ申しておきます、当方プログラミングについてはズブの素人です。全く経験なしですよ。まずハッシュ変数とは何ぞや?というところから、サパーリ分からん…両方の解説文を熟読してみても、何となく分かったような分からないような?…うををを、頭が痛いぞ。。
とりあえずテスト用のテンプレートを作って動かしながら弄ってみたら、何とかなるか?なったか?ということで、上記2記事のタグクラウドを自分用にカスタマイズしたものを貼っておきます。詳しい仕様はこちら↓
- 全ての記事で使われているタグの中から、30件を新着記事順に表示。
- スタイルシートはMovable Typeデフォルトのテーマ(minimalist-なんちゃら)に準処。
- サイドバーに表示するウィジェットとして作成。これもMovable Typeデフォルトに準処。
まずは「Movable Type備忘録」の記事を参考にした物から。
<div class="widget-tag-cloud widget"> <h3 class="widget-header">タグクラウド</h3> <div class="widget-content"> <MTTags> <MTSetVarBlock name="tags"><$MTTagName$></MTSetVarBlock> <MTSetVarBlock name="sorthash" key="$tags"><$MTTagLastUpdated format="%Y%m%d%H%M%S"$></MTSetVarBlock> <MTSetVarBlock name="tag_count" key="$tags"><$MTTagCount$></MTSetVarBlock> <MTSetVarBlock name="tag_rank" key="$tags"><$MTTagRank max="10"$></MTSetVarBlock> <MTSetVarBlock name="tag_date" key="$tags"><$MTTagLastUpdated format="%Y-%m-%d"$></MTSetVarBlock> <MTSetVarBlock name="tag_link" key="$tags"><$MTTagSearchLink$></MTSetVarBlock> </MTTags> <ul class="widget-list"> <MTLoop name="sorthash" sort_by="value numeric reverse"> <MTIf name="__counter__" le="30"> <li class="rank-<MTGetVar name="tag_rank" key="$__key__"> widget-list-item" title="<MTGetVar name="__key__">:<MTGetVar name="tag_count" key="$__key__">:<MTGetVar name="tag_date" key="$__key__">"> <a href="<MTGetVar name="tag_link" key="$__key__">"><MTGetVar name="__key__"></a></li> </MTIf> </MTLoop> </ul> </div> </div>
<MTTagLastUpdated>タグがあるので、TagSupplementalsプラグインは必要のようですね。このテンプレート・タグと元記事の丁寧な解説のおかげで、何とか構造を把握することが出来ましたですm(_ _)m
サイドバー・ウィジェットの仕様に合わせてスタイルを変更、ヘッダーを追加。それから元記事のソースにはタグ検索のリンクが機能しないという不具合がありました。<MTTags>タグの外側で<$MTTagSearchLink$>が使われているのが原因のようなので、新しいハッシュ変数tag_link{tags}を設定しています。
当ブログ・2008年2月8日現在における表示結果は以下↓
続いてMovable Type公式ブログの物から。
<div class="widget-tag-cloud widget"> <h3 class="widget-header">タグクラウド</h3> <div class="widget-content"> <MTSetVar name="i" value="30"> <MTEntries lastn="0"> <MTEntryTags> <$MTTagName setvar="tagname"$> <MTUnless name="seen" key="$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>
最新10記事ではなく全記事を対象にするためには、5行目MTEntriesのモディファイアlastnを"0"にするといいみたいです。本当は正しくない記述らしいけどね…。
上記ソースの表示結果↓
「備忘録」の物と公式ブログの物で表示順序が微妙に異なるのは、前者は<MTTagLastUpdated>で新しく追加されたタグが上位に来るようになっているのに対し、後者は記事の日付のみでソートしているからだと思います。厳密な「新着順」という意味では前者の方が正しいんだけど、個人的にはどっちでもいいや。
ところで公式ブログのソースで、どーうも私の頭では理解出来ない部分があるんですよ。タグのリストを出力するところで、<MTLoop>が使われているのはなぜか?変数tag_htmlsにpushで追記しているから、tag_htmlsには表示するタグリストが全て格納されているのではないか?それともtag_htmlsはハッシュ変数なのか?ということです。そこで試しに18〜20行目
<MTLoop name="tag_htmls"> <MTVar name="__value__"> </MTLoop>
を
<MTVar name="tag_htmls">
に置き換えてみたら
ありゃ?表示されるタグの数が増えてるぞ!?…こればっかりは分からんです。プログラム素人には、全くもって理解不能…MTのテンプレートって、奥が深いなぁ。