WordPressで「Headers Already Sent」エラーを修正する方法

intermediate📝 WordPress2026-04-27| WordPress(全バージョン)、PHP 7.4 - 8.3+、LinuxまたはWindows上のNginx/Apache

Error Message

Warning: Cannot modify header information - headers already sent by (output started at /home/username/public_html/wp-config.php:1)
#wordpress#php#トラブルシューティング#wp-config

このエラーが実際に意味すること

「headers already sent(ヘッダーは既に送信済みです)」という警告は、PHPにおける典型的な悩みの一つです。HTTPレスポンスを物理的な「手紙」に例えて考えてみましょう。ヘッダーは「封筒」であり、HTMLは中身の「手紙」です。PHPは、手紙を中に入れる前に封筒を書き終えなければなりません。もしサーバーがスペース、改行、あるいは余計な1バイトでもコンテンツを送信してしまうと、その時点で封筒は「封印」されてしまいます。その後でWordPressがクッキーの追加やリダイレクト(これらはどちらもヘッダー情報です)を行おうとしても、封筒は既に閉じられているため失敗してしまいます。

エラーメッセージは解決へのロードマップです。どこで「漏れ」が始まったのかを正確に教えてくれます。

Warning: Cannot modify header information - headers already sent by (output started at /path/to/wp-config.php:1)

この例では、問題は wp-config.php1行目 にあります。通常、これはファイルの先頭に見えない文字が存在していることを意味します。

ステップ 1: 先頭の空白を探す

最も一般的な原因は、開始タグである <?php の前にある単純なスペースや空行です。たった一つの 0x20 スペース文字があるだけでも、サイトを壊すには十分です。

  • SFTP(FileZillaなど)またはホスティングのファイルマネージャーを使用して、サーバーのファイルにアクセスします。
  • エラーに記載されているファイル(通常は wp-config.php または functions.php)をダウンロードします。
  • コードエディタでファイルを開きます。<?php タグがファイルの 正真正銘の先頭 にあることを確認してください。スペースも空行もあってはいけません。

間違った例:

 [ここにスペースや空行がある]
<?php
define('DB_NAME', 'database_name');

正しい例:

<?php
define('DB_NAME', 'database_name');

ステップ 2: UTF-8 BOMを削除する

1行目に問題がなさそうなのにエラーが消えない場合は、**BOM(バイトオーダーマーク)**が含まれている可能性があります。これは、Windowsのメモ帳などのエディタがファイルの先頭にこっそり挿入する隠し文字(EF BB BF)です。PHPはこれらの見えないバイトをコンテンツの出力として認識してしまいます。

メモ帳は使用しないでください。代わりに、VS CodeNotepad++ などのプロフェッショナルなエディタを使用してください。

  • VS Codeの場合: 右下のステータスバーを確認します。「UTF-8 with BOM」と表示されている場合は、そこをクリックします。「エンコード付きで保存(Save with Encoding)」を選択し、「UTF-8」を選びます。
  • Notepad++の場合: エンコード メニューを開きます。「UTF-8(BOMなし)」 を選択して保存します。

ステップ 3: PHPの閉じタグを削除する

functions.php のようなPHPのみのファイルでは、閉じタグ ?> は任意です。実際、完全に削除してしまう方が安全です。閉じタグがある状態で、その後に誤って「Enter」キーを押して改行を入れてしまうと、その末尾の改行が出力とみなされ、エラーを引き起こします。

ファイルの最後までスクロールしてください。もし ?> があれば、削除してください。現代のWordPressの標準(およびPSR-12コーディングガイドライン)では、この種の問題を防ぐために閉じタグを省略することが推奨されています。

ステップ 4: プラグインやテーマの競合を特定する

エラーが wp-content/plugins/ 内の深い場所にあるファイルを指していることがあります。これは、プラグインがデータを echo しようとしたり、そのファイル自体に空白の問題があったりする場合に発生します。

  • エラーが /plugins/contact-form-7/functions.php:45 を指している場合は、その特定のプラグインを無効化してみてください。
  • エラーが使用中のテーマを指している場合は、Twenty Twenty-Four などのデフォルトテーマに切り替えてみてください。
  • ファイル内で、関数の外にある echoprint、または生のHTMLがないか確認してください。これらは通常、グローバルに実行するのではなく、initwp_head などのフックに掛ける必要があります。

ステップ 5: 応急処置(アウトプットバッファリング)

調査中、とりあえずサイトをオンラインに戻す必要がありますか? PHPに対して、コンテンツを送信する前に待機するように強制することができます。これはアウトプットバッファリング(出力バッファリング)と呼ばれます。これにより、ページが準備できるまでサーバーがすべてを一時的なバッファに保持するようになります。

wp-config.php の一番上、開始タグ <?php の直後に次の行を追加します。

ob_start();

警告: これは根本的な問題を解決するものではなく、症状を隠しているだけです。また、メモリ使用量がわずかに増加するため、あくまで一時的な措置として使用してください。

修正を確認する方法

変更を保存した後、単にホームページを更新するだけでなく、以下の手順を踏んでください。

  • ローカルのクッキーを回避するために、**シークレットウィンドウ(プライベートブラウジング)**でサイトを開きます。
  • /wp-admin へのログインを試みます。ログインプロセスはヘッダーに大きく依存しているため、これが機能すれば解決したと言えます。
  • サーバーの error_log ファイルを確認します。直近の60秒間に新しい「headers already sent」のエントリがなければ、問題は解決しています。

予防チェックリスト

  • メモ帳を使わない: VS Code、Sublime Text、PHPStormなどを使用しましょう。
  • 閉じタグを使わない: PHPファイルの末尾で ?> を使用するのは避けましょう。
  • フックを確認する: テンプレート内で get_header() 関数が呼ばれる前に echo を使用しないようにしましょう。
  • ログを監視する: ステージングサイトでは WP_DEBUG を有効にしておき、本番環境に反映する前にこれらのエラーをキャッチできるようにしましょう。

Related Error Notes