「この記事を読んだ人はこんな記事も読んでいます」な感じに、オススメ記事を紹介する MovableType プラグインというのを以前に公開しましたが、当然 MovableType でしか動作しないという制限がありました。先のエントリでGoogle Analytics のデータを利用してアクセス ランキングを生成できるようになったので、これと同様に Google Analytics の集計データを利用して、「この記事を読んだ人はこんな記事も読んでいます」的ナビゲーションを実現してみたいと思います。
「この記事を読んだ人はこんな記事も読んでいます」ランキングを求める指標として、ここでは簡単に「どのページから現在のページに飛んできたのか?」を集計することにします。サイト内に存在する全てのページについてその集計を行うわけですが、全てのページのリストを Google サイトマップ(sitemap.xml)から取得することにします。
---
name: この記事を読んだ人はこんな記事も読んでいます
account:
Email: your.name@gmail.com
Passwd: Your.Password
process: >
sub {
my $site_url = 'http://www.magicvox.net';
my $site_path = '/home/magicvox/';
my $sitemap = read_file ($site_path. '/sitemap.xml')
or return undef;
my $get_date = sub {
sprintf ('%04d-%02d-%02d',
sub {($_[5]+1900, $_[4]+1, $_[3])}->(localtime $_[0]));
};
my @process;
while ($sitemap =~ s!<loc>\Q$site_url\E(/archive/\d+/\d+/)</loc>!!) {
my $entry_path = $1;
push @process, {
name => $entry_path,
request => {
'ids' => 'ga:3857126',
'dimensions' => join (',',
"ga:pagePath",
"ga:pageTitle",
),
'filters' => join (';',
"ga:previousPagePath==$entry_path",
"ga:nextPagePath!=$entry_path",
"ga:nextPagePath=~^/archive/\\d+/\\d+/",
),
'metrics' => 'ga:pageviews',
'sort' => '-ga:pageviews',
'max-results' => 5,
'start-date' => $get_date->(time - 60 * 60 * 24 * 365),
'end-date' => $get_date->(time),
},
apply => $site_path. '/include/recommend.xsl',
output => $site_path. $entry_path. 'recommend.inc.php',
} if (-d $site_path. $entry_path);
}
return @process;
}
GADGET では、リクエストすべき内容を Perl 関数で動的に生成することができますが、更に進んで、処理すべきプロセスそのものを動的に生成できるようにしてあります。どのようなリクエストを行い、その結果にどのような処理を行って、なんというファイルに書き出すのか、という部分を定義している process を Perl の関数として記述しています(7~45行目)。その関数内では、始めに、事前に作成された sitemap.xml の内容を読み込んで、記述されている個別ページの URL について、request(23~39行目)、apply(40行目)、output(41行目) をそれぞれ設定しています。
特に output(41行目) が、個々のページの URL に対応して変化するため、それぞれの個別記事のディレクトリごとにおすすめ記事のモジュール(recommend.inc.php)が生成されます。そして最終的には @include を使用してページ内に埋め込むことで、ページごとに異なるオススメ記事一覧が表示される仕組みです。