読者です 読者をやめる 読者になる 読者になる

いっしきまさひこBLOG

Web制作関連、プログラミング関連、旅行記録などなど。

MTで人気記事ランキングを作る

Movable Type関連

Movable Typeでインデックス・ページに人気記事ランキングを作成する方法を紹介します。(万が一この方法が既出の場合であっても、気にせずに、より多くの人に知ってもらうために情報提供します。

人気記事ランキングとは、次の図のように、もっとも読まれた記事の順位をリスト表示する機能です。

weekrank.gif

この図は、本ブログの週間ランキングを表示したところです。

このような人気記事ランキングを表示するには、Jeff Borlik氏が提供する「MT-MostVisitedプラグイン」を導入する必要があります。ただし、このプラグインは人気記事の解析にApacheのログ ファイルを使います。よって、WebサーバーでApacheのログ ファイルを使用できない場合は、このプラグインは利用できません。

「MT-MostVisitedプラグイン」の詳細は、次のサイトのJeff Borlik氏の説明をご覧ください。

Rambles In The Brambles「MT-MostVisited Plugin」

ここでは、本ブログで行った設定手順とカスタマイズしたプラグインを紹介します。

手順としては、3つのステップがあります。

ステップ1:アパッチのログ解析モジュールの追加

ステップ2:MT-MostVisitedプラグインの追加

ステップ3:インデックス テンプレートにMT-MostVisitedタグの追加

【ステップ1:アパッチのログ解析モジュールの追加】

前述したように、「MT-MostVisitedプラグイン」はApacheログから人気記事を解析しますので、Apacheログを解析する必要があります。これには、Akira Hangai氏が公開しているPerlモジュールを使用します。

(1). まず「Akira Hangai氏のApache::ParseLogのページ」に行って、ページの中にある[Source]と書いているリンクから「ParseLog.pm」をダウンロードしてください。

・「Akira Hangai氏のApache::ParseLogのページ

(2). ダウンロードした「ParseLog.pm」を、Movable Typeディレクトリの「extlib/Apache」の中に入れてください。すると、次のようになります。

(Movable Typeのルート)/extlib/Apache/ParseLog.pm

【ステップ2:MT-MostVisitedプラグインの追加】

(1). 次に「Jeff Borlik氏のMT-MostVisited Pluginのページ」に行って、「The plugin is available (as a ZIP archive) here.」と書かれているところから、「mt-mostvisited.zip」をダウンロードしてください。

・「Jeff Borlik氏のMT-MostVisited Pluginのページ

(2). ダウロードした「mt-mostvisited.zip」を解凍してください。解凍したファイルの中に「mt-mostvisited.pl」というMTプラグインがあります。

これをこのまま使っても良いのですが、もし私が機能追加したカスタマイズ・プラグインを使っていただけるのなら、以下からダウンロードして、同じように解凍してください。「mt-mostvisited.pl」が解凍されます。

カスタマイズした「MostVisitedプラグイン」zip版tar.gz版

※重要:著作権はJeff Borlik氏が所有します。

<カスタマイズした機能について> カスタマイズした機能は、ランキング番号(1位、2位…)を表示するタグ<$MTMostVisitedRank$>を追加しました。そのほか、私のMovable Typeの環境では、なぜか「MostVisitedプラグイン」が正常に動作しなかったので、その修正を入れています。…具体的には、アクセス解析から記事のEntryID(例:「000035」)取得してデータベースからデータを取得しようとして、エラーになっていました。EntryID先頭の0詰め(例:「0000」)が原因のようで、正しくは0詰めなし(例:「35」)を指定しないといけないようです。ただし、これはデータベースによって動作が違うのかもしれません。ちなみに、私はBerkeley DB(デフォルト)を使っています。…

(3). Movable Typeのプラグイン ディレクトリにアップロードする前に「mt-mostvisited.pl」の中身を編集する必要があります。編集するのは、「$logdir/$root/$filetype/@searchfiles」の4つの設定変数です。

「$logdir」変数には、Apacheがログを生成するディレクトリへのパスを指定します。

「$root」変数には、Movable Typeのアーカイブパス(記事のあるディレクトリへのパス)を指定します。

「$filetype」変数は、アーカイブで生成する記事ファイルの拡張子を指定します。通常は「html」のはずです。

「@searchfiles」は、Apacheのログファイル名をフルパスで指定します。

<設定例>

my $logdir = "/var/log/httpd";

my $root = "/blog/archives";

my $filetype = "html";

my @searchfiles = ("$logdir/access_log",

"$logdir/access_log.1",

"$logdir/access_log.2",

"$logdir/access_log.3",

"$logdir/access_log.4",

"$logdir/access_log.5",

"$logdir/access_log.6");

<特殊ケース>

通常は「Apacheのログファイル名」はこれでOKだと思いますが、私の環境では、「access_log.20031020」のように日付でログが生成されており、固定名が使えませんでした。そこでApacheのログディレクトリの「access_log.XXXXXXXX」のファイルをすべて取得するようにカスタマイズしました。そのログ取得をカスタマイズした「MostVisitedプラグイン」も公開しておきます。

ログ取得をカスタマイズした「MostVisitedプラグイン」zip版tar.gz版

※重要:著作権はJeff Borlik氏が所有します。

ただし、Apacheのログ ディレクトリすべてを取得するので十分にご注意ください。ちなみに私は1週間分しかログを残していないので、ちょうど1週間分の人気記事ランキングが取得できるようになっています。

なお、ログ取得をカスタマイズした「MostVisitedプラグイン」を使う場合も、「$logdir/$root/$filetype」の3つの変数は設定してください。

(4). 編集した「mt-mostvisited.pl」を、Movable Typeの「Plugins」ディレクトリにアップロードしてください。「Plugins」ディレクトリがない場合は、手動で作成してください。アップロードすると、次のようになります。

(Movable Typeのルート)/plugins/mt-mostvisited.pl

【ステップ3:インデックス テンプレートにMT-MostVisitedタグの追加】

最後に、インデックス テンプレートに、「MT-MostVisitedプラグインのタグ」を書き加えます。

ここで「Main Index(index.html)」に直接書いても良いでしょうが、「Main Index」はコメントなどの書き込みがあるたびに更新されるので、そのたびに「MT-MostVisitedプラグイン」でログ解析を行うのはあまり良いとは思えません。

そこで、新たにインデックス テンプレートを作って、それを再構築時に読み込むという処理にしました。

cronなどの定期実行ツールやMovable TypeのRebuildプラグラインなどを使って、夜中に一度このテンプレートを再構築するとよいかもしれません(私は手動でやります)。

新しいインデックス テンプレートの内容は次の通りです。

mtrank.gif

テンプレートの名前:「Popular Ranking」

出力ファイル名:「parts/ranking.html」

インデックス・テンプレートを再構築するときにこのテンプレートを自動的に再構築する :「オフ」

※これをONにすると、「Main Index」を再構築するたびに、このテンプレートまで再構築される。

テンプレートの中身:

<div class="sidetitle">

人気記事ランキング Top 10

</div>

<div class="side">

<i>(Updated: <$MTDate format="%m/%d %X"$>)</i><br />

<MTMostVisited count="10">

<$MTMostVisitedRank$>. <MTEntryDate format="%m/%d %X"> <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a> (<$MTMostVisitedCount$> hits)<br />

</MTMostVisited>

</div>

なお、私がカスタマイズした「MT-MostVisitedプラグイン」を使用していない場合、<$MTMostVisitedRank$>タグは使用できません。

そして「Main Index」の中の表示したい位置に次のコードを挿入します。

<$MTInclude file="parts/ranking.html"$>

!!!

以上で完了です。再構築してみてください!

(Perlに関しては詳しくないので間違いがあるかも知れません。何かあったら教えてください。)

(なお、この記事を参考にしたことによる、いかなる損害に対しても保障しませんので、ご了承ください。)

【注意事項】:私の環境では「Main Index」に直接、「MT-MostVisitedプラグインのタグ」を書くと、Movable Typeの画面で直接ビルドするときは問題なく動作しますが、エントリーの登録/編集時にサーバー側で「Premature end of script headers」というエラーになります。これは、ログ ファイルへのアクセス権限の設定に問題があるのかなぁと思いますが、よく分かりません。エントリー登録や編集ではMostVistedタグをビルドしないので、とくに支障がありません。とりあえずそのままにしています。(このエラーが発生する場合はサーバーのCGI実行時間の制限に引っかかっている可能性が高いです。)