2026年5月20日

2026年5月20日

WordPressのログインで「Cookieがブロックされている」エラーが出るときの原因と直し方

WordPress のログイン画面で、正しいユーザー名とパスワードを入れたのに「Cookie がブロックされている」というエラーが出てログインできないことがあります。このエラーは、WordPress がログインに使う Cookie をブラウザーとやり取りできなかったときに表示されます。ブラウザーの設定より、サイト側の設定(https の混在、COOKIE_DOMAIN、余計な出力、キャッシュ)が原因になっていることが多いエラーです。

この記事の内容は WordPress 6.9 のソースコードと、テスト環境での再現で確認しています(2026年10月時点)。

エラーは2種類ある

日本語の管理画面では、次のどちらかが表示されます。どちらが出ているかで、調べる場所が変わります。

表示される文言(冒頭) 意味 主な原因
Cookie がブロックされているか、お使いのブラウザーで未対応のようです ログイン画面を開いたときに渡したテスト用の Cookie が、ログイン送信時に戻ってこなかった http と https の混在、COOKIE_DOMAIN の誤り、ログイン画面のキャッシュ、ブラウザーの設定
予期しない出力により Cookie がブロックされました Cookie を送る前に、PHP が画面に何かを出力してしまった ファイル先頭の BOM や空白、表示された PHP の警告

エラーが出る仕組み

wp-login.php を開くと、WordPress は wordpress_test_cookie という名前のテスト用 Cookie をブラウザーに渡します。ユーザー名とパスワードを送信したとき、この Cookie がリクエストに含まれていなければ、「ブロックされているか、未対応」のエラーになります。

Cookie はレスポンスのヘッダーで送られるため、その前に HTML や空白が1文字でも出力されると、PHP は Cookie を送れません。この場合は「予期しない出力」のエラーになります。

手順1: ブラウザー側を切り分ける

まず、サイト側の問題かどうかを確かめます。

  1. シークレットウィンドウや別のブラウザーでログインしてみる
  2. サイトを移転した後や URL を変えた後なら、そのサイトの Cookie を削除してから試す
  3. ブラウザーの設定で、そのサイトの Cookie をブロックしていないか確認する

どのブラウザーでも同じエラーが出るなら、サイト側に原因があります。手順2以降に進みます。

手順2: ログイン画面のヘッダーを確かめる

サーバーにログインできる環境か手元のパソコンで、curl を使ってログイン画面のレスポンスヘッダーを見ます。

curl -sI https://example.com/wp-login.php

正常なら、次のような Set-Cookie の行があります(https のサイトでは secure も付きます)。

Set-Cookie: wordpress_test_cookie=WP%20Cookie%20check; path=/; secure; HttpOnly

結果の見方は次のとおりです。

見えたもの 考えられる原因 進む手順
Set-Cookie の行がない ログイン画面がキャッシュから返されている 手順5
domain= が付いていて、アクセスしたホスト名と合わない COOKIE_DOMAIN の誤り 手順4
secure が付いているのに、http の URL でアクセスしている http と https の混在 手順3
ヘッダーは正常 ブラウザーやプラグインの影響、または予期しない出力 手順1、手順6、手順7

手順3: http と https を統一する

https のサイトでは、テスト用の Cookie に secure が付きます。secure 付きの Cookie は、ブラウザーが http の接続では受け取りません。そのため、http:// の URL でログイン画面を開くと、Cookie が保存されずにエラーになります。

WordPress に登録されている URL を確認します。

wp option get siteurl
wp option get home

2つが https:// で、ホスト名(www の有無を含む)がそろっているかを確かめます。違っていれば、正しい URL に直します。

wp option update siteurl 'https://example.com'
wp option update home 'https://example.com'

WP-CLI が使えない場合は、「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」で確認できます。あわせて、サーバーやレンタルサーバーの設定で、http へのアクセスを https に転送しておきます。

手順4: wp-config.php の Cookie の定義を見直す

wp-config.php に Cookie 関連の定数を書いていないか確かめます。

grep -n "COOKIE" wp-config.php

1つのサイトだけを動かしている場合、COOKIE_DOMAIN・COOKIEPATH・SITECOOKIEPATH・ADMIN_COOKIE_PATH を定義する必要はありません。 定義しなければ、WordPress は COOKIE_DOMAIN を空にし、パスは「設定」→「一般」の URL から決めます。

よくある誤りは次のとおりです。

  • COOKIE_DOMAIN にアクセスしているホスト名と違う値を入れている: たとえば www.example.com を指定したのに example.com でアクセスすると、ブラウザーはその Cookie を受け取りません。不要なら定義を削除します
  • 同じ定数を2回定義している: PHP 8 では「Constant COOKIE_DOMAIN already defined」という警告になります。警告が画面に表示される設定だと、それが「予期しない出力」になり、手順6のエラーにつながります。片方を削除します
  • ADMIN_COOKIE_PATH を / にしている: 本来は wp-admin のパスになる値です。理由がなければ定義を削除します
  • wp-config.php の中で LOGGED_IN_COOKIE などの Cookie 名の定数を参照している: これらは wp-config.php を読み込んだ後に WordPress が定義する定数なので、wp-config.php の中ではまだ存在せず、PHP 8 では Error で止まります

マルチサイトで独自ドメインのサイトにログインできない場合

マルチサイトで、サブサイトに独自ドメインを割り当てていて Cookie のエラーが出る場合は、WordPress の公式ドキュメント(Advanced Administration Handbook のドメインマッピングの項)が、ネットワーク用の設定の後に次の1行を加える方法を案内しています。

<?php
define( 'COOKIE_DOMAIN', $_SERVER['HTTP_HOST'] );

この行は、ほかに COOKIE_DOMAIN の定義がない状態で1回だけ書きます。1つのサイトだけの環境には加えません。

手順5: ログイン画面をキャッシュから外す

ページキャッシュのプラグイン、サーバーのキャッシュ機能、CDN が wp-login.php をキャッシュしていると、保存済みの HTML だけが返され、テスト用の Cookie を渡す Set-Cookie が付きません。手順2の結果で Set-Cookie がない場合は、キャッシュの設定で wp-login.php と /wp-admin/ をキャッシュの対象から外し、キャッシュを削除します。

CDN を使っている場合は、curl -sI の結果にキャッシュの状態を示すヘッダー(Cloudflare なら cf-cache-status)が出ます。ログイン画面で HIT になっていれば、CDN のキャッシュルールを見直します。

手順6: 「予期しない出力」の原因を探す

「予期しない出力により Cookie がブロックされました」のときは、ヘッダーより前に何かが出力されています。よくある原因は次の3つです。

  • wp-config.php、テーマの functions.php、プラグインのファイルの先頭に BOM(文字コードの印)や空白・改行がある
  • ファイル末尾の ?> の後ろに空白や改行がある
  • PHP の警告や注意が画面に表示されている

BOM があるファイルは、サーバーで次のコマンドを実行すると一覧にできます(WordPress のフォルダーで実行)。

grep -rl $'^\xEF\xBB\xBF' --include='*.php' wp-config.php wp-content/

見つかったファイルは、エディターで「BOM なしの UTF-8」で保存し直します。

どのファイルが出力しているかは、デバッグログでわかります。wp-config.php の「編集が必要なのはここまでです」の行より上に、次の3行を加えます(同じ定数がすでにあれば、そちらの値を変えます)。

<?php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

ログインを試した後、wp-content/debug.log に次のような行が残ります。output started at の後ろが、出力を始めたファイルと行番号です。

PHP Warning:  Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/mu-plugins/example.php:1) in /var/www/html/wp-login.php on line 531

原因を直したら、3行を削除するか WP_DEBUG を false に戻し、debug.log も削除します。debug.log は外から見える場所にあるため、残したままにしないでください。

なお、PHP の output_buffering が有効なサーバーでは、少量の出力ならエラーにならないことがあります。サーバーを移した途端にこのエラーが出始めた場合は、もともとあった BOM や空白が表に出た可能性があります。

手順7: プラグインの影響を確かめる

セキュリティ系やログイン画面を変えるプラグインが、Cookie やリダイレクトに影響していることがあります。有効なプラグインを記録してから、いったんすべて無効にして確かめます。

wp plugin list --status=active --field=name > active-plugins.txt
wp plugin deactivate --all

ログインできるようになったら、記録したプラグインを1つずつ有効に戻して、原因を特定します。次の例の akismet の部分を、active-plugins.txt に書かれたスラッグに替えて実行します。

wp plugin activate akismet

すべて戻すときは、wp plugin activate $(cat active-plugins.txt) で元の状態に戻せます。WP-CLI が使えない場合は、FTP などで wp-content/plugins のフォルダー名を一時的に変えると、すべてのプラグインが無効になります。

エラーは出ないがログイン画面に戻される場合

エラーは表示されず、ログインしても管理画面に入れずにログイン画面へ戻される、またはリダイレクトが繰り返される場合は、別の原因が考えられます。ロードバランサーや CDN が https を受けて、WordPress には http で転送している構成では、WordPress が https の接続だと判断できません。公式ドキュメントの HTTPS の項では、この構成でリダイレクトが繰り返される場合の対処として、wp-config.php で転送元の情報から https を判定する方法が案内されています。

<?php
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && false !== strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) ) {
	$_SERVER['HTTPS'] = 'on';
}

X-Forwarded-Proto ヘッダーを付けるのはプロキシ側なので、プロキシがこのヘッダーを送っていることを確かめてから使います。

まとめ

  • 「ブロックされているか、未対応」はテスト用 Cookie が戻らない、「予期しない出力」は Cookie の前に出力がある、という違いがある
  • curl -sI でログイン画面の Set-Cookie を見ると、原因の見当がつく
  • siteurl と home を https とホスト名でそろえ、http から https へ転送する
  • 1つのサイトだけなら COOKIE_DOMAIN などの定義は不要。二重定義や wp-config.php 内での LOGGED_IN_COOKIE の参照は削除する
  • ログイン画面はキャッシュの対象から外す
  • 「予期しない出力」は BOM・空白・表示された警告を、debug.log の output started at で探す

お気軽にご相談ください

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