各記事の閲覧数ランキングを表示させたい

category-icon

 こんばんは、久しぶりにmartinです。

 フォーラムの方で、「記事の表示回数と順位の表示は出来ないでしょうか?Link 」というエントリーがあって、ちょっとプログラミングがしたくなったのでとりあえず書いてみました。このサイトで、テーマをBasicにすれば、左側のサイドバーに「人気エントリー」というのが表示されていると思います。

 基本的には、utils.phpをいじることで実現できます。utils.phpの538行目あたりに以下の記述を追加しました。閲覧数を記録するファイル(ranking.ini.php)はownerディレクトリに作るとします。

 if(!ADMIN && $UID != ''){ // 閲覧数ランキング用
  if(is_file(($ranking = OD.'ranking.ini.php'))){
   include_once $ranking; // これで$RANKING配列をゲット
   $hit = preg_grep("/(¥d+¥t$UID¥t.+?)/", $RANKING);
   if(empty($hit)){
    array_push($RANKING, "1¥t$UID¥t$pm_link¥t$_title");
    rewrite_ini($ranking, $RANKING);
   } else {
    $ix = array_keys($hit); $ix = $ix[0];
    list($count,) = explode("¥t", $RANKING[$ix], 2);
    $RANKING[$ix] = (++$count)."¥t$UID¥t$pm_link¥t$_title"; // ヒットした数の更新
    $RANKING = array_slice($RANKING, 0, 100); // とりあえず100件も登録すればOKだろう
    rsort($RANKING, SORT_NUMERIC); // 大きい順にソート
    rewrite_ini($ranking, $RANKING);
   }
  } else rewrite_ini($ranking, '', '$RANKING'); // 記録保持ファイルがないなら作成
 }

 テーマファイルのtemplate.phpには新たな変数%_RANKING:1:人気エントリー:1_%を用意しておきます。具体的には以下のような感じ。つまりrankingという新たなIDが加わります(pprankingの方が良いかなぁ)。

<div id="ranking">%_RANKING:1:人気エントリー:1_%</div><!--#ranking-->

 そして、この変数を変換する関数を用意しておきます。

function showRanking(){
 if(is_file(($ranking = OD.'ranking.ini.php'))){
  include_once $ranking;
  if(!empty($RANKING)){
   $h = NL;
   foreach ($RANKING as $i => $r){
    if($i >= RECENT_ENTRIES) break; // 表示させる数はエントリー記事の表示数と同じ設定にしておく
    list($count, $uid, $pmlink, $title) = explode("¥t", $r, 4);
    $h .= '    <li><a href="'.$pmlink.'" title="'.date('Y年n月j日の投稿', $uid).'">'.$title.'</a> <span title="閲覧数">'.$count.'</span></li>'.NL;
   }
   return $h;
  }
 }
}

 後は、テーマファイルのCSSファイルもちょいといじって出来上がりです。とりあえず、この改造を施したutils.phpとBasicテーマのtemplate.php及びCSSファイルを添付しておきますね。

添付ファイル: template.phpattachedIcon  basic.cssattachedIcon  utils.phpattachedIcon 

— posted by martin at 05:53 am   commentComment [6]  pingTrackBack [0]

この記事に対するコメント・トラックバック [6件]

scrollUp1. ☆アルファ☆ Website — 2009/08/15@20:09:05

とても便利な機能を作っていただいたありがとうございます。

さっそく3つのファイルをそれぞれ上書きしたのですが、
自分のサイトでは、「人気エリトリー」ではなく、
「Ranking」というエリアが上の「Recentry」にくっついてできて、
その中には何も表示されません。

なにか原因があるのでしょうか?

2. ☆アルファ☆ Website — 2009/08/15@20:31:43

その後、「Ranking」のなかにアクセス数が表示され始めました。
過去の分ではなく、設置後のアクセスがカウントされるのですね。

3. ちらみ — 2009/08/18@09:03:34

おひさしぶりです、ちらみです。
面白そうな機能なので早速入れてみました。

これってTOPページへのアクセス時しか、ランキング表示されないようですが仕様ですか?
個別記事へのアクセス時でもサイドバーにランキングが出る方が良いような気がしますが。

あと、ランキング上位N位というように、リストを何個出すかという設定ができると更に良いと思います。

Owner Comment martin Website  2009/08/18@16:46:05

ちらみさん、ご無沙汰です。個別記事では表示されないですね。これは仕様ではありません。今夜時間があればみておきます。とりあえず動くやつを作ったという感じなので、リクエストは採用される可能性が高いです:)

5. ☆アルファ☆ Website — 2009/11/04@06:02:32

今日気づくと、ランキングの数字がリセットされて、また新しく集計が始まりました。最大いくつになるとリセットされるとか、何ヶ月たつとリセットされるという設定になっているのでしょうか?

scrollUpOwner Comment martin Website  2009/11/05@03:03:18

こんばんは。特にリセットするという設定にはなってないです。
現状、特にバックアップファイルもとってないですし、アクセスカウントみたいに、ある程度頑強なファイルロックの機構も取り入れてないので、たまたま書き込みが重複すると空になる可能性はありますねぇ。
この辺は、改善の余地ありですね。考えてみます。

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~

     
T: Y: ALL: Online:
Created in 0.0187 sec.
prev
2017.5
next
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31