アルファサード株式会社 代表取締役 野田 純生のブログ


MTのテンプレートで 0 から nまでの乱数を取得する(Pure MTMLバージョン)


公開日 : 2014-05-16 15:39:14


昨日サポートに問い合わせがあった時に「面白そうなテーマだな」と思って早速手元で検証して記事をアップしたのですが。

夜中にふと思い立って(というか、社内で指摘はされたたんですけどうまく動かなかった=夜中に気になってコード読んでたらやっぱり行けそう...と)。

後は、乱数を得るところ。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件程度からランダム表示となってしまいます。

カテゴリ


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ