WordPressサイトヘルスの「重大な問題」の意味と対処法

実測 に検証

管理画面の ツール > サイトヘルス に「重大な問題」が出ている。 でもサイトは普通に動いている。直すべきなのか、放っていいのか分からない。

サイトヘルスの項目には、環境によって必ず赤くなるものがあります。 各検査が実際に何を見ているかを、1 つずつ壊して確かめました。

検査は 2 種類ある

WordPress の検査は 26 項目あり、動き方が 2 つに分かれます。

種類件数動き方
direct21PHP の中で直接判定する
async5サイト自身に HTTP リクエストを投げて判定する

async の 5 つは、実際にこの URL を叩いています。

/wp-json/wp-site-health/v1/tests/dotorg-communication
/wp-json/wp-site-health/v1/tests/background-updates
/wp-json/wp-site-health/v1/tests/loopback-requests
/wp-json/wp-site-health/v1/tests/https-status
/wp-json/wp-site-health/v1/tests/authorization-header

ここが偽陽性の最大の原因です。サイト自身への通信(ループバック)が 通らない環境では、中身が正常でも 5 つ全部が失敗します。

実測: 正常なサイトでも critical が 2 件出た

検証環境(サイトは正常に動作、REST API も外から見れば 200 で正常な JSON を返す)で 検査を走らせた結果です。

rest_availability    [critical]   REST API でエラーが発生しました
loopback_requests    [critical]   サイトでループバックリクエストが完了できませんでした

しかし外から REST API を叩くと正常です。

$ curl -s -o /dev/null -D - http://localhost:8080/wp-json/ | grep -iE '^HTTP|^content-type'
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8

REST API でエラーが発生しました / サイトでループバックリクエストが完了できませんでした

同じ環境をブラウザで開いた画面(2026-09-16 撮影)。このときは「バックグラウンド更新が想定通りに動作していません」を含む 3 件が並んだ。バックグラウンド更新も async の検査で、ループバックが通らないと失敗する 5 つのうちの 1 つ

「REST API でエラーが発生しました」は、REST API が壊れていることを 意味しません。サイト自身から自分の URL に到達できないだけです。

ループバックが通らない実際の原因

原因説明
Basic 認証をかけているステージング環境で頻発。自分へのリクエストも 401 で弾かれる
ファイアウォールが自ホストへの接続を遮断セキュリティ設定の副作用
サイト URL が CDN やロードバランサ経由サーバーから自分の外向き URL に戻れない
DNS がサーバー内から解決できないhosts の設定漏れ
コンテナ環境でホスト名が解決できない検証環境で起きたのはこれ

この状態では予約投稿も自動更新も止まります。 サイトヘルスの警告は無視できませんが、「REST が壊れている」と読むのは誤りです。予約投稿されない

見分け方

# 外から REST を叩く
curl -s -o /dev/null -D - https://example.com/wp-json/ | grep -i content-type
結果判断
application/json が返るREST は正常。サイトヘルスが赤いのはループバックの問題
text/html が返るREST が本当に壊れている(遮断か Fatal)

後者なら記事の内容が変わります。 → 「返答が正しい JSON レスポンスではありません」

実測: 全 21 項目の判定

同じ環境での direct 検査の結果です。赤や黄色が並ぶのが普通の状態だと 分かります。

項目判定意味
wordpress_versiongood本体が最新か
plugin_version / theme_versionrecommended停止中のものを削除しろと言っている
php_versionrecommendedPHP のバージョン
php_extensionsgood必須・推奨モジュール
php_default_timezonegoodタイムゾーン設定
php_sessionsgoodセッションの使用
sql_serverrecommendedデータベースのバージョン(MySQL 5.7 は古い扱い)
ssl_supportgood外部と安全に通信できるか
scheduled_eventsrecommended予約イベントの実行に失敗
http_requestsgood外向き通信が許可されているか
rest_availabilitycritical内部リクエストで判定(偽陽性になりうる)
debug_enabledrecommended訪問者にエラーを表示する設定になっている
file_uploadsgoodアップロードの可否
plugin_theme_auto_updatesgood自動更新の設定
update_temp_backup_writablegood更新用の一時領域
available_updates_disk_spacegoodディスク空き
autoloaded_optionsgoodautoload のサイズ(後述)
insecure_registrationgood誰でも権限付きで登録できる状態か
search_engine_visibilityrecommended検索エンジンにインデックスさせない設定
opcode_cacherecommendedオペコードキャッシュ

放ってはいけないもの

項目理由
debug_enabled(訪問者へのエラー表示)エラーがそのまま見える。しかも障害時のステータスが 500 でなく 200 になるので監視に引っかからなくなる
scheduled_events(予約イベントの失敗)予約投稿・自動更新・バックアップが全部止まっている
search_engine_visibility公開サイトなら致命的。検索結果に出ない
insecure_registration誰でも管理者になれる状態なら即対応

debug_enabled の実害は別記事で実測しています。 → サイトが死んでいるのに監視は 200 を返す

優先度が低いもの

項目理由
plugin_version / theme_version(停止中を削除)削除は望ましいが、表示にも速度にも影響しない。停止中のプラグインは読み込まれない
php_version / sql_server上げるべきだが、上げると壊れる可能性がある。準備してから
opcode_cache測り方によって偽陽性になる(後述)

autoload のサイズは WordPress 自身が見ている

autoloaded_options は、起動時に読み込まれるオプションの合計サイズを 検査します。しきい値を実測で挟み込みました。

合計サイズ件数判定
42 KB127good
530 KB128good
921 KB129critical

約 800 KB が境目です。critical のときのメッセージには 実際の数値が入ります。

このサイトには options テーブル内に 139 個の自動読み込みオプション
(サイズ: 11 MB) があります。

これは実際に速度とメモリに効きます。別記事で測った値です。

autoloadクエリ時間ピークメモリ
42 KB0.7 ms28 MB
12 MB15.1 ms52 MB

WordPress が重い

この項目が critical なら、実害があるので対応します。

偽陽性になる項目

コマンドラインから検査を走らせた場合

WP-CLI から検査を実行すると、Web とは別の環境で判定されるため 結果がずれます。実測した例です。

結果
サイトヘルスの opcode_cacherecommended「オペコードキャッシュが有効化されていません」
Web(fpm)側の実際の状態opcache.enable=1 / 実際に有効=はい

Web では有効なのに、コマンドラインからは無効と判定されました。 オペコードキャッシュはコマンドライン実行では既定で働かないためです。

同じ理由で、タイムゾーン、メモリ上限、アップロードサイズなども コマンドラインと Web で違う値になります。

サイトヘルスはブラウザから見るのが正しい、ということになります。

HTTPS を使っていない環境

https_status は async なので、ループバックが通らないと判定できません。 また HTTP のみの検証環境では当然 recommended になります。

「情報」タブのほうが役に立つ

「ステータス」タブより、「情報」タブが実務では有用です。 ここには判定ではなく生の値が並びます。

見たい値場所
PHP のバージョン、memory_limitmax_input_varsサーバー
PHP のエラーログの場所サーバー
アップロードの最大サイズメディア処理
データベースのバージョンと文字セットデータベース
有効なプラグインとバージョン一覧プラグイン
定数の設定(WP_DEBUG など)WordPress の定数

max_input_vars と PHP のエラーログの場所は、ここで確認するのが最短です。 どちらも障害調査で必要になり、他の場所からは探しにくい値です。 → 保存したのに一部だけ消えるログはどこにあり、何を見るのか

まとめ: 読む順番

  1. critical を見る。ただし rest_availabilityloopback_requests は 外から REST を叩いて確認する(偽陽性の可能性)
  2. autoloaded_options が critical なら実害あり。対応する
  3. debug_enabled が出ていたら本番設定を直す
  4. search_engine_visibility が出ていたら公開サイトかどうか確認する
  5. scheduled_events が出ていたらループバックを疑う
  6. plugin_version / php_version は「いつかやる」に分類してよい

「重大な問題」という表示は、必ずしも「今すぐ直す」を意味しません。 逆に recommended(debug_enabled)のほうが実害が大きいことがあります。

再現手順

# ブラウザを使わずに検査を走らせる(ただし CLI 実行は一部偽陽性になる)
wp eval '
require_once ABSPATH . "wp-admin/includes/class-wp-site-health.php";
$h = WP_Site_Health::get_instance();
foreach ( WP_Site_Health::get_tests()["direct"] as $key => $t ) {
  $m = "get_test_" . $t["test"];
  if ( ! is_string( $t["test"] ) || ! method_exists( $h, $m ) ) continue;
  $r = $h->$m();
  printf( "%-26s [%s] %s
", $key, $r["status"], wp_strip_all_tags( $r["label"] ) );
}'

# REST が本当に壊れているか(サイトヘルスとは別に確認する)
curl -s -o /dev/null -D - https://example.com/wp-json/ | grep -i content-type