記事タイトルを番号順に並べる for Movable Type 4.2
Movable Type 4.2 で、ランダムに作成したブログ記事やウェブページのタイトルの先頭に「1、2、3...」という番号を割り当てている場合、番号順に記事タイトルを並べるカスタマイズです。
次のように、ランダムに作成したウェブページがあると仮定します。
これらのウェブページを、次のようにタイトルに付与した番号順に並べて表示することを想定します。
- ウェブページA
- ウェブページB
- ウェブページC
- ウェブページD
- ウェブページE
- ウェブページF
- ウェブページG
- ウェブページH
- ウェブページI
- ウェブページJ
- ウェブページK
- ウェブページL
並び替える方法として、次のようなサブテンプレートが思いつくでしょう。
<mt:pages sort_by="title" sort_order="ascend">
<mt:pagesHeader>
<ul>
</mt:pagesHeader>
<li><a href="<mt:pagePermalink />" title="<mt:pageTitle escape="html" />"><mt:pageTitle escape="html" /></a></li>
<mt:pagesFooter>
</ul>
</mt:pagesFooter>
</mt:pages>
MTPages タグに sort_order モディファイアに title を設定することで title でソートします。また sort_order モディファイアに ascend を設定することで昇順表示します。
しかしながら、出力結果から、大きな番号のものが正常にソートされないことが分かります。
そこで次のサブテンプレートを利用します。
<mt:pages>
<mt:if tag="pageTitle" like="^\d\..*">
<mt:setVarBlock name="key"><mt:pageTitle escape="html" regex_replace="/^(\d)\..*/","0$1" /></mt:setVarBlock>
<mt:elseIf tag="pageTitle" like="^\d+\..*">
<mt:setVarBlock name="key"><mt:pageTitle escape="html" /></mt:setVarBlock>
</mt:if>
<mt:setVarBlock name="val"><li><a href="<mt:pagePermalink />" title="<mt:pageTitle escape="html" />"><mt:pageTitle escape="html" /></a></li></mt:setVarBlock>
<mt:setVar name="title_data{$key}" value="$val" />
</mt:pages>
<mt:loop name="title_data" sort_by="key numeric">
<mt:if name="__first__">
<ul>
</mt:if>
<mt:getVar name="__value__" />
<mt:if name="__last__">
</ul>
</mt:if>
</mt:loop>
複雑に見えますが、やりたいことは「記事タイトルの項番が1桁のときに、項番の頭に『0』を付与して、その値でソート」です。つまり、「1、2、3...」という項番を「01、02、03...」に変換し、桁数を統一します。そして、変換した記事タイトルでソートします。
2行目の MTIf タグの like モディファイアで、記事タイトルの先頭に1桁の番号とピリオドがついているものだけをフィルタリングし、ブロック内で変数 key にウェブページタイトルを設定します。そのとき regex_replace モディファイアで、1桁の項番の前に「0」を付与しています。
4行目では記事タイトルの先頭に2桁の番号とピリオドがついているものだけをフィルタリングし、ブロック内で変数 key にウェブページタイトルを設定します。ここでは何も加工しません。
7行目の setVarBlock タグでは、実際の出力に使うウェブページタイトル(マークアップつき)を、変数 val に取得します。
そして、8行目の setVar タグで、ハッシュ変数 title_data に、キーが変数 key、値に変数 val を設定します。これでウェブページタイトルをソートする準備ができました。
後は、11行目の MTLoop タグで、変数 title_data を読み込ませ、sort_by モディファイアで、ハッシュのキーを数値によりソートします。念のため、1~8行目の桁合わせの処理をせずに MTLoop タグの数値によるソートを行ってみましたが、期待通りの結果にはなりませんでした。
これで次のような出力を得ることができます。
なお、インデックステンプレートを利用してウェブページ全体を出力するには、次のように lastn モディファイアに件数を指定する必要があるかもしれません。
<mt:blogPageCount setvar="page_count">
<mt:pages lastn="$page_count">
...後略...
ブログ記事で利用する場合は、サブテンプレートの「mt:pages」や「mt:pageXX」を、「mt:entries」「mt:entryxx」に置き換えてください。
本エントリーでは、テンプレートタグだけで並べ替えを実現する方法を紹介しましたが、番号順に並べる方法は色々あります。例えば、記事タイトルを最初から「01、02、03...」と設定しておき、出力時に先頭の 0 を削除する方法でも構いません。あるいは、概要フィールドにソート用の数値を設定しておき、MTPages タグで sort_by="excerpt" を設定するのも良いでしょう。カスタムフィールドを利用する手もあります。
2008.12.21
ハッシュ変数名に「title」という名称を用いるとエラーになるため、ハッシュ変数名を変更しました。
- Movable TypeでMTPagesタグとMTEntriesタグを入れ子にして動作させる方法
- ウェブページの一覧をウェブページで表示する
- ウェブページのデザインを切り替える
いつも有用な参考情報をありがとうございます。DevConのLTのときにスライドの最後に謝辞のページをいれ、そのトップに小粋空間さんをいれておいたものの、時間切れでそのページにたどりつかないまま終了、お話するチャンスを逸してしまった者です、といってもさっぱりわからないと思いますが(^^;)
MTでウェブページを複数作って管理するようになるとどうしても必須になる知識をありがとうございます。直接関係ないのですが、タイムリーに近い部分で困ってたので、ちょうどよくコメントするチャンスかとおもってコメントさせていただきました。。
このようにウェブページが増えてくると、管理画面のほうの使い勝手も気になってきます。で、ブログのカテゴリのほうは階層化されたときにインデントされるのにフォルダを階層化したときにインデントされない、ウェブページ編集画面も上記の並べ替えのまま表示させたいのに更新日時で自動的にソートされてしまう。というのがやっかいだなと思って、つい先日SA社に要望を出しました。自分で修正できればいいんですがそこまでのスキルがないので。。
PerfectGuideもよく参考にさせていただいております。とりとめなくなってしまいましたが、デベコンのときにお礼を言いそびれたので、ここで?お礼まで。
>yasuoogleさん
こんばんは。
コメントありがとうございました。
拙著お買い上げくださりありがとうございます!
DevConではお話しできず残念です。
また機会がありましたら是非よろしくお願い致します。
ではでは!