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;