ダッシュボードに今日の訪問者数(閲覧数)を表示する方法(管理画面ウィジェットのみに表示)
WordPressの管理画面に、今日と昨日の訪問者数を簡単に表示するダッシュボードウィジェットを作成できます。
サイトの閲覧数をカウントする際、Botや管理者アクセスは除外されます。これにより、実際の訪問者数(ユーザー)だけを正確にカウントできます。
1 使い方
- 子テーマの
functions.phpに以下のコードを追加します。 - 管理画面にログインするとダッシュボードに「今日と昨日の訪問者数」が表示されます。
| 比較項目 | この修正版コード | よくある「なんちゃって閲覧数」 |
|---|---|---|
| カウント単位 | 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 | 除外される |
| facebookexternalhit | 除外される | |
| twitterbot | 除外される | |
| CURL / Wget | curl / wget | 除外される |
| Python | python-requests | 除外される |
| 中国系Bot | baiduspider, yandex, petalbot | 除外される |
※googlebotを回避しても、SEO対策には影響しません。見た目の件数だけ回避しています。


