ショートコードでサイト全体での閲覧数を表示する方法(時間制限可能)
目次
この記事では、WordPressサイト全体の閲覧数(時間制限可能)を表示する方法を解説します。
WordPressサイト全体の閲覧数を、時間ごとのユニークIPカウントで表示する方法をご紹介します。これにより、指定した時間内に同じIPからの複数アクセスは1回だけカウントされます。
サイトの閲覧数をカウントする際、Botや管理者アクセスは除外されます。これにより、実際の訪問者数(ユーザー)だけを正確にカウントできます。
- $limit_seconds = 86400; // 24時間
- あるIPが 23:00 にアクセス → カウント
- 翌日の 01:00 に同じIPがアクセス → まだ24時間経っていないのでカウントされない
- 翌日の 23:00 に同じIPがアクセス → 24時間経過したので1件カウントされる
- 日別ユニークIPの正確な件数(0時リセット)とズレが生じる。
1 実装のポイント
- 同一IPでのカウントを時間制限
- ショートコード [site_total_views] でどこでも表示可能
- Ajax による非同期更新も可能(※JavaScript を無効にすれば通常のショートコード表示のみ)
2 functions.php にコードを追加
// -------------------------------------------------
// サイト全体の閲覧数を更新(IPごと時間制限付きカウント)
// -------------------------------------------------
function increment_site_view_count() {
// --- タイムゾーンを日本時間に設定 ---
date_default_timezone_set('Asia/Tokyo');
$user_ip = $_SERVER['REMOTE_ADDR'];
$user_agent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
$limit_seconds = 86400; // 24時間。制限時間(秒)ここを数字で自由に設定
// ▼ Bot判定キーワード(必要に応じて追加可能)
$bot_keywords = [
'bot', 'crawl', 'spider', 'slurp', 'bingpreview',
'mediapartners-google', 'facebookexternalhit',
'python-requests', 'curl', 'wget', 'feedfetcher',
'twitterbot', 'yandex', 'petalbot', 'baiduspider'
];
// ▼ Botならカウントしない
foreach ($bot_keywords as $bot_keyword) {
if (strpos($user_agent, $bot_keyword) !== false) {
return; // botアクセス → カウントせず終了
}
}
// 保存されたIPリストを取得(形式: array( 'IP' => タイムスタンプ ))
$counted_ips = get_option('site_total_views_ips', array());
$now = time();
// IPが記録されている場合
if (isset($counted_ips[$user_ip])) {
$last_time = intval($counted_ips[$user_ip]);
// 制限時間以内ならカウントしない
if (($now - $last_time) < $limit_seconds) {
return;
}
}
// カウント更新
$total = get_option('site_total_views', 0);
update_option('site_total_views', $total + 1);
// IPと現在時刻を保存
$counted_ips[$user_ip] = $now;
update_option('site_total_views_ips', $counted_ips);
}
add_action('template_redirect', 'increment_site_view_count');
/** サイト全体の閲覧数を取得 */
function get_site_total_views() {
return intval(get_option('site_total_views', 0));
}
/** ショートコードで表示 */
function site_total_views_shortcode() {
return '' . get_site_total_views() . '';
}
/** Ajax用スクリプトを読み込み */
function enqueue_site_total_views_script() {
wp_enqueue_script(
'site-total-views-ajax',
get_stylesheet_directory_uri() . '/js/site-total-views.js',
array('jquery'),
'1.0',
true
);
wp_localize_script('site-total-views-ajax', 'siteTotalViewsData', array(
'ajax_url' => admin_url('admin-ajax.php')
));
}
add_action('wp_enqueue_scripts', 'enqueue_site_total_views_script');
add_action('wp_ajax_get_site_total_views', 'ajax_get_site_total_views');
add_action('wp_ajax_nopriv_get_site_total_views', 'ajax_get_site_total_views');
function ajax_get_site_total_views() {
wp_send_json_success(array(
'total' => get_site_total_views()
));
}
add_shortcode('site_total_views', 'site_total_views_shortcode');
補足:
- ショートコード [site_total_views]をサイドバーや記事内に挿入すると、サイト全体の閲覧数を表示できます。「本日までの閲覧数[site_total_views]人」と貼り付けると分かりやすいです。
- 同一IPアドレスでカウントの時間制限は、
$limit_seconds = 86400に秒で自由に設定できます。
・24時間の場合は24時間×60分×60秒=86400秒なので86400と入力。
・6時間の場合は6時間×60分×60秒=21600秒なので21600と入力。
・60分の場合は、60分×60秒=3600秒なので、3600と入力。
3 完成イメージ

4 JavaScript にコードを追加(任意、非同期更新用)
ファイル名:site-total-views.js
保存先:wp-content/themes/child-theme/js/site-total-views.js
document.addEventListener('DOMContentLoaded', function() {
const el = document.querySelector('.site-total-views');
if (!el || !siteTotalViewsData) return;
fetch(siteTotalViewsData.ajax_url, {
method: 'POST',
headers: {'Content-Type':'application/x-www-form-urlencoded'},
body: 'action=get_site_total_views'
})
.then(response => response.json())
.then(data => {
if (data.success) {
el.textContent = data.data.total;
}
});
});
4.1 ディレクトリ構造
- child-theme/
- style.css
- functions.php
- footer.php
- header.php
- js/
- site-total-views.js
- images/
- logo.png
5 汎用CSS
/* -----------------------------
* サイト全体の閲覧数表示
* ----------------------------- */
/* 閲覧数全体を囲むボックス */
.site-total-views {
display: inline-block; /* インライン要素として表示、幅は内容に合わせる */
padding: 2px 8px; /* 上下2px、左右8pxの内側余白 */
background-color: #f0f0f0; /* 薄いグレーの背景色 */
border-radius: 4px; /* 角を丸くする */
font-size: 0.9em; /* 文字サイズを少し小さめに設定 */
color: #333; /* 文字色をダークグレー */
}
3 完成イメージ
本日までの閲覧者数4547人
7 まとめ
- サイト全体のユニークIPごとの閲覧数をカウント
- 投稿ごとの post_meta は使用しない
- Ajax を利用すれば非同期で最新値を表示可能
8 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対策には影響しません。見た目の件数だけ回避しています。


