特に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>
めでたし、めでたし。
誰か楽な方法あったら教えてください。