本文へ
Crossbreedクロスブリード

ホーム / ネット文化 / MTで人気記事ランキングを。(2003年11月22日)

Movable Type

MTで人気記事ランキングを。(2003年11月22日)

ずっと設置したいと思っていたmovabletypeのplugin、MTMostVisitedの設置にやっと成功した。このプラグイン、簡単に言えば「記事別アクセスランキング」。#BLOG一色政彦さんと、Living by the Animal Faith@KHさんのネタを見て激しく設置の欲望にかられた。トップページの左側の中ほどにあるやつがそれ。

現在のランキングを表示すると
ranking.jpg
↑こうなる

MT使ってて、これやりたくてもできなかったヒトは結構いるんじゃないかと思うので、僕の苦難の道を記そうと思う。参考になれば幸いだなあ。

スポンサードリンク

実はこのplugin、#BLOGさんとこで見つけて早速やってみたのだが、あっさり撤退。何度やっても上手く行かなかった。イライラ上昇。
で、調べるうちに分かったことがあった。

apacheのアクセスログを使うこのプラグイン、ここのサーバではアクセスログが上手く取れないことが分かった。
それなら作ってしまえ!というわけで、ログを取るCGIを作成して成功した。ちょっと感動。perlなんてさっぱりわからないけど、サンプルを引っ張ってきて見よう見真似で。なんとかなるもんだね。

それでは設置方法をば。

まず、このプラグインを導入する前に、Akira HangaiさんののApache::ParseLogというapacheログを解析するモジュールが必要です。何にも考えずにダウンロードします。リンク先の「source」ってとこ。

DLした「ParseLog.pm」は (MTのインストールディレクトリ)/extlib/Apache/
にアップロード(以下UL)。これで第一段階完了です。

次に本命のJeffrey Borlikさんのサイトに行き、The plugin is available (as a ZIP archive) hereと書かれたMTMostVisitedのプラグイン(zip)をDLする。解凍したら、mt-mostvisited.plをテキストエディタで開き、
my $logdir、my $root、my $filetype、my @searchfilesを

my $logdir = "/var/log/httpd";←apacheのログファイルのパス
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のログが取れないが為に、僕は何日も悩んだのですが、apacheのログがとれ、しかも一週間分とかに区切って出力してくれる優しいホスティング会社に加入している方なら迷わずapacheのログのパスを記述しましょう。

僕の利用してるホスティングサーバは厳密に言うとログは取れたんですが、切り分けをしてくれなかったので、仕方なく他のディレクトリに移動しようと思ったが、FTPで取得できない(SSIで接続しないと取得できない)上にTELNETの使い方が全く分からないというどうしようもない状態に陥った為、

自分でログを書き出すプログラムを作ってしまえ

ということを考えた。無謀。
それと、apacheのログって画像なんかにアクセスしても生成されるから一週間程度で物凄い量になるのでもっと簡単にしたいというのもあった。

というわけで、apacheのログの形式で書き出すアクセス解析のようなperlスクリプトを作ったってわけだ。なんかムダなことをやってるようだがあまり気にしない。つうかヒトのをパクリまくって作ったんですが。

アクセスログ取得スクリプト(へなちょこ)
↑ZIPで圧縮してます。念のため。

解凍したら、テキストエディタでaclog.cgi開こう。

変更するところは3個所

$aclog = 'access_log'; # logfilename
$max = '5000'; # logsize
$myself = 'https://cross-breed.com/';

$aclogはアクセスログが格納されるファイル名。
$maxはログの最大件数。これは好みで
$myselfは自分のルートのアドレスをフルパスで。

こんだけ。FTPでUPLOADしたら、aclog.cgiのパーミッションを755に。←これはサーバによって違うかも。

次に、空のテキストをaccess_logというファイル名で保存してこれもUPLOAD。
もうひとつ。log.gifという透明なGIFファイルを同じディレクトリにUPLOAD。

次に、Individual Entry Archiveに、以下のスクリプトを追加。

こんなカンジ。パスは各自適当に。

あ、そうそう。自前アクセスログスクリプトを設置したなら、上のmt-mostvisited.pl
の
my $logdir = "/var/log/httpd";
の部分をログファイルのパスを指定してください。
ウチのサーバだったら
"/home/(ユーザ名)/public_html/logs"
↑こんなカンジでかいてますね。

後は、一色さんとこのが非常に分かりやすく解説されてますが一応書いておくことにする。

MTの管理画面で新しいIndex Templateを作成する。
Templateの名前は 「Popular Ranking」
出力ファイル名は「(任意のディレクトリ)/ranking.html」
Templateの中身は

こんなカンジで書いてます。ま、これも適当に。

そしてMain Indexの中の任意の場所に以下のコードを。

これをリビルドして完了。

うまく行きましたか?
間違いや指摘がありましたら、やさしく教えてくださいね。よろしくです。

スポンサードリンク

※このサイトはさくらインターネットのサーバを利用しています。

■gi(ギィー)福岡浄水通りの絣(かすり)と手作り雑貨のセレクトショップ
↑サイト内紹介記事
【PR】BTOパソコンの先駆者 FRONTIER

読者のコメント13件

記事が公開された当時に寄せられたものを、そのまま残しています。受付は終了しました。

  1. ayu

    すみません。調子に乗って配布したスクリプトでしたが、不具合があることが判明しました。サーバによってはログをちゃんととれないことがあるようです。
    修正してます。使ってみてください。

  2. グレンデル

    こんにちは~鋼鉄の拳~管理人のグレンデルです。
    すみませんトラックバック不調で2回も送ってしまいました。
    一回目のものは削除してください。
    お願い致します。

  3. 管理人ayu

    >グレンデルさん
    ご紹介ありがとうございました。
    現在はこのプラグイン、当サイトでは使ってません。
    というのが、記事ID=ファイル名のときにしか使えないのです。
    ウチはphp化と共に日付をファイル名にしたので、どうしてもこの機能が使えなくなりました。

  4. dzwonki polifoniczne nokia

    Cool article!!!

  5. domy

    Hmmmmm interesting !!!

  6. moriguchi

    サプライズ!!!!
    がはは。

  7. kitano

    サンプルのIndividual Entry ArchiveとPopular Rankingテンプレートの中身が同じなのは、気にしないとして、うちのサイトに設置したら擬似ログファイルが見当たらない旨のエラーがでてしまいました。$logdirと@searchfilesを直せといってくるのですが、フルパスで記述するとだめなのでしょうか。
    こんなエラーです。

    Error in MTMostVisited. A webserver log was not found. The plugin was looking for files in the "http://www.xillion.net/cgi-bin/mt/logs" directory, with filenames http://www.xillion.net/cgi-bin/mt/logs/access_log. Please double-check the location of your Apache webserver access log, and possibly change the $logdir variable, or any of the entries in the @searchfiles list.

    因みにログディルはこんな感じで、
    $logdir = "http://www.xillion.net/cgi-bin/mt/logs";
    サーチファイルはこんな感じです。
    @searchfiles = ($logdir."/access_log");

  8. 管理人ayu

    >kitanoさん
    テンプレートのところ、全く気づきませんでした。ご指摘ありがとうございます。

    サーチファイルの所が

    @searchfiles = ($logdir."/access_log");

    ではなく、

    @searchfiles = ("$logdir/access_log");

    なのではないでしょうか?

    あと、logdirはhttpからのパスでいけるかどうかはサーバによって違うかもです。

  9. kitano

    >管理人ayuさん

    早速の回答ありがとうございます。
    httpからのパスはだめなようです。
    /homeからのパスにしたらうまくいきました。
    参考になりました。
    うちのMovableTypeでも(勝手に)使わせてもらいます。

  10. 管理人ayu

    >kitanoさん
    参考になったようでこの記事書いてよかったです。
    今後ともよろしくです。

  11. junichi_y

    苦労のにじむ、このエントリーを参照し、MTMostVisitedプラグインの導入に挑みましたがあえなく撃沈。(笑)
    代替案で解決(?)しましたが、参考になりました。ありがとうございましたー。

  12. 管理人ayu

    >junichi_yさん
    phpの個別ファイル化をしたとたんこれが出来なくなったのですよ、実は。
    代替案、良さそうですね。僕もやってみることにしますよ。

  13. 山左と一郎

    無料ゲーム関連サイトのための検索エンジンです。無料ゲームも設置しています。
    http://www.twsunkom.com/p-vi/lin241.jpg