2026年6月26日

2026年6月26日

WordPressのnonce検証エラーでログインできない・ログイン後に操作できない場合の解決策

ログイン時やログイン直後に「リンクの有効期限が切れています」などと表示されて先へ進めない場合、原因の多くは nonce(ワンタイムトークン)の検証失敗です。そして nonce が失敗する理由は、キャッシュに残った古いフォーム、Cookie の不整合、セッションの切り替わりのいずれかであることがほとんどです。この記事では、nonce がどういう条件で無効になるのかを押さえたうえで、症状別に原因を切り分けて直す手順を説明します。

nonce の仕組みを先に知っておく

nonce は、フォーム送信や管理画面の操作が「本人が正規の画面から行ったものか」を確かめるための値です。WordPress の nonce は次の要素から作られます。

  • 操作の種類(アクション名)
  • ユーザーID(ログアウト中は 0)
  • ログインセッションのトークン
  • 時刻を12時間単位で区切った値
  • wp-config.php の認証用キー(ソルト)

初期設定では、発行から最大24時間ほど有効です。ここから、エラーが起きる典型的な条件が読み取れます。

  • 時間が経ちすぎた:開きっぱなしのタブや、長期間キャッシュされたページのフォームは期限切れになる
  • セッションが変わった:ログアウトや再ログインをすると、それ以前に発行された nonce は使えなくなる
  • ユーザーが変わった:ログアウト状態で発行された nonce は、ログイン後には一致しない
  • ソルトが変わった:wp-config.php の認証用キーを再生成すると、発行済みの nonce はすべて無効になる

なお、WordPress 標準の wp-login.php のログインフォーム自体は nonce を使っていません。標準画面でログインに失敗する場合は Cookie 側の問題を、プラグインやテーマが用意したログインフォームで失敗する場合は nonce 側の問題を先に疑うと、切り分けが早くなります。

まず試す基本の対処

どの症状でも、最初に次の順で試してください。多くはここで解決します。

  1. ページを再読み込みしてから送信し直す:古いフォームを使っているだけなら、新しい nonce で送れば通ります。
  2. サイトの Cookie を削除して、ブラウザを開き直す:古いログイン Cookie が残っていると、セッションの整合が取れなくなります。
  3. プライベートウィンドウでログインする:これで通るなら、ブラウザ側の Cookie や拡張機能が原因です。

プライベートウィンドウでも同じエラーになる場合は、サーバー側やサイトの設定に原因があります。以下の症状別の項目に進んでください。

症状1:プラグインのログインフォームで失敗する

WooCommerce のマイアカウントページや会員制プラグインのログインフォームなど、固定ページに置かれたログインフォームは、フォーム内に nonce を埋め込んでいることがあります。このページがページキャッシュやCDNに保存されると、何日も前に発行された nonce が全員に配られ、期限切れでログインが拒否されます。

対処:ログインページをキャッシュ対象から外す

使っているキャッシュプラグインの設定で、ログインフォームのあるページを「キャッシュしないURL」に追加します。WooCommerce の場合、マイアカウント・カート・チェックアウトのページは、主要なキャッシュプラグインが自動で除外することが多いものの、設定や構成によっては除外されていないこともあるため確認が必要です。

テーマやプラグインの改修ができる場合は、該当ページでキャッシュしない指示を出す方法もあります。DONOTCACHEPAGE 定数は多くのキャッシュプラグインが参照する慣習的な定数で、nocache_headers() はブラウザやプロキシにキャッシュしないよう伝えるヘッダーを送るコア関数です。

// 子テーマの functions.php などに追加
add_action( 'template_redirect', function () {
    // 'member-login' はログインフォームを置いた固定ページのスラッグに置き換える
    if ( is_page( 'member-login' ) ) {
        if ( ! defined( 'DONOTCACHEPAGE' ) ) {
            define( 'DONOTCACHEPAGE', true );
        }
        nocache_headers();
    }
} );

サーバー側のキャッシュ(Nginx のキャッシュ機能やCDN)がこれらを参照するかは構成次第です。変更後は、キャッシュを削除してからプライベートウィンドウで確認し、レスポンスヘッダーにキャッシュヒットを示す値が出ていないかも見てください。

症状2:ログインはできるが、管理画面で操作すると拒否される

ログイン直後は管理画面が開けるのに、投稿の保存や設定の変更で「リンクの有効期限が切れています」と出る、ブロックエディターで Cookie の確認に失敗した旨のメッセージが出る、というケースです。

原因になりやすいもの

  • サイトのURLの不一致:「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」で、www の有無や http/https が食い違っていると、Cookie が片方のURLにしか送られず、セッションが不安定になります。
  • **wp-config.php の Cookie 関連の定数**:COOKIE_DOMAIN などを手動で設定している場合、実際のドメインと合っていないと同様の問題が起きます。心当たりがなければ、これらの定数は書かないのが基本です。
  • 管理画面がキャッシュされている:サーバーやCDNの設定で /wp-admin/ までキャッシュしていると、他人のセッション向けの nonce が返されることがあります。管理画面とログイン画面はキャッシュ対象から外します。
  • 複数タブでのログインし直し:別のタブでログアウト・再ログインすると、元のタブの nonce は古いセッションのものになります。元のタブは再読み込みしてください。

URLの設定を変更するとサイトに入れなくなる可能性があるため、変更前にデータベースのバックアップを取ってください。

症状3:ログアウトしようとすると確認画面が出る

ログアウトのリンクにも nonce が含まれています。古いページのログアウトリンクを押すと、ログアウトしてよいかを確認する画面が表示されます。これはエラーではなく安全確認なので、表示されたリンクからログアウトすれば問題ありません。毎回表示される場合は、ログアウトリンクを含むページがキャッシュされていないかを確認します。

原因が絞れないときの切り分け

ここまでで解決しない場合は、プラグインやテーマの影響を確認します。本番サイトで作業する前にバックアップを取り、可能ならステージング環境で試してください。

  1. セキュリティ系・キャッシュ系・ログイン画面を変更するプラグインを1つずつ無効化し、エラーが消えるかを確認する
  2. テーマを一時的に標準テーマに切り替えて確認する
  3. 管理画面に入れない場合は、FTP/SFTP で wp-content/plugins/ 内の該当フォルダ名を一時的に変更して無効化する

wp-config.php の認証用キーを再生成すると、全ユーザーがログアウトされ、発行済みの nonce もすべて無効になります。不正ログインが疑われる場合には有効ですが、nonce エラーの解決策としてむやみに行うものではありません。

開発者向け:独自フォームで nonce を扱うときの注意

自作のフォームで nonce エラーが出る場合は、作成と検証のアクション名が一致しているかをまず確認します。wp_nonce_field() で埋め込み、受け取り側で wp_verify_nonce() または check_admin_referer() で検証するのが基本です。

// 検証側の例:アクション名は wp_nonce_field() と同じ文字列にする
$nonce = isset( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '';
$result = wp_verify_nonce( $nonce, 'member_profile_update' );
// 戻り値:1 = 前半12時間以内に発行、2 = 12〜24時間前に発行、false = 無効
if ( false === $result ) {
    wp_die( esc_html__( 'Invalid request.', 'your-textdomain' ), 403 );
}

nonce_life フィルターで有効期間を延ばすことはできますが、キャッシュ問題を期間延長で隠すことになり、安全性も下がります。キャッシュの除外で解決するのが筋です。また、nonce は権限チェックの代わりにはならないため、current_user_can() による確認も併用してください。

キャッシュプラグインやCDNの管理画面の項目名は製品やバージョンで異なるため、具体的な設定場所は各製品の説明で確認してください(2026年10月現在)。

まとめ

  • nonce は時間・ユーザー・ログインセッション・ソルトに結びついており、どれかが変わると無効になる
  • まずは再読み込み、Cookie 削除、プライベートウィンドウでの確認から試す
  • プラグインのログインフォームで失敗するなら、ログインページがキャッシュされていないかを確認して除外する
  • ログイン後の操作で拒否されるなら、サイトURLの不一致、Cookie 関連の定数、管理画面のキャッシュを疑う
  • 独自フォームではアクション名の一致と権限チェックを確認し、有効期間の延長で問題を隠さない

お気軽にご相談ください

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