ウチでも案件に導入しているCMS「PowerCMS X」が先日アップデート(version 2.2)され、待望のランダム(シャッフル)機能が実装されました。
以前のMovableTypeやPowerCMSでも、プラグインを使用すれば可能でしたが、今回は標準機能として実装されたので、色々なことができそうです。
何回かに渡って、ランダム関連の機能をサンプルを使って紹介していきたいと思います。
以上のファンクションタグ以外にも、
<mt:loop>や<mt:Entries>などのブロックタグにも「shuffle」属性が実装されました。
まずは、簡単にランダムを実装できる「shuffle」属性から紹介します。
タグ属性「shuffle」を使用すれば、
<mt:Entries>などで、件数・カテゴリ(SetContext)などで絞りこんだまま、出力結果を簡単に順番をランダムにすることができます。
以下のソースは、
カテゴリ「ピックアップ」の記事を、公開日順(降順)で上位5件をシャッフルして表示する例です。
※「sort_order」を省略した場合は、昇順(ascend)になります。
<mt:SetContext context="category" label="ピックアップ" container="entry"> <mt:Entries limit="5" sort_by="published_on" sort_order="descend" shuffle cols="id,title"> <$mt:EntryID$> </mt:Entries> </mt:SetContext>
「サンプル1」では「カテゴリ」で絞り込みました。
この「カテゴリ」を複数の値で絞り込みたい場合、<mt:SetContext>だけではできません。
その場合は、単一の条件で配列化して、複数の配列を混ぜれば同様のことが可能になります
次のソースは、
カテゴリ別の出力を複数回行い、できた配列を<mt:Loop>でシャッフル出力しています。
<mt:SetContext context="category" label="ピックアップ" container="entry"> <mt:Entries limit="5" sort_by="published_on" sort_order="descend" shuffle cols="id,title"> <mt:SetVarBlock name="SET_ent_array" function="push"><$mt:EntryID$></mt:SetVarBlock> </mt:Entries> </mt:SetContext> <mt:SetContext context="category" label="このバイクに注目" container="entry"> <mt:Entries limit="5" sort_by="published_on" sort_order="descend" shuffle cols="id,title"> <mt:SetVarBlock name="SET_ent_array" function="push"><$mt:EntryID$></mt:SetVarBlock> </mt:Entries> </mt:SetContext>
<mt:Loop name="SET_ent_array" shuffle limit="5"> [<$mt:Var name="__value__"$>] </mt:Loop>
ちなみに、属性の書き方によって出力結果がチョット変わります。
keyの順番で5件出力されます。(sort_by="key"が省略されています。)
こちらも、keyの順番で5件出力されます。
配列全体の中から、ランダムで5件出力されます。
keyの順番で5件抽出して、順番はランダムで出力されます。
サンプル1・2で、<mt:Entries>に「limit」と「shuffle」属性を使っていましたが、<mt:Loop>と同様、ソートした状態で指定した件数を抽出してランダム出力となります。
なので、全記事を対象にしたい場合は以下のようなソースになります。
「limit="0"」で全件数を配列に格納した後、最後に<mt:Loop>でシャッフルしています。
「sort_by="key"」はつけないように。
<mt:SetContext context="category" label="ピックアップ" container="entry"> <mt:Entries limit="0" sort_by="published_on" sort_order="descend" cols="id,title"> <mt:SetVarBlock name="SET_ent_array" function="push"><$mt:EntryID$></mt:SetVarBlock> </mt:Entries> </mt:SetContext> <mt:SetContext context="category" label="このバイクに注目" container="entry"> <mt:Entries limit="0" sort_by="published_on" sort_order="descend" cols="id,title"> <mt:SetVarBlock name="SET_ent_array" function="push"><$mt:EntryID$></mt:SetVarBlock> </mt:Entries> </mt:SetContext>
<mt:Loop name="SET_ent_array" shuffle limit="5"> [<$mt:Var name="__value__"$>] </mt:Loop>
次回は、他のファンクションタグを使用してみたいと思います。