WordPressで突然画面が真っ白になり、エラーログに Cannot modify header information - headers already sent と出ている場合は、ヘッダー送信より先に何らかの出力が行われている可能性が高いです。
このエラーは、単にメッセージの意味を理解するだけでは直りません。大事なのは、どのファイルで、どの出力が先に行われたのかを突き止めることです。
この記事では、WordPressでこのエラーが起きたときの原因、まず確認したい復旧手順、よくある発生箇所、エラー箇所の調べ方までわかりやすく解説します。
Cannot modify header information – headers already sent とは?
このエラーは、すでに何かが出力されたあとに、さらにHTTPヘッダーを送ろうとしたときに発生します。
PHPでは、画面への文字出力や警告メッセージなどが先に出ると、その時点でヘッダー送信済みの状態になることがあります。そのあとでリダイレクト処理やCookie設定などを行うと、このエラーが出ます。
WordPressでは、テーマやプラグインを編集した直後、functions.php や wp-config.php を触った直後によく起きます。
まず確認したい復旧手順
このエラーが出たら、まずは原因を広く探すより、直前に編集したファイルを優先して確認するのが最短です。
1. 直前に編集したファイルを戻す
もっとも多いのは、直前に編集したPHPファイルに余計な空白や文字が入ってしまうケースです。テーマ編集、子テーマ編集、プラグイン編集をした直後なら、その変更を一度戻して動作確認してください。
2. UTF-8 BOM付きで保存されていないか確認する
ファイルが UTF-8 BOM付き で保存されていると、見えない文字が先に出力され、ヘッダー送信エラーの原因になることがあります。保存形式は UTF-8(BOMなし) に統一するのが安全です。
3. PHP開始タグの前後に空白や改行がないか確認する
<?php の前に空白や改行があると、それだけで出力扱いになることがあります。特に、ファイル先頭や末尾は注意してください。
4. PHPの閉じタグの後ろに文字がないか確認する
PHPファイルの末尾に ?> があり、その後ろに空白や改行が入っているとエラー原因になります。WordPressのPHPファイルでは、末尾の閉じタグを省略する運用も一般的です。
5. functions.php と wp-config.php を優先して見る
このエラーは、WordPressの動作全体に影響するファイルで起きやすいです。特に functions.php、wp-config.php、独自に編集したプラグインファイルは最優先で確認してください。
このエラーが起きる主な原因
UTF-8 BOM が入っている
UTF-8 BOMは目に見えませんが、PHP実行時には先頭出力の原因になります。見た目に問題がなくても、保存形式だけでエラーになることがあります。
<?php の前に空白や改行がある
PHP開始タグより前に1文字でもあると、ヘッダー送信より先に出力が発生する可能性があります。
echo や print のあとに header 処理をしている
echo や print で画面出力したあとに、header() によるリダイレクトやCookie処理をすると、このエラーが起きます。
PHPの閉じタグの後ろに空白や改行がある
末尾の ?> のあとに何か入っていると、意図しない出力になります。特にコピペ編集時に混入しやすいポイントです。
警告やNoticeが先に出力されている
本来の原因とは別に、Warning や Notice が先に画面へ出力され、その結果としてヘッダー送信エラーが続けて表示されることがあります。この場合、後から出ているエラーだけ見ても根本原因にたどり着けないことがあります。
WordPressでよくある発生箇所
functions.php を編集したとき
テーマの functions.php は非常に起きやすい場所です。コード追加後に画面が真っ白になった場合は、まずここを疑ってください。
wp-config.php を直接編集したとき
wp-config.php はWordPress全体の設定ファイルです。空白や保存形式のミスがあると、サイト全体に影響が出やすくなります。
プラグインや子テーマを編集したとき
独自コードを追加したプラグインや子テーマのファイルでも、このエラーはよく起きます。特に、デバッグ用の echo を入れたままにしているケースはありがちです。
エラー箇所を調べる方法
エラーメッセージのファイル名と行番号を確認する
エラーメッセージには、問題が表面化したファイル名や行番号が出ることがあります。ただし、それが必ずしも最初の原因箇所とは限りません。表示されている箇所だけでなく、その前に何が出力されたかも考える必要があります。
headers_sent() で送信済みか確認する
原因の特定が難しい場合は、headers_sent() を使って、どの時点でヘッダー送信済みになっているかを確認します。
error_log(__FILE__ . "(" . __LINE__ . ") : header " . (headers_sent() ? "done" : "not yet" ) );
このようにログへ出力すると、どのタイミングでヘッダーが送信済みに切り替わったかを追いやすくなります。調査用コードなので、原因特定後は削除してください。
再発防止のポイント
- PHPファイルは UTF-8(BOMなし)で保存する
- ファイル先頭の
<?phpより前に何も入れない - PHP末尾の閉じタグ
?>は不要なら書かない - デバッグ用の
echoやprintを残さない - 本番環境で直接編集する前にバックアップを取る
とくにWordPressでは、ちょっとした文字コードや空白の混入だけでも管理画面全体が開けなくなることがあります。小さな編集でも、保存形式と余計な出力には注意してください。
まとめ
Cannot modify header information - headers already sent は、ヘッダー送信より先に何かが出力されたときに起きるエラーです。
- まずは直前に編集したファイルを確認する
- UTF-8 BOM、空白、改行、
echoの残し忘れを疑う functions.php、wp-config.php、プラグインファイルを優先して見る- 必要に応じて
headers_sent()で調査する
原因を広く探すより、直前の変更・保存形式・余計な出力を順に潰していく方が、復旧は早くなります。WordPressでこのエラーが出たら、まずは落ち着いて、編集したファイルから確認してください。
