忘れないように記録しとこ

カバの樹

Jetpackのサイト統計情報(Stats module)にIPフィルターを設定する方法

はじめに

先日からKUSANAGIWEXAL Page Speed Technologyの導入実験を進めています。

WEXAL Page Speed Technologyはサイトの表示速度を劇的に改善してくれるのですが、最大の課題としてBotアクセスが異常に増加する問題が発生します。

 

これを改善するために、IPでBotを判断して、アクセス集計にフィルターをかけたいと思います。

 

Jetpackのサイト統計情報(Stats module)にはIPフィルター機能が無い

Google AnalyticsなどはIPでフィルターを設定することが可能です。
しかし、Jetpackサイト統計情報(Stats module)にはIPフィルターを設定する機能がありません。

だいぶ昔から要望はされてるんですけどねぇ・・・
https://github.com/Automattic/jetpack/issues/3570

 

集計用のScriptを調べる

Jetpackサイト統計情報(Stats module)が集計する際には、下記のScriptがWEBページに埋め込まれています。

<script type='text/javascript' src='https://stats.wp.com/e-202019.js' async='async' defer='defer'></script>
<script type='text/javascript'>
_stq = window._stq || [];
_stq.push([ 'view', {v:'ext',j:'1:8.4.2',blog:'71391261',post:'0',tz:'9',srv:'hoge.com'} ]);
_stq.push([ 'clickTrackerInit', '71391261', '0' ]);
</script>

 

これを表示しないようにしてやればOKですね。

 

IPフィルターを自作する

Jetpackプラグインのtemplate_redirectフックを利用してIPフィルターを設定します。

function is_bot_ip(){
  $ip = $_SERVER['REMOTE_ADDR'];
  return (
      preg_match('/^66.249.0.0/', $ip)
      || preg_match('/^54.36.0.0/', $ip)
  );
}
function jetpack_stats_ip_filter()
{
  if (is_bot_ip()) {
      remove_action('wp_footer', 'stats_footer', 101);
      remove_action('wp_head', 'stats_add_shutdown_action');
  }
}
add_action('template_redirect', 'jetpack_stats_ip_filter');

is_bot_ip関数に除外したいIPアドレスを設定します。
当サイト同様にCloudflareを利用してプロキシーを行なっている場合は、$_SERVER['REMOTE_ADDR'] の部分を $_SERVER['HTTP_X_FORWARDED_FOR'] に変更します。

 

キャッシュに注意!

今回の設定の場合、PHPを使ってサーバーサイドからの解決方法になっています。
キャッシュプラグイン等を利用している場合、全てを対象にする or 全てを除外するのどちらかになってしまうと思います。

 

さいごに

Jetpackのサイト統計情報(Stats module)にIPフィルターを設定する方法でした。

早く正式が機能として、IPフィルターが実装されると良いですね。
現状は優先度低いようですが・・・

今日はこの辺でー

 

追加のコメント

WEXAL Page Speed Technologyは、キャッシュを利用しているのか今回の仕組みが動作しないようです。

とほほ・・・別の対応考えよう・・・

 

  • B!