Blogn に人気記事ランキングを表示する方法です。
「BlognPlus用モジュール」とは違い、ログ閲覧機能はなく純粋にランキングだけを表示します。
記事が読まれる度にその記事IDを記録します。そのログをもとに過去3日間に読まれた記事のページビューを集計しランキングを出力します。
動作例は「nJOY BLOG」をご覧ください。
「log」ディレクトリの下に「poprank」ディレクトリを作成。パーミッションを 707 または 777 にする。
スキンファイルの好きな場所に {POPRANK] と記述する。
「index.php」の最後から2行目に以下の記述を追加。
/* ----- 読まれている記事をカウント ----- */
function poprank_count_entry($entry_id) {
// 日付
$date = date("Ymd");
$date1 = date("Ymd", poprank_get_day(-1));
$date2 = date("Ymd", poprank_get_day(-2));
$date3 = date("Ymd", poprank_get_day(-3));
$olddate = date("Ymd", poprank_get_day(-8));
// ログファイル名
$logfile = LOGDIR.'poprank/'.$date.'.log';
$logfile1 = LOGDIR.'poprank/'.$date1.'.log';
$logfile2 = LOGDIR.'poprank/'.$date2.'.log';
$logfile3 = LOGDIR.'poprank/'.$date3.'.log';
$oldfile = LOGDIR.'poprank/'.$olddate.'.log';
$popfile = LOGDIR.'poprank/popular.log';
// 古いログを削除&集計データ作成
if (file_exists($oldfile)) {
unlink($oldfile);
$pop = array_merge(file($logfile1), file($logfile2), file($logfile3));
$data = @array_count_values($pop);
@arsort($data);
$popular = array_slice($data, 0, 20);
foreach($popular as $key => $value) {
$popular_data .= rtrim($key);
$popular_data .= ",";
$popular_data .= rtrim($value);
$popular_data .= ",";
$popular_data .= "\n";
}
$fp = @fopen($popfile,"w") or die("Cannot Open File");
flock($fp, LOCK_EX);
fputs($fp, $popular_data);
fclose($fp);
}
// PVをカウント
$data = $entry_id;
$fp = @fopen($logfile,"a") or die("Cannot Open File");
flock($fp, LOCK_EX);
fputs($fp, "$data\n");
fclose($fp);
}
/* ----- ランキング表示 ----- */
function poprank_call($skin) {
if (!preg_match("/\{POPRANK\}/",$skin)) {
return $skin;
}
$pop_log = LOGDIR."poprank/popular.log";
if (file_exists($pop_log)) {
$datas = file($pop_log);
$poprank = "<ol id=\"poprank\">\n";
for ($i = 0; $i < 5; $i++) {
list($pop_id, $pop_count,) = explode(",", $datas[$i]);
if ($loglist = IDCheck($pop_id,0)) {
$log = file(LOGDIR.substr($loglist[0],3,4)."/".$loglist[0]);
$key = IDSearch($pop_id, $log);
list(,,,,, $d_title,,,,) = explode("<>", $log[$key]);
}
$poprank .= '<li><a href="'.HOMELINK.'index.php?eid='.$pop_id.'">'.$d_title.'</a> ('.$pop_count.')</li>
';
}
$poprank .= "</ol>\n";
}else{
$poprank = '<div align="center">集計中</div>';
}
$skin = preg_replace("/\{POPRANK\}/","$poprank", $skin);
return $skin;
}
/* ----- 日付を逆算 ----- */
function poprank_get_day($day){
return mktime(date("H"),date("i"),date("s"),date("m"),date("d")+$day,date("Y"));
}
「index.php」220行目あたりに赤い文字列を追加。
if (IKEY == 0) {
$skin = calendar_call($skin, $qry_data);
$skin = newentries_call($skin);
$skin = recomments_call($skin);
$skin = retrackback_call($skin);
$skin = categorylist_call($skin, $category);
$skin = archives_call($skin);
$skin = linkslist_call($skin);
$skin = profilelist_call($skin, $profile);
$skin = poprank_call($skin);
}
「index.php」330行目あたりに赤い文字列を追加。
case "eid": //ID別表示
$skin = preg_replace("/\{SEARCH\}[\w\W]+?\{\/SEARCH\}/", "", $skin);
$skin = preg_replace("/\{PROFILES\}[\w\W]+?\{\/PROFILES\}/", "", $skin);
$skin = preg_replace("/\{NEXTPAGE\}[\w\W]+?\{\/NEXTPAGE\}/", "", $skin);
$skin = preg_replace("/\{BACKPAGE\}[\w\W]+?\{\/BACKPAGE\}/", "", $skin);
$skin = id_log($skin, $qry_eid);
poprank_count_entry($qry_eid);
break;