記事 n 件をランダムに取得するテンプレート - RandomArray プラグインバージョン

記事をn件取り出す場合のRandomArrayプラグインの具体的な使い方を紹介します。

記事 n件をランダムに表示するPowerCMSのテンプレート | PowerCMS ブログ」に触発され、こんな感じの方法はどうだろうということで書いてみます。

bit part では、指定した配列からランダムに要素を取り出して配列で返す MTRandomArray タグを提供する「RandomArray プラグイン」を公開しています。

これを使うと、例えば「MTAppjQueryタグの付いた記事をランダムに5件表示したい」というのを以下のようなテンプレートで実現できます。

<mt:DynamicMTML>
<mt:SetVar name="ids">
<mt:SetVar name="entries">

<mt:Entries tag="MTAppjQuery" unique="1" lastn="0">
<mt:EntryID setvar="id">
<mt:SetVarBlock name="ids" function="push"><mt:Var name="id"></mt:SetVarBlock>
<mt:SetVarBlock name="entries" key="$id">
<li><a href="<mt:EntryPermalink>"><mt:EntryTitle escape="html"></a></li>
</mt:SetVarBlock>
</mt:Entries>

<mt:RandomArray name="ids" limit="5" setvar="rand_ids">

<mt:Loop name="rand_ids">
<mt:If name="__first__"><ul></mt:If>
<mt:Var name="entries" key="$__value__">
<mt:If name="__last__"></ul></mt:If>
</mt:Loop>
</mt:DynamicMTML>

解説

変数を初期化します。

<mt:SetVar name="ids">
<mt:SetVar name="entries">

MTAppjQueryタグの付いた記事をすべて取り出します。 同じテンプレート内ですでに出力された記事は unique="1" で除きます(スタティックとダイナミック の混在だともう少し丁寧な処理が必要だけど)。

<mt:Entries tag="MTAppjQuery" unique="1" lastn="0">
 略
</mt:Entries>

記事IDを一旦変数に入れ、配列変数idsに追加していきます。 また同時に、そのIDをキーに、最終的に出力したい形を値にしたハッシュ変数entriesを作って行きます。

<mt:EntryID setvar="id">
<mt:SetVarBlock name="ids" function="push"><mt:Var name="id"></mt:SetVarBlock>
<mt:SetVarBlock name="entries" key="$id">
<li><a href="<mt:EntryPermalink>"><mt:EntryTitle escape="html"></a></li>
</mt:SetVarBlock>

MTRandomArrayタグで配列変数ids(name="ids")から5件(limit="5")をランダムに取り出した配列をrand_idsにセット(setvar="rand_ids")します。

<mt:RandomArray name="ids" limit="5" setvar="rand_ids">

配列変数rand_idsをループで回し、その値(記事ID)をキーに指定して先程のハッシュ変数entriesからHTMLを取り出します。

<mt:Loop name="rand_ids">
<mt:If name="__first__"><ul></mt:If>
<mt:Var name="entries" key="$__value__">
<mt:If name="__last__"></ul></mt:If>
</mt:Loop>

以上です。

ソースコードに解説を書いたものは以下の Gist でどうぞ。

Published 2014-05-17
Updated 2019-06-25

「Movable Type」カテゴリの記事一覧