2026年5月20日
2026年5月20日
localhost の WordPress にログインできない(wp-login.php でループ・Cookie エラー)ときの直し方
localhost の WordPress でログインできないときは、多くの場合、ブラウザーで開いている URL と WordPress に保存されているサイトの URL が一致していないか、ログイン用の Cookie が保存されていません。この記事では、画面に出る症状から原因を絞り込み、wp-config.php と WP-CLI で直す手順を説明します。内容は 2026年11月時点の WordPress 6.9 と WP-CLI 2.12 で確認しています。
まず症状を確かめる
| 症状 | 主な原因 | 見る節 |
|---|---|---|
| 正しいパスワードを入れても、ログイン画面に戻される | サイトの URL と開いている URL が違う、Cookie の設定 | 1・2 |
| 「Cookie がブロックされているか、お使いのブラウザーで未対応のようです」と出る | COOKIE_DOMAIN の設定、URL の違い |
2 |
| 「予期しない出力により Cookie がブロックされました」と出る | PHP の警告や余分な文字が画面に出力されている | 3 |
| ログイン画面を開くと本番のサイトに移動する | 本番のデータベースを複製したまま | 4 |
https://localhost に移動して開けない |
HTTPS の設定が本番のまま | 5 |
| 「パスワードが間違っています」と出る | 本番のパスワード、またはパスワードが分からない | 6 |
1. サイトの URL を開いている URL に合わせる
WordPress は、データベースの siteurl(WordPress アドレス)と home(サイトアドレス)を基準に、ログイン後の移動先と Cookie を扱います。ブラウザーで http://localhost:8080 を開いているのに、保存されている URL が http://localhost(ポートなし)や http://127.0.0.1:8080 だと、ログインした後に別のアドレスへ移動し、ログインしていない状態に戻ります。
保存されている値は WP-CLI で確認できます。
wp option get siteurl
wp option get home
違っていれば、ブラウザーで開いている URL に合わせて書き換えます。末尾に / は付けません。
wp option update siteurl 'http://localhost:8080'
wp option update home 'http://localhost:8080'
WP-CLI が使えない場合は、wp-config.php に次の2行を書くと、データベースの値より優先されます(「編集が必要なのはここまでです」の行より上に書きます)。
<?php
define( 'WP_HOME', 'http://localhost:8080' );
define( 'WP_SITEURL', 'http://localhost:8080' );
localhost と 127.0.0.1 は、Cookie の上では別のサイトとして扱われます。どちらか一方に決めて、ブラウザーのブックマークもそれに合わせてください。
2. Cookie のエラーが出るとき
WordPress はログイン画面を開いたときに確認用の Cookie(wordpress_test_cookie)を保存し、ログインの送信時にそれが返ってくるかを確かめます。返ってこないと、Cookie がブロックされているという趣旨のエラーになります。
確認すること:
wp-config.phpにCOOKIE_DOMAINが書かれていないか。本番の設定を複製してdefine( 'COOKIE_DOMAIN', 'example.com' );などが残っていると、ブラウザーは localhost でその Cookie を受け付けません。ローカルでは、この行を削除します(書かなければ、開いているホスト名だけで有効な Cookie になります)COOKIEPATH・SITECOOKIEPATH・ADMIN_COOKIE_PATHも、本番の設定が残っていれば削除します- 1 の URL が一致しているか
- ブラウザーの設定や拡張機能で、localhost の Cookie をブロックしていないか。古い Cookie が残っている場合は、localhost のサイトデータを削除してから試します
ローカルで COOKIE_DOMAIN を localhost に設定する必要はありません。
3. 「予期しない出力により Cookie がブロックされました」と出るとき
Cookie はページの本文より先に送る必要があります。その前に PHP の警告や空白などが出力されると、Cookie を送れずにこのエラーになります。
よくある原因:
wp-config.phpでWP_DEBUG_DISPLAYを有効にしていて、プラグインやテーマの警告(Warning・Deprecated)が画面に表示されているwp-config.phpやfunctions.phpの先頭に、BOM 付きの文字コードで保存された文字や、<?phpより前の空白・空行がある- ファイルの最後の
?>の後ろに空行がある
まず、警告を画面ではなくログに出すように変えます。
<?php
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true ); // wp-content/debug.log に記録する
define( 'WP_DEBUG_DISPLAY', false ); // 画面には表示しない
@ini_set( 'display_errors', 0 );
これでログインできたら、wp-content/debug.log を見て、警告を出しているプラグインやテーマを確認します。エディターで保存するときは「UTF-8(BOM なし)」を選びます。
4. 本番のデータベースを複製した後
本番のデータベースを取り込んだ直後は、siteurl と home が本番の URL のままなので、ログイン画面やログイン後の移動先が本番になります。URL を WP-CLI でまとめて置き換えます。
# 置き換わる件数を先に確認する
wp search-replace 'https://example.com' 'http://localhost:8080' --skip-columns=guid --dry-run
# 問題がなければ実行する
wp search-replace 'https://example.com' 'http://localhost:8080' --skip-columns=guid
# オブジェクトキャッシュを使っている場合は消す
wp cache flush
wp search-replace は、シリアライズされたデータの文字数も合わせて書き換えます。SQL の REPLACE で置き換えると、設定が壊れることがあります。
本番で、ログイン URL を変えるセキュリティプラグインや、2段階認証、IP アドレスでログインを制限するプラグインを使っている場合は、ローカルでもその設定が効いています。いったんプラグインを無効にして確かめます。
wp plugin list --status=active
wp plugin deactivate プラグイン名
WP-CLI が使えない場合は、wp-content/plugins/ の中の該当するフォルダー名を変えると、そのプラグインは読み込まれなくなります。
5. https に移動して開けないとき
ローカルでは http:// で動かしているのに、本番の設定が残っていると https://localhost に移動して開けなくなります。
wp-config.phpにdefine( 'FORCE_SSL_ADMIN', true );があれば、ローカルでは削除するかfalseにしますsiteurlとhomeがhttps://のままなら、1 または 4 の手順でhttp://に直します.htaccessに、本番用の「http から https へ移動する」書き換えが残っていないかも確認します
逆に、Docker などで手前にリバースプロキシを置いて https:// で開いている場合は、WordPress が HTTPS で開かれていることに気づかず、ログイン画面との間を行き来することがあります。プロキシが X-Forwarded-Proto ヘッダーを送っているなら、wp-config.php の先頭近くに次を書きます。
<?php
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
$_SERVER['HTTPS'] = 'on';
}
Docker の公式 WordPress イメージで作られる wp-config.php には、同じ処理が最初から入っています。
6. パスワードが分からないとき
ローカルではメールが送れないことが多く、「パスワードをお忘れですか ?」からの再設定は使えません。WP-CLI でパスワードを直接変えます。
# ユーザー名を確認する
wp user list --fields=ID,user_login,roles
# パスワードを変える(通知メールは送らない)
wp user update admin --user_pass='新しいパスワード' --skip-email
WP-CLI が使えない場合は、phpMyAdmin などで wp_users テーブルを編集する方法もあります。
ローカル環境ごとの URL
ツールによって、サイトの URL の形が違います。ブラウザーのアドレス欄に表示されている URL を、そのまま siteurl と home に設定してください。
- Docker(公式イメージ):
docker run -p 8080:80のように公開したポートを含めたhttp://localhost:8080など - MAMP: 初期設定の Apache のポートは 8888 で、
http://localhost:8888 - Local や Laragon: サイトごとに専用のホスト名(
サイト名.local・サイト名.testなど)が割り当てられる