数を競う
21世紀が産声を上げたころ、ホームページやブログの訪問者数を競う風潮にあり、右図のようなアクセスカウンターを表示することが流行りました。
今では数を競うよりも中身の充実度を重要視するようになりました。
検索エンジンのBOT(ボット、ロボットから転じて使われた)など人間に代わって作業を行うコンピュータープログラムにより、計数値が異常に上がったりして数自体も信用性が薄らいでいます。
遊び心
そうはいっても、訪問者数やページビュー数を評価の参考にしているサイト運営者が多いと思われます。訪問者数をそのまま表示しても面白みが少ないので、ページビュー数が500キリ番になったとき、幸運の証として特別な表示が現れる仕組みを施しました。
ページビュー数がたとえば、231000,231500,232000になったとき、カテゴリ別に記事タイトルが表示される直前に、下のような幸運を呼ぶ図が現れます。
仕組み
ページビューカウンター、訪問者カウンター、IPアドレスを保存するファイル(例えばcount.txt)を用意します。訪問者カウンターはIs_user_logged_in()関数を使うと、WordPressで会員制サイトを作った際、カスタマイズに利用することができます。
このカウンターは解析用に設置しており、直前にアクセスしたIPアドレスと今回のアドレスが異なるときに、カウントアップされます。
カウントアップコードは記事を閲覧する大元に設置しているので、ページビューカウンターは無条件にカウントアップされます。今回はサイトマップの固定ページに挿入しました。
よって、記事のURLアドレスをブラウザの入力欄に直接、指定して閲覧した場合は、二つのカウンターは増加されません。
サンプルコードで苦心した点
phpコードでファイルへの書込みや読込みをする場合、fwrite,fread関数を用います。アクセスモードはテキストが基本です。カウンターの値が大きくなると総桁数が大きくなり変動するので、複数回の書込みや読込みで問題動作を引き起こします。
そこですべての項目をテキストイメージで保存し、項目をカンマで区切った一つだけのレコードにします。そして、読込み時にexplode関数を用いて文字列をデータに分割し配列に格納します。
考察
このたび、アクセスカウンターコードをサイトマップの記事に設置したので、ページビューカウンターが実態より少なめに表示されます。これはWordPressのソースコードに手を加えたくなかったからです。
もっと正確なページビューカウンターを把握するには、これらのコードをWordPressシステムコードのfunctions.phpに入れるようにすれば精度の高いアクセスカウンターが実現できるものと思われます。
サンプルコード
<?php $total = array(0, 0, 0); // 0:$pageview, 1:$count, 2:$ipaddress // 閲覧ページ数 訪問者数 IPアドレス $file_name = "count.txt"; $ip = $_SERVER["REMOTE_ADDR"]; // IPアドレスを取得する if( file_exists($file_name) ){ $handle = fopen($file_name, 'r'); // ファイルを読み込む $t = fread($handle, 128); // ページビュー他のデータをファイルから読み込む $total = explode(",", $t); // 文字列を分割 $total[0] = $total[0] + 1; // ページビューの数字を無条件に増やす fclose($handle); // ファイルを閉じる if($ip != $total[2]){ // 新規訪問者とみなす $total[1] = $total[1] + 1; // 訪問者の数字を増やす $total[2] = $ip; // IPアドレスを更新する } } $t = $total[0].",".$total[1].",".$total[2];// 書き込む文字列を連結 $handle = fopen($file_name , 'w'); // ファイルを書き出し用にオープンする if($handle){ if(flock($handle, LOCK_EX)){ $outn = fwrite($handle, $t); // 文字列を書き込む if($outn === FALSE){ echo('ファイル書き込みに失敗しました'); } flock($handle, LOCK_UN); } fclose($handle); // ファイルを閉じる } ?> // ここに閲覧ページ数($total[0])や訪問者数($total[1])を参照して、適切なコードを追加します。