2026年5月20日

2026年5月20日

WordPressのnonceエラーを解決する方法【セキュリティトークン期限切れ】

はじめに

「申し訳ありませんが、このページへのアクセスは許可されていません」——WordPressのnonce(ワンス)は不正リクエストを防ぐセキュリティトークンです。このトークンの期限切れ・キャッシュ問題・サーバー間の時刻ずれが原因でエラーになることがあります。

nonceエラーが発生する主な状況

  • フォームを送信したら「アクセスが許可されていません」になる
  • 管理画面の操作(プラグイン有効化・設定保存)でエラーになる
  • キャッシュプラグインが古いページをキャッシュしていてnonceが期限切れ
  • ページを長時間(デフォルト24時間)開いたままフォームを送信した

nonceとは何か

// nonceの生成
$nonce = wp_create_nonce('my-action');

// nonceの検証(失敗するとwp_die()が呼ばれる)
check_admin_referer('my-action');

// またはAJAX用
check_ajax_referer('my-action', 'nonce');

WordPressのnonceはデフォルトで12〜24時間有効です。期限切れのnonceを使うとエラーになります。

解決手順

ステップ1:ページをリロードする

最も単純な解決策です。ページを再読み込みすると新しいnonceが発行されます。ブラウザの「戻る」ボタンで前のページに戻り、再度操作してください。

ステップ2:キャッシュをクリアする

キャッシュプラグインのキャッシュをすべてクリア:
- W3 Total Cache → 「全キャッシュを空にする」
- WP Super Cache → 「キャッシュを削除」
- LiteSpeed Cache → 「すべてパージ」

ステップ3:nonceの有効期限を延長する

// functions.phpに追加(デフォルト86400秒=24時間を延長)
add_filter('nonce_life', function() {
    return 48 * HOUR_IN_SECONDS;  // 48時間に延長
});

ステップ4:サーバーの時刻を確認する

# サーバーの現在時刻を確認
date

# タイムゾーンを確認
timedatectl

# NTPで時刻を同期
sudo ntpdate pool.ntp.org
# または
sudo systemctl restart systemd-timesyncd

サーバーの時刻がずれているとnonceの検証に失敗します。

ステップ5:キャッシュプラグインでnonceを含むページをキャッシュ除外

// functions.phpに追加(ログイン済みユーザーのページをキャッシュしない)
// ほとんどのキャッシュプラグインはデフォルトでこれを行っている

// W3 Total Cache のキャッシュをプログラムでクリア
if (function_exists('w3tc_flush_all')) {
    w3tc_flush_all();
}

ステップ6:nonceエラーをカスタムハンドリングする

// 独自のnonceエラーハンドリング(上級者向け)
add_action('wp_ajax_nopriv_my_action', function() {
    if (!check_ajax_referer('my-nonce', 'nonce', false)) {
        wp_send_json_error(['message' => 'セッションが切れました。ページを更新してください。']);
    }
    // 正常処理...
});

まとめ

nonceエラーは多くの場合、ページのリロードまたはキャッシュのクリアで解決します。繰り返し発生する場合はキャッシュプラグインの設定を見直し、フォームを含むページをキャッシュ対象から除外するか、nonceの有効期限を延長してください。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ