WordPressのサイドバーに人気記事を表示させたいと、ブログを運用している人なら一度は考えるだろう。プラグインを使う手もあるが、1つ問題がある。それは他者が作ったプラグインがどういう仕様なのかよく分からないことだ。
実際に自分でウェブサーバーのログを見ると分かるのだが、ウェブページにアクセスしてくるのは人だけではなく、検索エンジンbotなどが大量にアクセスしてくる。経験のないエンジニアがウェブ運用の現実を知らずにhttpのセッションまわりの機能を作ると、大量の検索エンジンbotのアクセスを除外せずに作ってしまう。
かくしてgoogle analyticsのアクセス解析データとはまったく異なる奇妙なアクセスランキングができあがる。アクセス数が実際よりはるかに水増ししているように見えるのだ。この仕組みを使ったサービスが昔あった。アメブロである。実際に人が見たのは1人なので、アメブロのアクセス解析をみると100くらいになっているのである。今はどうかしらないが、10年くらい前はそういう仕様だったと記憶している。
100倍もアクセス数が水増しされるなんて大げさだと思うかもしれないが、案外そうではないのがネットの怖いところだ。私は人とbotの違いを考慮しないアクセス数をデータとして取得したことがある。
その計測方法はこうだ。
- ページ滞在時間を考慮せず、とにかくページにあったリクエストを集計する
- 30秒以上滞在が確認できたリクエストだけを集計する
たったこれだけの違いだが、30秒以上のアクセスでフィルタをかけると、アクセス数は8分の1になった。ネットを巡回するだけのbotが1秒以上ページに滞在するなんてことはまず考えられず、それほどまでにインターネットでは雑音とでも言うべき余計なアクセスが多いのだ。これはサーバー管理をする人なら誰もが知っている。
WordPressにプラグインなしで人気記事を表示させる
話を戻そう。プラグインなしで人気記事を表示させるには、いくつか方法がある。ぱっと思いつくだけで、3つはある。
- Google AnalyticsのAPIを使い、データを連動させてWordPressに人気記事を表示させる
- ウェブサーバーのアクセスログを集計する
- セッションを取得するプログラムを作成し、データベースを利用して集計する
Google AnalyticsのAPIを使う方法
この方法はおすすめだが、googleのAPIの使い方を覚える必要がある。またAPIへのリクエストが多いとお金がかかる場合がある。また、APIの仕様が変わる場合を考慮しておかないといけない。そして何より、自分が管理していないgoogle analyticsのアカウントの場合APIの利用には制限があり、場合によってはこの問題をクリアできない可能性がある。他者、他社の場合はこれが大きな壁となる。
ウェブサーバーのアクセスログを集計する
nginxやapacheなどウェブサーバーには日々ログが記録される。ログの出力形式はウェブサーバーの設定で調整できるし、botについてもUAを見ればある程度判断できる。
ただし、アクセスの多いウェブサイトの場合はすさまじい行数のログとなる。これはページだけではなく画像やCSSなど外部ファイルのリクエストも含まれるからだ。したがって一ヶ月につき1万PV程度のサイトでも、アクセスログのファイルを開くとけっこう重い。それを集計するとなると負荷分散を考慮する必要がある。単純な方法だが考慮すべきことはけっこう多い。
セッションを取得するプログラムを作成し、データベースを利用して集計する
データベースを利用する方法の大まかな考え方を案内すると、大まかな流れはこんな感じだ。
- セッションを取得するPHPを用意する
- そのPHPをWordPressの各種類のページのヘッダーに仕込む
- 取得したデータをDBに登録する
- DBのデータをフロントに表示させる
ざっくり書くとこれだけである。難しいのはやはり手順1だ。技術的に難しいというより、どういう思想に基づいてセッションを取得するか?が問題になる。上述の通り、何も考えずリクエストだけを取得するとbotなどのアクセスも含んで集計してしまう。これをどう弾くかについて考えなければならない。
ここで重要なのは完璧なデータ取得は不可能なので、そんな希望は放棄するということだ。もし本格的にアクセス数の集計プログラムを作るなら、とりあえず集められるデータは全て集めて、機械学習モデルを作ってフィルタリングするなんて考えもあるが、google analyticsという業界標準のツールがあるのに、そこまで自前で用意する必要がある人は少ないだろう。
だから、あくまで統計データとしてのデータが取得できればそれで十分である。最低限取得するべきデータは以下の通り。
- リクエスト先ページURL
- ページ滞在時間
- ページスクロール率
- UA(ユーザーエージェント)
- 日時
- IPアドレス
- セッションID
こういったデータをPHPやJavaScriptを駆使して取得し、集計する。集計したデータはデータベースに登録する。ここまでできれば、あとはデータを呼び出すだけだから簡単だろう。