ダッシュボードに今日の訪問者数(閲覧数)を表示する方法(管理画面ウィジェットのみに表示)

WordPressの管理画面に、今日と昨日の訪問者数を簡単に表示するダッシュボードウィジェットを作成できます。

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

1 使い方

  1. 子テーマの functions.php に以下のコードを追加します。
  2. 管理画面にログインするとダッシュボードに「今日と昨日の訪問者数」が表示されます。
比較項目 この修正版コード よくある「なんちゃって閲覧数」
カウント単位 IPアドレス単位(1日1回のみカウント) ページを開くたびに1カウント(同一ユーザーでも何度でも)
保存先 wp_options(キー名:daily_visitors_YYYY-MM-DD post_meta(記事ごとにPV加算)
計測対象 サイト全体(訪問者単位) 各投稿ページ(閲覧回数)
Bot除外 あり(主要Bot+キャッシュ系Botまで除外) なし or 一部のみ除外
管理者除外 設定済み(current_user_can('manage_options') ほぼ除外されない
表示場所 管理画面ダッシュボード 投稿ページやウィジェットなど
精度 非常に高い(Bot・キャッシュ・CDN除外対応) 低い(PVを単純加算)
Ahrefs / Semrush ahrefsbot, semrushbot 除外される
LiteSpeed / WP Rocket litespeed / wp-rocket 除外される(キャッシュプリロード)

2 functions.php にコードを追加

注意: 必ず子テーマの functions.php に追加してください。親テーマに直接追加するとアップデートで消える可能性があります。


//-------------------------------------------
// ダッシュボードに今日と昨日の訪問者数を表示
//-------------------------------------------
add_action('wp_enqueue_scripts', function() {
    wp_enqueue_script('visit-counter', get_stylesheet_directory_uri() . '/js/visit-counter.js', ['jquery'], null, true);
    wp_localize_script('visit-counter', 'visitCounterAjax', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('visit_counter_nonce'),
    ]);
});

//-------------------------------------------
// Ajaxハンドラー(未ログイン・ログイン両対応)
//-------------------------------------------
add_action('wp_ajax_nopriv_record_visit', 'record_visit');
add_action('wp_ajax_record_visit', 'record_visit');

function record_visit() {
    check_ajax_referer('visit_counter_nonce', 'nonce');

    date_default_timezone_set('Asia/Tokyo');
    $today = date('Y-m-d');
    $ip     = '';
    $ua     = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
    $current_time = time();

    // --- IPアドレス安定取得 ---
    $headers = ['HTTP_CF_CONNECTING_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
    foreach ($headers as $key) {
        if (!empty($_SERVER[$key])) {
            $ip = sanitize_text_field(explode(',', $_SERVER[$key])[0]);
            break;
        }
    }

    // --- 除外条件 ---
    $bot_pattern = '/(bot|crawl|spider|slurp|preview|fetch|curl|wget|validator|ahrefs|semrush|mj12|petalbot|yandex|uptimerobot|facebook|twitter|discord|telegram|litespeed|wp-rocket)/i';
    if (
        !$ip ||
        preg_match($bot_pattern, $ua) ||
        current_user_can('manage_options') ||
        isset($_SERVER['HTTP_X_LSCACHE']) ||
        isset($_SERVER['HTTP_X_WP_ROCKET'])
    ) {
        wp_send_json_success(['status' => 'excluded']);
        return;
    }

    // --- 一意IDを生成(IP+UA) ---
    $visitor_id = md5($ip . $ua);

    // --- 訪問履歴を保存 ---
    $option_key = 'daily_visitors_' . $today;
    $visitors = get_option($option_key, []);

    // 同一訪問者は1日1回のみ
    if (!in_array($visitor_id, $visitors)) {
        $visitors[] = $visitor_id;
        update_option($option_key, $visitors);
    }

    wp_send_json_success(['status' => 'counted', 'total' => count($visitors)]);
}

//------------------------------------------------------------
// 管理画面ダッシュボードに訪問者数を表示
//------------------------------------------------------------
add_action('wp_dashboard_setup', function() {
    wp_add_dashboard_widget('daily_visitors_ajax', '今日と昨日の訪問者数(Ajax版)', function() {
        date_default_timezone_set('Asia/Tokyo'); // ← 日本時間固定
        $today = date('Y-m-d');
        $yesterday = date('Y-m-d', strtotime('-1 day'));

        $today_visitors = get_option('daily_visitors_' . $today, []);
        $yesterday_visitors = get_option('daily_visitors_' . $yesterday, []);

        if(!is_array($today_visitors)) $today_visitors = [];
        if(!is_array($yesterday_visitors)) $yesterday_visitors = [];

        echo '<p><strong>今日の訪問者数:</strong> ' . esc_html(count($today_visitors)) . ' 人</p>';
        echo '<p><strong>昨日の訪問者数:</strong> ' . esc_html(count($yesterday_visitors)) . ' 人</p>';
    });
});


 //------------------------------------------------------------
 // 管理画面ダッシュボードに7日間の訪問者数グラフを表示
 //------------------------------------------------------------
add_action('wp_dashboard_setup', function() {
    wp_add_dashboard_widget('weekly_visitors_widget', '過去7日間の訪問者数', function() {
        echo '<canvas id="visitorsChart" width="400" height="200"></canvas>';
        $data = [];
        $labels = [];
        for ($i = 6; $i >= 0; $i--) {
            $date = date('Y-m-d', strtotime("-{$i} days"));
            $label = date('n/j', strtotime($date));
            $visitors = get_option('daily_visitors_'.$date, []);
            $count = is_array($visitors) ? count($visitors) : 0;
            $labels[] = $label;
            $data[] = $count;
        }

        // グラフ用データをJSへ出力
        echo '<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>';
        echo '<script>
        document.addEventListener("DOMContentLoaded", function() {
            const ctx = document.getElementById("visitorsChart");
            new Chart(ctx, {
                type: "bar",
                data: {
                    labels: '.json_encode($labels).',
                    datasets: [{
                        label: "訪問者数",
                        data: '.json_encode($data).',
                        backgroundColor: "#0073aa",
                        borderRadius: 5
                    }]
                },
                options: {
                    plugins: { legend: { display: false } },
                    scales: { y: { beginAtZero: true, ticks: { stepSize: 1 } } }
                }
            });
        });
        </script>';
    }); 
});

3 補足

  • このウィジェットは管理画面専用です。フロントには表示されません。
  • 日付ごとに訪問者をカウントするので、毎日0時00分に自動的に新しい人数が表示されます。
  • より高度な集計やグラフ表示を追加したい場合は、JavaScriptやプラグインと組み合わせると便利です。

4 Javascriptにコードを追加

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


//-------------------------------------------
// ダッシュボードに今日と昨日の訪問者数を表示
//-------------------------------------------
jQuery(function($){
  // ページ読み込み完了後にAjax送信
  $(window).on('load', function(){
    $.post(visitCounterAjax.ajax_url, {
      action: 'record_visit',
      nonce: visitCounterAjax.nonce
    });
  });
});

4.1 ディレクトリ構造

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

5 完成イメージ

今日と昨日の訪問者数

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 除外される

※googlebotを回避しても、SEO対策には影響しません。見た目の件数だけ回避しています。