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

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]

T: Y: ALL: Online:
Created in 0.0033 sec.
prev
2009.8
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