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 など)が割り当てられる

関連記事

お気軽にご相談ください

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