栃木県のJavaエンジニア、WEBプログラマーのためのサイト

2014.12.14MT カスタムフィールドと日付の複合ソート

特にMTが得意なわけではないのですが、
わたくし、何年かごとに集中的にMT案件を引き受けます。
 
その度ナニかとドハマる事も多く、今回も単純な要望の割に
なかなか面倒な実装をする事になったのでメモっておきます。
 
要望
カスタムフィールドで設定したA〜C順に表示(昇順)、
同レベルのときは新しい記事順(降順)
 
ぱっと見、たいした話じゃないんですよ。
ぶっちゃけ 自作のCMSなら10分で実装できる話です。
 
こんなの天下のMT様の最新版ですもの、
mt:Entriesタグの設定でちょいちょいでしょう。

 

 

…なめてました。

 

 

「複合ソート?なにそれ?
 昇順/降順の組み合わせ?あんなの飾りです。
 偉い人にはそれがわ…(略)」(MT談)
 

インターネッツ様のお力をお借りようと思い
ググレカスりましたが、皆口をそろえて I can’t do it!
 

いくつかの神サイトでも、複合ソートは hashでやりましょう、ときたもんだ。
hashでソートっつったってあーた、hashじゃEntryがオブジェクトで
保持されるわけじゃないでしょうよ…。
出力フィールド全部配列で持てって事かよう…。
 

…やったりましたよ、ええ。
 

 

1.公開日時を999999999999から引き、その数字をカスタムフィールドの値と連結します。
2.公開日時が同じ場合もあるのでEntryIDも同様の手順で連結します。
  その文字列をhashのキーとする事で、昇順ソート1回で、昇順+降順を実現します。
3.hashにレコードNoを保持しておきます。
4.出力したいフィールドを別の配列にレコードNoをキーにそれぞれ保持しておきます。

 

あ〜めんどい。


<mt:SetVar name=”count” value=”0″>
<mt:Entries>
<mt:SetVar name=”count” value=”1″ op=”+”>

 

(日付を降順にするための基数)
<mt:SetVar name=”entrydateback” value=”999999999999″>

 

(日付を14桁の数字にする)
<mt:SetVarBlock name=”entrydate”><$mt:EntryDate format=”%y%m%d%H%M%S”$></mt:SetVarBlock><mt:SetVar name=”entrydateback” op=”-” value=”$entrydate”>

 

(優先表示用のカスタムフィールド)
<mt:SetVarBlock name=”hashkey”><$mt:OrderLevel$></mt:SetVarBlock>

 

(IDで降順にするための基数)
<mt:SetVar name=”entryidback” value=”9999″>
<mt:SetVarBlock name=”entryid”><$mt:EntryId$></mt:SetVarBlock>

 

(IDで減算)
<mt:SetVar name=”entryidback” op=”-” value=”$entryid”>

 

(カスタムフィールドと減算した日付を連結)
<mt:SetVar name=”hashkey” append=”1″ value=”$entrydateback”>

 

(減算したIDを連結)
<mt:SetVar name=”hashkey” append=”1″ value=”$entryidback”>

 

(ソート用hashにレコード順を保持)
<mt:SetVarBlock name=”listentry” key=”$hashkey”><mt:GetVar name=”count”></mt:SetVarBlock>

 

(以下、延々と出力したいフィールドのデータを別配列に保持)
<mt:SetVarBlock name=”listentryid[$count]”><$mt:EntryId$></mt:SetVarBlock>
<mt:SetVarBlock name=”listentrytitle[$count]”><$mt:EntryTitle$></mt:SetVarBlock>

 

 

</mt:Entries>

 

(hashをkeyでソートしてループ)
<mt:loop sort_by=”key” name=”listentry”>

 

(レコード順の取り出し)
<mt:SetVarBlock name=”index”><mt:GetVar name=”__value__”></mt:SetVarBlock>

 

(結果出力)
<mt:getVar name=”listentryid[$index]”/>

 

<mt:getVar name=”listentrytitle[$index]”/>

 

 

</mt:loop>

 


 

めでたし、めでたし。

 

誰か楽な方法あったら教えてください。