MT(Movable Type)の人気記事ランキングの表示



人気記事のランキングを表示するためのMT用プラグインがT-MostVisited Pluginとして公開されているのだが、記事ファイル名に記事IDを含んでいる必要があるらしく、私のサイトでは利用できなかった。そこで、Open MagicVox.netさんのサイト記事IDを含まない記事ファイル名でもランキング表示できるスクリプトを公開されていたので、利用させていただきました。
#ぴろりさん、素敵なスクリプトをありがとうございます。

結果は、
My Video Cafe
の右カラムに表示されている通りなのですが、私のサイトでは、カテゴリ単位でランキングを分けたいという要望がありましたので、表示のカスタマイズ以外にも少々改造しました。

スクリプト(hottopic200.php.tmpl)のGetEntryList()で既存の記事エントリのリストを作成しており、その

<MTEntries lastn="999999">

という箇所を、

<MTEntries category="foo OR hoge OR bar" lastn="999999">

<MTEntrieswithsubcategories category="hogehoge" lastn="999999">

に変更することで、fooとhogeとbarというカテゴリに属するエントリのリストや、hogehogeというカテゴリのサブカテゴリ全部のリストを作成します。(サブカテゴリを利用する場合は終了タグの変更も必要です)

次に、MergeCount2EntryList()で上記で作成したエントリリスト内をアクセスログから取得したエントリのURLで検索しているのですが、対象外のカテゴリのエントリURLならば、エントリリストのArrayから見つけられない場合が発生するため、新たにフラグを設定し、エントリが見つからなかった場合は、

$flag = false;
foreach ($entry_list as $index => $value) {
  if (is_string (stristr ($value['EntryPermalink'], $url))) {
  // 中略
  $flag = true;
  }
}
if (!$flag) {
  $nTopEntry++;
  if ($cur_score != $score) {
    $ranking--;
  }
}

$nTopEntryと$rankingを元の値に戻し、次のURLに処理を移します。(やっつけすぎ?)
厳密に言えば、ランキングの同値順位の処理が正しくないのだが、重要性が低いと判断し、私は良しとしました。
具体的には、1位、2位、2位の次は、4位なのですが、デフォルトのスクリプトでは3位になります。
同様に、新たにフラグを設定し、外側のforeach文のreturnの直前に、
if ($same) {
$ranking++;
}
を入れてあげればいいのでしょうが、エレガントでないので、導入は見送り。

それよりはむしろ、そんな細かいことを指摘するユーザはいないと信じたい。

(追記)
上記のコードだと、3つ以上の同順位があると、正しく動作しないので、やはり同順位数をカウントして、順位を繰り下げるようにしないとダメですね。

Leave a Reply