2026年5月20日
2026年5月20日
WordPressのAJAX処理が遅い場合の解決方法【admin-ajax.php高速化】
はじめに
WordPressのAJAX処理はwp-admin/admin-ajax.phpを経由します。このファイルへのリクエストが多すぎる場合、WordPressのコアを毎回フルで読み込むため、サーバー負荷が高くなります。特にページビューが多いサイトや複数のプラグインがAJAXを多用する場合に問題になります。
症状の確認
# サーバーのアクセスログでadmin-ajax.phpへのリクエストを確認
grep 'admin-ajax.php' /var/log/nginx/access.log | wc -l
# リクエスト内容を確認
grep 'admin-ajax.php' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn
Query Monitorプラグインで「HTTP API Calls」を確認することでもAJAXリクエスト数を把握できます。
主な原因
- WooCommerce:カートの更新・在庫チェックなど頻繁なAJAXリクエスト
- Contact Form 7:フォームのバリデーション
- ハートビートAPI:管理画面の自動保存
- 不要なプラグイン:不要なAJAXポーリング処理
解決手順
ステップ1:REST APIに移行する(根本解決)
WordPress 4.7以降はREST APIが推奨されます。REST APIはよりキャッシュしやすく効率的です:
// 旧来のAJAXハンドラ(admin-ajax.php経由)
add_action('wp_ajax_my_action', 'my_ajax_handler');
add_action('wp_ajax_nopriv_my_action', 'my_ajax_handler');
// ↓ REST APIに移行
add_action('rest_api_init', function() {
register_rest_route('myplugin/v1', '/data', [
'methods' => 'GET',
'callback' => 'my_rest_handler',
'permission_callback' => '__return_true',
]);
});
ステップ2:不要なAJAXハンドラを削除
// functions.phpに追加
// 不要なプラグインのAJAXアクションを無効化
add_action('init', function() {
remove_action('wp_ajax_nopriv_heartbeat', 'wp_ajax_nopriv_heartbeat');
}, 1);
ステップ3:admin-ajax.phpをキャッシュする(Nginx)
# Nginx設定(一部のAJAXレスポンスをキャッシュ)
location = /wp-admin/admin-ajax.php {
# ログインしていないユーザーのGETリクエストのみキャッシュ
if ($request_method = POST) {
proxy_no_cache 1;
}
# キャッシュ設定...
}
ステップ4:WP-CronのAJAXを分離
// wp-config.phpでWP-CronのAJAXリクエストを削減
define('DISABLE_WP_CRON', true);
// → サーバーCronに移行することでCron経由のadmin-ajax.phpリクエストを削減
ステップ5:Object Cacheでデータベースクエリを削減
// wp-config.phpに追加(Redis使用の場合)
define('WP_CACHE', true);
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
Redisオブジェクトキャッシュで繰り返しのDBクエリをキャッシュしてAJAX処理を高速化します。
まとめ
admin-ajax.phpの負荷軽減は①REST APIへの移行(新規開発)→②不要なAJAXハンドラの無効化→③WP-Cronのサーバー移行→④Redisオブジェクトキャッシュの導入の順で対処します。WooCommerceサイトではWooCommerce専用のキャッシュプラグインも有効です。
関連記事: