MTで人気記事ランキング

知人が

Movable Typeのサイドバーに人気記事のランキングを表示したい」

というので、人柱(笑)として先行導入してみました。

結論からいうとこのプラグイン、サーバのrootかソレに近い所を握ってないと、使える環境にするのがちょっと難しいかもしれません。Apacheのログを独自に解析するプログラム→httpデーモンがApache&生ログを見られる環境であることを必然的に要求してくるんで。

最近のホスティングサービスだと最初から生ログを見られるようにしてくれてるのも結構ありますが、それ以外の一般ユーザ環境ではちょっと厳しいかもしれず。

導入自体は#BLOG: MTで人気記事ランキングを作るをハゲシク参考にさせてもらいました。つーかそのまんまです(^_^;) 順位表示改造版のプラグインもこちらから頂いてきてます。大感謝m(__)m

むしろ、問題はそれ以前、「如何にしてCGIから読めるログを作るか」というレベルだったり(^^;;

とはいえ、このサーバでは以前からログ解析用に

grep '~yas_' /var/log/httpd/access_log > /root/yas_log.txt
perl /root/urlfilter.pl </root/yas_log.txt > /home/yas_/log.txt
chown yas_:yas_ /home/yas_/log.txt

↑こんな仕掛けが動いてます(とある意図に基づき、敢えて中間ファイルを作成しパイプで繋いでません。あくまでも「わざと」ですんで、ココだけ見て素直に「…アホ?!」とツっ込むのはなるべく勘弁してくださいっす。grepでand検索出来ないのがイケナイ(^^;;)んで、ユーザ権限のログが既にある→これを使えばそれほど難しくもありません。逆に、コレができない環境だと、プラグインを動かすのがかなり難しくなると思います。

#!/usr/bin/perl
use Jcode;

while(<>){
$_ =~ s/(%|\\x)([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($2))/eg;
Jcode::convert(\$_,euc);
print $_;
}

↑urlfilter.plの中身。アクセス解析用に、apacheログ中のクエリー文字列をJcode.pmでデコードする仕掛けです。いわゆるUTF-8対策→アクセス解析をしないorクエリー文字列を気にしない場合はまったく不要。

my $logdir = "/home/yas_";
my $root = "/~yas_";
my $filetype = "html";
my @searchfiles = ("$logdir/log.txt",
"$logdir/log.txt.1",
"$logdir/log.txt.2",
"$logdir/log.txt.3",
"$logdir/log.txt.4",
"$logdir/log.txt.5",
"$logdir/log.txt.6");

↑mt-mostvisited.plの改造箇所。ローテートログを全部拾うことも無かろうと.6でやめてます。実際には15週分あるんですが(^_^;)

出力ファイルはお手本と同じくranking.htmlとしました。

<div class="sidetitle">
人気の記事
</div>

<div class="side">
<MTMostVisited count="5">
<$MTMostVisitedRank$>. <a href="<$MTEntryPermalink$>" title="<MTEntryDate format="%Y/%m/%d">"><$MTEntryTitle$></a> (<$MTMostVisitedCount$>)<br />
</MTMostVisited>
> <$MTDate format="%y/%m/%d %X"$>
</div>

で、Main Indexに

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

と書いとけば一丁上がり(^_^) SSIが使える環境なら

<!--#include file="ranking.html" -->

としとけば、再構築時の負荷がちょっと減るかも。

MTIncludeを使った場合は、Main Indexを最後に再構築しないとIncludeされるファイルが古いのになるので注意(←順序を逆にして見事にハマったヒト:^^;)

ということで、ココではSSIを採用。上記ログ処理(1日3回)の時、一緒にmt-rebuild.plでranking.htmlも再構築するようにしときました。