前回、メモ代わりにランダム表示を紹介したのですが、
わかりにくいというご意見をいただいたので解説用に書き直してみます。


基本的には、全エントリーの中から、一定数をアクセス毎に表示するということをやっています。

サンプルはトップページの "RAMDOM 5 MUTTERS" にあります。


全体の手順としては以下の通りです。
  1. MTRandomEntriesプラグインのインストール / 設定

  2. アクセス毎に表示させるプログラムの作成 / 導入

ランダムに選択するタイミングを、『再構築』でよい、という方は1まででOKです。
PHPを利用して、『アクセス時に』ランダム選択したいという方は、2を参考にしてください。

1. MTRandomEntriesプラグインのインストール / 設定


導入の仕方については下記を参考にしてください。

Six Apart - Movable Type プラグインディレクトリ: MTRandomEntries


MTRandomEntriesは再構築時に、
指定された数だけランダムにエントリを選び出してくれるプログラムです。
使用方法は簡単で、タグとしてはMTEntriesと同じように働きます。


例)5個のエントリをランダムに表示させたい場合

テンプレート内の自分が表示させたい場所で以下のタグを組み込みます。

<MTRandomEntries lastn="5">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</MTRandomEntries>

この例では『MTEntryPermalink』と『MTEntryTitle』を使って、
個別記事へのリンクを貼っていますが、もちろん本文を表示させることも出来ます。

詳しくはマニュアルの『テンプレート・タグ > エントリーリスト/アーカイブ・ページ』
参照してください。


これは記述したテンプレートが再構築されるたびに更新されます。
閲覧者がページを戻っても変化しないので、繰り返し訪れてもらえるメリットがあります。




2. アクセス毎に表示させるプログラムの作成 / 導入

MTRandomEntriesを使ってランダムに表示させることは出来ますが、
アクセス毎にリストを変えることは出来ません。
ということでプログラムをPHPで書いて追加し、一工夫します。

基本的な流れは以下の通りです。

  1. MTRandomEntriesを使ってランダムなエントリーの簡単なDBを作成。
  2. 追加プログラムでDBからランダムにアイテムをピックアップし表示する。


2-A: MTRandomEntriesを使ってランダムなエントリーの簡単なDBを作成。

DBというと難しく聞こえますが、要するに、リストを作ればいいだけです。
DB用のインデックステンプレートを作成し、その中に以下のように記述します。

<MTRandomEntries lastn="200">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</MTRandomEntries>

1で挙げた例と同じですが、DBと言うことで表示数を200に増やしてあります。

また出力ファイル名で拡張子をdatなどに変えておくとわかりやすいかもしれません。
ここでは、ramdom_entry.datという名前にしておきます。


2-B: 追加プログラムでDBからランダムにアイテムをピックアップし表示する。

2-Aで作ったDB(ここでは要素数200)から、5アイテムを選んで表示してみます。


まず、表示用のプログラムを作成します。

dispRandomEntry.php
<?php $RamdomEntries = 0;
$fh = fopen("/www/ramdom_entry.dat","r");
flock($fh, LOCK_EX);
while(!feof($fh)){
  $buf = trim(fgets($fh));
  if($buf){
    if((rand(0,200) % 10) == 0){
      $RamdomEntries++;
      print $buf;
    }
    if($RamdomEntries >= 5){break;}
  }
}
flock($fh, LOCK_UN);
fclose($fh);
?>

正直、もっと適切な別な方法も思いつきますが、まぁいいでしょう。
とりあえず、5アイテムを表示したらループを抜けるプログラムです。
(太字の部分は各自書き換えてください)

これを、自分が表示させたいところで、requireします。
例えば…こんな感じ。


index.php
<html>
<body>
<?php
require "dispRandomEntry.php";
?>
</body>
</html>


なお、この手法でデザインを変更するときは、
テンプレート(DBを作る部分)で指定することになります。
変更して再構築してください。




追記:2008/06/17

書いてから随分時間が経っていますが、
ブックマークしてくださる方がいらっしゃったので、若干編集し直してみました。

文中に書いてあるPHPプログラムは本当にやっつけくさいですが(苦笑)、
各自キャッシュなどを用いるとより幸せになれるかと思います。

今現在のこのサイトでの運用はDBをよりDBっぽく作成した上で、
表示の方はSmarty+Cacheで運用しています。


現在のDB用テンプレート

<MTIfNonZero tag="BlogEntryCount">
<MTRandomEntries lastn="200">
<MTEntryCategories><$MTCategoryID$></MTEntryCategories>[,]<MTEntryCategories><$MTCategoryDescription$></MTEntryCategories>[,]<$MTEntryPermalink$>[,]<$MTEntryTitle$>
</MTRandomEntries>
</MTIfNonZero>