MTのテンプレートで 0 から nまでの乱数を取得する(Pure MTMLバージョン)
公開日 : 2014-05-16 15:39:14
昨日サポートに問い合わせがあった時に「面白そうなテーマだな」と思って早速手元で検証して記事をアップしたのですが。
夜中にふと思い立って(というか、社内で指摘はされたたんですけどうまく動かなかった=夜中に気になってコード読んでたらやっぱり行けそう...と)。
<MTEntries lastn="1" offset="$random_offset" unique="1">
でもいけるっぽい。明日確認する。http://t.co/K2FMZHgmSu #movabletype #mt 標準タグだけでやるならMTDate使えば(秒毎だけど)
— Junnama Noda (@junnama) 2014, 5月 15
後は、乱数を得るところ。DynamicMTMLが有効な環境なら、これだけで済むわけですが。
<MTRand min="0" max="99">
DynamicMTML のMTSearchEntries ではなくせっかく MTEntries(のuniqueモディファイア活用)で行けることがわかったので、乱数の部分もMT標準だけでなんとか行けないだろうかと...
ということで、トライしてみた。乱数を取得するには基本、MTDateタグを使えばいいのですが、所詮秒単位です。しかも1ページを再構築する間にMTDateを取得しても値は同じになりますよね。よっぽどデカいテンプレートでなければ。ということで、なんちゃって実装を考えてみた。もっと良い方法がきっとある筈。是非教えてください。
<MTSetvar name="base" value="123456789">
<MTIgnore>↑これが、まぁ、なんちゃってなところであるが...</MTIgnore>
<MTdate format="%S" setvar="second">
<MTSetvar name="base" value="$second" append="1">
<MTIgnore>
・12345678902 みたいになるので、
末尾の一文字を先頭に移動しながらループを回す。
・0から99までの乱数は、元の数字を100で割った余りで得られる
・数字の計算は opモディファイア、
末尾の文字の切り出しは regex_replace モディファイア
先頭に数字を移動するのは MTSetVarタグの prepend モディファイアで
</MTIgnore>
<pre>
<MTfor from="1" to="5">
<MTVar name="base" setvar="calc">
<MTVar name="base" setvar="lastchar">
<mtvar name="calc" op="mod" value="100"> ← 0〜99の乱数
<MTVar name="lastchar" regex_replace="/^.*([0-9])$/","$1" setvar="lastchar">
<MTSetVar name="base" value="$lastchar" prepend="1">
<MTVar name="base" regex_replace="/[0-9]{1}$/","" setvar="base">
</MTfor>
<MTIgnore>
例 : 56, 45, 14, 91, 89
</MTIgnore>
Movable Type標準のタグのみでランダムに n件の記事を取得する
と、いうことでテンプレートの例
<MTSetvar name="base" value="123456789">
<MTdate format="%S" setvar="second">
<MTSetvar name="base" value="$second" append="1">
<$MTEntriesCount setvar="entries_count"$>
<MTFor from="1" to="5">
<MTVar name="base" setvar="calc">
<MTVar name="base" setvar="lastchar">
<mtvar name="calc" op="mod" value="$entries_count" setvar="random_offset">
<$MTGetVar name="entries_count" op="--" setvar="entries_count"$>
<MTIgnore>
unique モディファイアで除外されるエントリが1件ずつ増えるので
entries_count をループ毎に1ずつ減らす必要がある。
</MTIgnore>
<MTVar name="lastchar" regex_replace="/^.*([0-9])$/","$1" setvar="lastchar">
<MTSetVar name="base" value="$lastchar" prepend="1">
<MTVar name="base" regex_replace="/[0-9]{1}$/","" setvar="base">
<MTEntries limit="1" offset="$random_offset" unique="1">
<li><$MTEntryTitle$></li>
</MTEntries>
</MTFor>
自分なら確実に(なければ)プラグイン書くけど、テンプレートであれこれやってみるのも、それはそれで面白いじゃん。
また追記(5/20)
MTEntriesCountではブログ/ウェブサイトの投稿設定の数に引っ張られてしまうということで、MTBlogEntryCount を使え、とのことでした。
例えば対象となるウェブサイトやブログの記事が全部で100件あるとき、本来は MTBlogEntryCount タグで「100」を取得するところですが、MTEntriesCount タグでは ウェブサイトまたはブログの [投稿設定] で [公開の既定値] の [表示される記事数] により設定された条件に合致する件数、「10」などを取得してしまい、結果として最初の10件程度からランダム表示となってしまいます。