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

update 最終更新日:2022年6月14日 at 1:00 PM

本サイトでは、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とは…

<?php
#error_reporting(E_ALL);
#ini_set('display_errors', 1);

if($_SERVER['REQUEST_METHOD'] != "GET") die("API available only from Newstatpress");

require_once('../../../../../wp-load.php');

// get the parameter from URL
$var = $_REQUEST["VAR"];

global $wpdb;
$table_name = $wpdb->prefix . "statpress";


// test all vars
if ($var=='alltotalvisits') {
  $qry = $wpdb->get_results(
  "SELECT count(distinct urlrequested, ip) AS pageview
   FROM $table_name AS t1
   WHERE
    spider='' AND
    feed='' AND
    urlrequested!='';
   ");
   if ($qry != null) {
     echo $qry[0]->pageview;
   }
} elseif ($var=='visits') {
    $qry = $wpdb->get_results(
      "SELECT count(DISTINCT(ip)) AS pageview
       FROM $table_name
       WHERE
        date = '".gmdate("Ymd",current_time('timestamp'))."' AND
        spider='' and feed='';
      ");
   if ($qry != null) {
     echo $qry[0]->pageview;
   } 
} elseif ($var=='yvisits') {
    $qry = $wpdb->get_results(
      "SELECT count(DISTINCT(ip)) AS pageview
       FROM $table_name
       WHERE
        date = '".gmdate("Ymd",current_time('timestamp')-86400)."' AND
        spider='' and feed='';
      ");
   if ($qry != null) {
     echo $qry[0]->pageview;
   }  
} elseif ($var=='mvisits') {
    $qry = $wpdb->get_results(
      "SELECT count(DISTINCT(ip)) AS pageview
       FROM $table_name
       WHERE
        date LIKE '".gmdate('Ym', current_time('timestamp'))."%'
        spider='' and feed='';
      ");  
   if ($qry != null) {
     echo $qry[0]->pageview;
   }
} elseif ($var=='totalvisits') {
    $qry = $wpdb->get_results(
      "SELECT count(DISTINCT(ip)) AS pageview
       FROM $table_name
       WHERE
         spider='' AND
         feed='';
      ");
   if ($qry != null) {
     echo $qry[0]->pageview;
   }
} elseif ($var=='totalpageviews') {
    $qry = $wpdb->get_results(
      "SELECT count(id) AS pageview
       FROM $table_name
       WHERE
         spider='' AND
         feed='';
      ");  
   if ($qry != null) {
     echo $qry[0]->pageview;
   }
} elseif ($var=='todaytotalpageviews') {
    $qry = $wpdb->get_results(
      "SELECT count(id) AS pageview
       FROM $table_name
       WHERE
         date = '".gmdate("Ymd",current_time('timestamp'))."' AND
         spider='' AND
         feed='';
      ");  
   if ($qry != null) {
     echo $qry[0]->pageview;
   }
} elseif ($var=='thistotalvisits') {
    $url = esc_sql($_REQUEST["URL"]);

    $qry = $wpdb->get_results(
      "SELECT count(DISTINCT(ip)) AS pageview
       FROM $table_name
       WHERE
         spider='' AND
         feed='' AND
         urlrequested='".$url."';
      ");
   if ($qry != null) {
     echo $qry[0]->pageview;
   }  
} elseif ($var=='widget_topposts') {
    $limit = intval($_REQUEST["LIMIT"]);
    $showcounts = $_REQUEST["FLAG"];
    
    $res="\n<ul>\n";
    $qry = $wpdb->get_results(
      "SELECT urlrequested,count(*) as totale
       FROM $table_name
       WHERE
         spider='' AND
         feed='' AND
         urlrequested LIKE '%p=%'
       GROUP BY urlrequested
       ORDER BY totale DESC LIMIT $limit;
      ");
   foreach ($qry as $rk) {
     $res.="<li><a href='?".$rk->urlrequested."' target='_blank'>".iri_NewStatPress_Decode($rk->urlrequested)."</a></li>\n";
     if(strtolower($showcounts) == 'checked') { $res.=" (".$rk->totale.")"; }
   }
   echo "$res</ul>\n";
}

?>


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

   if ($qry != null) {
     // The line below has been modified by Senri on 2 April 2015.
     echo $qry[0]->pageview + 7400;
   }


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

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

2022.06.13 追記
本記事の執筆時(NewStatPress 1.4.2) において確認したところ、Visitors, Pageviews, etc., などのオフセット値が設定できるようになっています。

2024,06.03 追記
現在、このプラグインは長らく更新されておらず、互換性の問題や不具合が生じていたため、アンインストールし、代わりに以下のプラグイン「SlimStat Analytics」を使用しています。

このエントリーをはてなブックマークに追加
X(ポスト)

コメントを残す