【MovableType】uniqueモディファイアっぽい処理

電脳備忘録

uniqueモディファイアっぽい処理を自前で対応したときのメモ。

MovableTypeのテンプレートタグリファレンスの説明では、「uniqueモディファイアを付与すると同じテンプレート内で使用した MTEntries ブロックで出力したブログ記事を除いて出力します。」とのことだったのですが、 複数指定してしまうとダメなようで、再構築後の結果が意図した通りではなかったのでこのモディファイアを利用せずになんとか対応しました。
ピックアップ記事とそれ以外の記事を分けて表示させたかったので、だったらuniqueモディファイア使えばいいんですけど動かないことにはねぇ・・・。

ピックアップ記事は3件以上は表示しないのでまず、それらのEntryIDを取得して変数picupEntryID[1]、picupEntryID[2]、picupEntryID[3]に格納。

<mt:Ignore><!-- カスタムフィールドピックアップ記事にチェックのある記事を3件表示 --></mt:Ignore>
<mt:Entries field:pickup_entry="1" limit="3" sort_by="authored_on" sort_order="descend">
<mt:SetVar name="cnt" value="1" op="+">
<mt:SetVarBlock name="picupEntryID[$cnt]"><mt:EntryID></mt:SetVarBlock>
<!-- 中略 -->
</mt:Entries>

MovableTypeで条件分岐するとき"OR"はlikeで処理するのですが、変数を使う場合は「|」で区切った値を別の変数に入れることで処理出来るようです。

likeモディファイアにかかわらず、モディファイアに変数を使う場合、変数名とそれ以外のものを混在して書くような方法はできないはずです。(中略)
ブログIDを「|」で区切った値を別の変数に代入し、それをlikeモディファイアに指定すれば良いです。

likeモディファイア内の変数と正規表現

picupEntryID[1]、picupEntryID[2]、picupEntryID[3]の各変数にはそれぞれピックアップ記事のEntryIDが格納されています。それらを「|」で区切って変数「pickupEntries」へ格納し、EntryIDが「pickupEntries」の値の何れかとマッチしたたら、それはピックアップ記事としてすでに表示している記事なので何もしない。マッチしなければピックアップ記事ではないので表示する・・・といった具合に処理しました。

<mt:Entries>
<mt:SetVarBlock name="pickupEntries"><mt:GetVar name="picupEntryID[1]">|<mt:GetVar name="picupEntryID[2]">|<mt:GetVar name="picupEntryID[3]"></mt:SetVarBlock>
<mt:If tag="EntryID" like="$pickupEntries">
<mt:Ignore><!-- EntryIDがピックアップ記事のものと一致したら何もしない --></mt:Ignore>
<mt:Else>
<mt:Ignore><!-- EntryIDがピックアップ記事のものと一致しなかったら処理を実施する --></mt:Ignore>
</mt:If>
</mt:Entries>

もっとスマートな処理があるような気がしますが、私のスキルではここら辺が限界ですね・・・。でもまぁなんとか対応できてよかったです。

広告

ブログの維持費に充てるでございます・・・。