本文へジャンプ

PowerCMS X で配列をシャッフルしてランダムで出力する(1)
~「shuffle」属性~

ウチでも案件に導入しているCMS「PowerCMS X」が先日アップデートされ、待望のランダム(シャッフル)機能が実装されました。

以前のMovableTypeやPowerCMSでも、プラグインを使用すれば可能でしたが、今回は標準機能として実装されたので、色々なことができそうです。

何回かに渡って、ランダム関連の機能をサンプルを使って紹介していきたいと思います。

追加されたランダム関連のタグ

  • 「mt:break」:ループの強制終了。
  • 「mt:arrayshuffle」:配列をシャッフル。
  • 「mt:arrayrand」:ランダムな n件を抽出。
  • 「mt:arrayslice」:配列の一部を切り取る。

以上のファンクションタグ以外にも、
<mt:loop>や<mt:Entries>などのブロックタグにも「shuffle」属性が実装されました。

まずは、簡単にランダムを実装できる「shuffle」属性から紹介します。

サンプル1:タグ属性「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>

サンプル2:複数のカテゴリで絞り込んでシャッフルしたい。

「サンプル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>

ちなみに、属性の書き方によって出力結果がチョット変わります。

mt:Loop name="xxx" limit="5"

keyの順番で5件出力されます。(sort_by="key"が省略されています。)

mt:Loop name="xxx" limit="5" sort_by="key"

こちらも、keyの順番で5件出力されます。

mt:Loop name="xxx" shuffle limit="5"

配列全体の中から、ランダムで5件出力されます。

mt:Loop name="xxx" shuffle limit="5" sort_by="key"

keyの順番で5件抽出して、順番はランダムで出力されます。

サンプル3:全体をシャッフルしたい

サンプル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>


次回は、他のファンクションタグを使用してみたいと思います。

Recent Entries
MD EVENT REPORT
What's Hot?
こんな僕たちの仲間に入りませんか?
Movable Type AWS 移管&アップグレード サービス
乃木坂・六本木 撮影配信スタジオ
すべてのコンテンツ/プラットフォームを、ひとつのコンテンツ管理システムで。