ショートコードでサイト全体の今日の閲覧数を表示する方法(日付ごとのユニークIPカウント)

WordPressサイト全体の閲覧数を、日付ごとのユニークIPカウントで表示する方法をご紹介します。これにより、1日に同じIPからの複数アクセスは1回だけカウントされます。

サイトの閲覧数をカウントする際、Botや管理者アクセスは除外されます。これにより、実際の訪問者数(ユーザー)だけを正確にカウントできます。

  1. あるIPが 23:00 にアクセス → カウント
  2. 日付ごとにIP配列をリセットするので、0時を跨げば新しい日としてカウント。
  3. 「今日の件数」は 厳密に日単位のユニークIP。

1 実装のポイント

  • 日付単位でユニークIPごとにカウント
  • ショートコード [site_daily_unique_views] でフロントに表示可能
  • JavaScript(Ajax)で非同期更新も可能

2 functions.php に追加するコード


// ----------------------------------------------
// サイト全体の閲覧数を日付ごとのユニークIPカウント
// ----------------------------------------------
function increment_site_daily_unique_views() {
    // --- タイムゾーンを日本時間に設定 ---
    date_default_timezone_set('Asia/Tokyo');

    // --- IP取得(Cloudflare対応) ---
    $headers = ['HTTP_CF_CONNECTING_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
    $user_ip = '';
    foreach ($headers as $key) {
        if (!empty($_SERVER[$key])) {
            $user_ip = sanitize_text_field(explode(',', $_SERVER[$key])[0]);
            break;
        }
    }

    if (!$user_ip) return; // IP取れない場合はカウントしない

    $today = date('Y-m-d'); // 今日の日付
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');

    // ▼ Bot除外
    $bot_keywords = [
        'bot', 'crawl', 'spider', 'slurp', 'bingpreview',
        'mediapartners-google', 'facebookexternalhit', 'python-requests',
        'curl', 'wget', 'validator', 'ahrefs', 'semrush', 'lighthouse'
    ];
    foreach ($bot_keywords as $bot) {
        if (strpos($user_agent, $bot) !== false) return; // Botアクセス除外
    }

    // 保存済みIPリストを取得
    $daily_ips = get_option('site_daily_unique_views_ips', []);

    // 今日の日付の配列がなければ作成
    if (!isset($daily_ips[$today])) {
        $daily_ips[$today] = [];
    }

    // --- IP単位でユニーク判定 ---
    if (!in_array($user_ip, $daily_ips[$today], true)) {
        $daily_ips[$today][] = $user_ip;
        update_option('site_daily_unique_views_ips', $daily_ips, false); // 保存
    }

}
add_action('template_redirect', 'increment_site_daily_unique_views');

// --------------------
// 現在のユニーク閲覧数を取得
// --------------------
function get_site_daily_unique_views($date = null) {
    $daily_ips = get_option('site_daily_unique_views_ips', []);
    if ($date === null) {
        $date = date('Y-m-d');
    }
    return isset($daily_ips[$date]) ? count($daily_ips[$date]) : 0;
}

// --------------------
// ショートコードで表示
// --------------------
function site_daily_unique_views_shortcode($atts) {
    $atts = shortcode_atts(array(
        'date' => 'today' // today または YYYY-MM-DD
    ), $atts, 'site_daily_unique_views');

    $date = ($atts['date'] === 'today') ? null : $atts['date'];
    return '' . get_site_daily_unique_views($date) . '';
}
add_shortcode('site_daily_unique_views', 'site_daily_unique_views_shortcode');

// --------------------
// Ajax用スクリプト読み込み
// --------------------
function enqueue_site_daily_views_script() {
    wp_enqueue_script(
        'site-daily-views-ajax',
        get_stylesheet_directory_uri() . '/js/site-daily-views.js',
        array('jquery'),
        '1.0',
        true
    );

    wp_localize_script('site-daily-views-ajax', 'siteDailyViewsData', array(
        'ajax_url' => admin_url('admin-ajax.php')
    ));
}
add_action('wp_enqueue_scripts', 'enqueue_site_daily_views_script');

// --------------------
// Ajax応答
// --------------------
add_action('wp_ajax_get_site_daily_views', 'ajax_get_site_daily_views');
add_action('wp_ajax_nopriv_get_site_daily_views', 'ajax_get_site_daily_views');
function ajax_get_site_daily_views() {
    wp_send_json_success(array(
        'total' => get_site_daily_unique_views()
    ));
}
  

3 ショートコードの使い方

クラシックエディタの任意の場所に以下のように貼り付けて表示できます。

[site_daily_unique_views]

例:記事内で「本日の閲覧者数: 1 人」と表示可能です。

4 任意:非同期更新(Ajax)

訪問者が増えた場合、ページ再読み込みせずに最新値を反映させる場合は以下のJavaScriptを使用します。

ファイル名:site_daily_views.js
保存先:wp-content/themes/child-theme/js/site_daily_views.js


// ----------------------------------------------
// サイト全体の閲覧数を日付ごとのユニークIPカウント
// ----------------------------------------------
document.addEventListener('DOMContentLoaded', function() {
    const el = document.querySelector('.site_daily_unique_views');
    if (!el || !siteDailyViewsData) return;

    fetch(siteDailyViewsData.ajax_url, {
        method: 'POST',
        headers: {'Content-Type':'application/x-www-form-urlencoded'},
        body: 'action=get_site_daily_views'
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            el.textContent = data.data.total;
        }
    });
});
  

4.1 ディレクトリ構造

  • child-theme/
    • archive.php
    • category.php
    • functions.php
    • footer.php
    • header.php
    • style.css
    • js/
      • site_daily_views.js

5 完成イメージ

本日の閲覧者数1人

6 Botアクセス除外の一覧

サイトの閲覧数をカウントする際に、以下のBotは除外されます:

Bot名 ユーザーエージェント例 カウント状況
Googlebot Googlebot/2.1 除外される
Bingbot bingpreview 除外される
Yahoo Slurp slurp 除外される
Facebook facebookexternalhit 除外される
Twitter twitterbot 除外される
CURL / Wget curl / wget 除外される
Python python-requests 除外される
中国系Bot baiduspider, yandex, petalbot 除外される

6.1 SEOへの影響について

今回のBot除外は、あくまで「サイト閲覧数をカウントする処理」にのみ影響します。ページのコンテンツやHTML出力はそのまま表示されるため、GoogleやBingなどの検索エンジンによるインデックスやランキング評価には影響しません。

つまり、閲覧数の統計精度を上げるための処理であり、SEOの評価には安全です。

7 まとめ

  • 日付ごとのユニークIP単位でサイト全体の閲覧数を正確にカウント
  • ショートコード <site_daily_unique_views> でフロントに表示可能
  • ダッシュボードウィジェットで今日の訪問者数と同期可能
  • JavaScriptで非同期更新も可能
  • googlebotを回避しても、SEO対策には影響しません。見た目の件数だけ回避しています。