Movable Type で構築したサイトで、各記事ごとのアクセス数を集計できれば、
"今週の人気記事 トップ 10"のような機能が実現できるでしょう。
丁度、ここのホストでも
Apache のアクセスログがユーザに解放されているので、
これを利用することができそうです。
結果、特に
プラグインを追加せず、
PHP を使用することで、
サイト
デザインの容易性、他ホストでの可搬性を高めつつ、これを実現することができました。
また、記事の
ファイル名がエントリ ID 以外(日付やキーワード)で生成されている場合にも対応でき、
cron による定期実行や
ブラウザからのランキング更新も可能です。
経緯
先ずは、この人気記事ランキングを実現する方法について Web を検索したところ、"Masahiko Isshiki WEB SITE:MT で人気記事のランキングを表示する" という記事が大変参考になりました。ここでは Jeff Borlik 氏の
T-MostVisited Pluginを使用してこれを実現する方法が、インストール手順から詳しく説明されています。このプラグインは MT の再構築時にアクセスログの集計と表示を行うためのもので、比較的簡単に導入し実現することができそうです。
しかしながら、このプラグインでは記事ファイル名が記事 ID を含む必要があり、これ以外の書式、例えば日付を基に生成されている場合(/2005/1234_1234.html)などでは、このプラグインを使用することができません。これは単純に、アクセスログに残ったファイル名から記事 ID を特定できないことから、その記事のタイトルや投稿者といった情報にアクセスできないためだと思われます。
また、ランキングのリアルタイム性を確保するために、これに続く"MTで人気記事ランキングの定期自動実行"で、Perl のスクリプトを別に用意し JavaScript を併用する方法が紹介してあります。このように MT 以外のところで様々なギミックが必要となり、結果的にランキング表示周りの複雑性が増すことになっているようでした。
今回、紹介する方法は以下の点に重点が置かれています。
- 記事ファイル名が、日付やキーワードなどから生成されていても対応できること
… ここのサイトが日付による命名ルールになっているので必須
- gzip 圧縮されたアクセスログにも対応
… SAKURA Internetのサーバが(以下略
- できる限り HTML 知識だけで HTML デザインが容易に行えること
… ランキングは HTML で成形することになりますが、
この部分が PHP だの JavaScript だのソースコードと混合すると判りにくい&編集しにくいため
- 設置と運用が簡単
… 簡単に使えて、あとは手間いらずが理想的
- 軽い
… MT の再構築はかなり重い処理です。アクセスログの解析や再構築の負荷を上手に分散します。
動作要件
- 今のところ Movable Type しか考えていません
- PHP が稼動すること
… スクリプトが PHP で書かれています。
- Web サーバのアクセスログが使用できること
- または CGI などによるアクセスログが使用できること
… ログファイルは NCSA コモンログファイル形式に対応しています。
これ以外のログ形式でもスクリプトを編集すればおそらく対応できます。
- (あれば楽チン) cron などの定期実行がサポートされていること
インストール
先ずは次のファイルを
ダウンロードして適当な場所に解凍してください。
hottopic200.php.tmpl というファイルが 1 つ含まれているハズです。
[
ダウンロード]
ダウンロードしたファイルは、
「『アクセスログの集計を行うための
PHP スクリプト』のためのインデックス
テンプレート(あぁ、ややこしい)」のため、
このままでは実行できません。
このファイルを MT 管理画面から[
テンプレート]-[インデックス
テンプレート]に登録します。
この
テンプレートの構築を行って初めて、
"出力ファイル名"で指定されたファイルが実行可能な
PHP スクリプトとなります。
また
"再構築オプション"は"自動で再構築"でも構いません。
再構築時の負荷はマスターアーカイブの生成と同程度と思います。
この段階で構築はできると思いますが、設定が済んでいないので実行はできないでしょう。
次の各種設定に続きます。
Step 2-1. 環境設定 - 動作設定
スクリプトの動作設定を行います。
テンプレートの 15〜30 行付近にある以下の項目を修正してください。
- nDivDay
-
集計する期間を日単位で指定します。
スクリプトが実行された瞬間から過去 n 日間のアクセスを集計します。
- nTopEntry
-
集計した結果のうち少なくとも上位 n 件(≠位)をランキングに出力します。
同順位に複数エントリがある場合、その全てを表示します。
- szLogDir
-
サーバのアクセスログが保存されているディレクトリへのパスを指定します。
相対パス指定は実験していません。
- szOutput
-
集計結果を出力するファイル名を指定します。相対パス指定は実験していません。
Step 2-2. 環境設定 - ログファイル名を指定する
サーバによってアクセスログのファイル名が様々です。
37 行付近の
GetLogFileNames という関数内でアクセスログのファイル名を生成しているので、
お使いのサーバのアクセスログのファイル名に合わせて修正してください。
毎日日付ファイル名でログを残すものや、過去ログを gzip 圧縮するもの、直近の数日のみ残すものなど様々です。
ログファイルを一つも読めていないような場合は、
szLogDir の設定とここの設定を疑ってみてください。
Step 2-3. 環境設定 - 集計対象とするファイル名を指定する
お使いの MT の
カスタマイズによって、個別アーカイブの生成ファイル名は様々かと思います。
76 行付近の
IsTargetURL はアクセスログに残されたファイル名が
ランキング集計対象か否かを判定するための関数です。
ランキング集計したいファイル名にマッチするよう
Perl の正規表現を修正してください。
スクリプト実行時の標準出力を見て、1 件も集計されいないような場合、
ここのパターンマッチングで失敗していることが考えられます。
Step 2-4. 環境設定 - 集計結果を成形する
集計結果を成形して書き出すために
CreateEntryListItem(111 行付近) と
CreateEntryList(126 行付近) のうち、
それぞれ 2 つの
/******** コメント ********/ で囲まれた範囲を修正してください。
とりあえず動作を見たいという御仁は、このステップを飛ばされても構いません。
1 つのエントリにつき CreateEntryListItem が呼び出されて、1 つ分の
HTML を生成します。
次にこれが
nTopEntry 回だけ繰り返されて、
CreateEntryList でその結果を含めた
HTML が 生成されるようになっています。
HTML 部分は
HTML タグや MT の
テンプレートタグをそのまま使うことができます。
またランキングの集計結果を使う場合は
{$entry['キー名']} という記述で値を自由に埋め込むことができます。
例えば、次のようにして記述できます。
Step 3. ランキングを集計する
Step 2.までの設定が終わったら、
テンプレートを再構築してランキング集計スクリプトを書き出します。
そして、このランキング集計スクリプトを実行すれば、集計結果が
szOutput に出力されます。
ランキング集計はこのスクリプトが実行された瞬間に行われます。
スクリプトを実行する手段として
- シェルログインしてコマンドラインで実行する
- cron を使って定期実行する
- ブラウザから呼び出す
の何れかの方法が可能です。目的に合わせて適宜選択してください。
Step 4. 集計結果を利用する
集計結果ファイルはそのまま表示することもできますし、
PHP の include を利用してページに埋め込むこともできます。
後々のメンテナンスのことを考えると、集計スクリプトで成形する
HTML は最低限にし、
それを取り込む側で本格的に
デザインを施す方が簡単でしょう。
その他の機能 - エントリの他の情報が必要になった
CreateEntryListItem と
CreateEntryList で
HTML を成形する場合、
エントリについてさらに細かな
情報が必要になることがあります。
88 行付近の
GetEntryList では、
HTML の生成に必要なエントリの各種
情報のテーブルを作成しています。
ここに任意の名前でキー名を登録し、
テンプレートタグを駆使してエントリの
情報を取得するようにします。
この部分は PHP スクリプトとして実行される部分になりますので、
encode_php タグ・アトリビュートを指定して、文字列を安全にしてください。
寄せられたコメント (全 2 件中、最新 5 件まで表示しています)
すみません! リンク切れを修正しておきました。ご指摘ありがとうございます!
管理人様
はじめまして。
人気記事のランキングを探したどり着きました。
hottopic200.php.tmpl のダウンロードがリンク切れのようで出来ません。
よろしければ再度公開していただけると幸いです。
この外にも気になるプラグインたくさんあります。
今後のご活躍期待しております!