【解決事例】WordPressにログインできない エラー: 予期しない出力により Cookies がブロックされました

サイトはちゃんと表示されているのにWordPressにログインできなくなってしまうことは、割とよくあります。

今回はその問題を解決させていただいたので、その方法をお伝えします。

まず、依頼者様のサイトでログインしようとしたところ、以下のようなメッセージが表示されてしまいました。

エラー: 予期しない出力により Cookies がブロックされました

このようなメッセージが出た場合に、「なになに、Cookie周りに問題があるのだな」と考えがちですが、あまりエラーメッセージはあてにしない方がいいことも多いです。今回もCookieは関係ありませんでした。

解決方法

裏では本当は何が起きているのかを知るために、エラー情報を見るところから始めます。

WordPressをインストールしたディレクトリにwp-config.phpがあるので、それをエディターで開きます。

define('WP_DEBUG', false);

という記述があるので、これを以下のように書き換えます。

define('WP_DEBUG', true);
    if (WP_DEBUG) { 
        define('WP_DEBUG_LOG', true);
        define('WP_DEBUG_DISPLAY', false);
        @ini_set('display_errors',0);
}

こうすることで、エラーの情報がwp-contentディレクトリの中にあるdebug.logに書き出されます。

debug.logを見てみると、

PHP Warning: session_start(): Cannot send session cookie – headers already sent by (output started at /home/xxxx/www/yyyy/wp-content/themes/xxxx/functions.php:383) in /home/xxxx/www/yyyy/wp-content/plugins/siteguard/siteguard.php on line 153

といったメッセージが書き込まれていました。

二つphpファイルの名前が出てきてややこしいのですが、この場合はfunctions.php:383に注目してください。この場合だと、テーマのfunctions.phpの383行目に問題があると言っています。
ちなみにfunctions.php:1となっている場合は1行目に問題があるということになります。

そこでfunctions.phpの問題の箇所を見てみると、ファイルが?>で終わっていて、その下に複数行の改行がありました。

?>で終わることは問題ないのですが、その下に複数行の改行があると、phpでは予期しない問題を引き起こすことがあります。

また、?>で終わることにより、このようなわかりにくい現象が起きやすいので、?>はphpファイルの最後には付けない方が安全です。

そのため今回は、?>およびその下の改行を削除したところ、無事にログインできるようになりました。