NewStatPressの訪問者総数を補正(WordPressのプラグイン修正)

本サイトでは、WordPressのプラグイン「NewStatPress」を使用し、サイトのアクセス解析を行うと同時にサイドバーのウィジェットに閲覧ページ数や訪問者数を表示しています。

ところが、このNewStatPressのプログラムを解析したところ、DBに蓄積したデータが増えるに従い、ウィジェットの表示が遅くなる事が分かりました。
どうやら、サイトのパフォーマンスを維持するためには、NewStatPressが使用するデータベースに溜まったデータを定期的にリフレッシュする必要があるようです。

しかし、DBのデータをクリアすると、NewStatPressが表示するカウンタもリセットされる仕様になっているため、この処理を容易に行う事が出来ません。 👉 この現象は、バグであったように思われます。 (5月16日更新) Look at [resolved] access number automatically reset everyday (4 posts)

よって、やりたくは無かったのですが、最終手段として、NewStatPressのプログラムを修正する事にしました。
ネットを検索した限りでは、NewStatPressの最新バージョン(0.9.7)に対し、日本でこの修正を行った人は未だ居ない模様です。
修正箇所を見つけるのに少し時間が掛かりましたが、やっと見つけました。

本サイトは、1月15日から3月14日までに、7400人の訪問がありましたが、翌日にDBのデータをクリアした事で、カウンタが0になってしまいましたので、訪問者総数に+7400を加えるようプログラムを修正しました。

参考のため、修正方法を以下に示します。
なお、この処理で何らかの問題が生じても、私は一切責任を負いません。
もし、あなたがこれを参考にプログラムを修正されるのなら、あくまでも自己責任でお願いします。

以下に示すAjaxを制御するモジュールから呼ばれるAPI(variables.php)を修正します。
中身は、殆どSQLの集まりですが…

*Ajaxとは…

 

このプログラムの「Line 71」を以下のように修正します。(本サイトでは、+ 7400)

 

以下にプログラムの修正前と修正後のウィジェットの表示結果を示します。

* 8月11日 追記
因みに、私はNewStatPressのDBの肥大化を防ぐため、集計期間を3ヶ月に設定し、総合カウンタの集計については、NewStatPressのカウンタ値を使用せずに、Perlのプログラムの集計値を使用するようにしました。
(front-page.php内から、Perlのプログラム呼び出し)

ワードプレスからPerlのアクセス解析プログラムを呼び出す実験

これまでの実験で、WordPressにおけるテーマのheader.phpより、単純にperlのアクセス解析プログラム「perlstats.cgi(仮称)」を呼び出すと、サーバーの環境変数が引き継がれない事が判明しています。

今回は、WordPressのindex.phpのプログラム内にperlのアクセス解析プログラムを呼び出す実験をしました。
なお、普通に呼び出すと、やはり環境変数が渡らないようなので、予め、PHPのプログラム側から環境変数を取得し、パラメーターで渡す方式でperlのプログラムも修正しました。

index.phpのプログラムコードは、以下の通りです。
(セキュリティ上、実際のコードを少し修正しています)

 

perlstats.plの実行後の結果を表示する管理プログラムの画面を以下に示します。

 

上の画面を見ると、以下のサーバーの環境変数は、引き渡されている事が分かります。

REMOTE_HOST
REMOTE_ADDR
HTTP_USER_AGENT

しかし、残念ながら、リンク元URLの集計が’0’のままなので、HTTP_REFERERは送られていない模様です。

そこで、そもそも、HTTP_REFERERがPHPならびにperlで正しく設定されているのかどうかを確かめるため、簡単な実験サイトを作って検証して見ました。

まず、使用可能な環境変数を表示するPHPのプログラム「server_key.php」です。(以下)

 

次に、使用可能な環境変数を表示するperlのプログラム「server_key.pl」です。(以下)

 

そして、それらのプログラムを呼び出す側のHTMLコード「test_referer.html」です。 (以下)

 

上の二つのリンクのそれぞれの結果は、以下の通りです。

PHP、perlともサーバー環境変数の取得はちゃんと出来ている事がこれで、分かりました。
WordPress上でなければ、問題なく動くようです。

 

問題は、三番目のリンク(index.php)です。
結局、HTTP_REFERERは取得できていませんでした。

そこで、index.phpへのコードの挿入位置に問題があるのかもしれないという事で、以下のように変更して見ました。

 

その結果は、見事に失敗でした。 (>_<)

PHPの同一スコープ内に置いても、同じ結果でした。
NewStatPressなど、WordPressのプラグインでHTTP_REFERERの情報が非同期にリセットされているような気がするのですが、詳しい原因は私には良く分かりません。
もしかしたら、プラグイン「WP Super Cache」によるキャッシュが原因かもしれません。

この件で解る方、誰か、エロイ先生教えて下さい!!(笑)

という事で…

WordPressからperlプログラムへHTTP_REFERERを渡すのは難しいので、perlのアクセス解析プログラム「perlstats.cgi」において、「リンク元URLの集計」の部分はできないという事で諦めます。 orz