人気記事ランキング(Blogn版)

Blogn に人気記事ランキングを表示する方法です。

BlognPlus用モジュール」とは違い、ログ閲覧機能はなく純粋にランキングだけを表示します。

説明

記事が読まれる度にその記事IDを記録します。そのログをもとに過去3日間に読まれた記事のページビューを集計しランキングを出力します。

動作例は「nJOY BLOG」をご覧ください。

改造方法

「POPRANK」ディレクトリ

「log」ディレクトリの下に「poprank」ディレクトリを作成。パーミッションを 707 または 777 にする。

スキン

スキンファイルの好きな場所に {POPRANK] と記述する。

index.php

「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;

サイト作成のヒント集に戻る