WordPressでPHPファイルを操作していると「Warning: Cannot modify header information – headers already sent by…」というエラーメッセージが表示されることがあります。
ちなみに僕は子テーマを作った時にこのエラーと遭遇しました…。
サイトのコンテンツは正常に表示されているんですが、ブラウザの一番上にこのエラーメッセージが表示されてしまうんですよね。
このエラーに対処することは簡単なんですが、対処法が多く、さらに使っているサーバーによって出来る出来ないがあるので、不慣れな人からすると厄介なんです…。
そんなわけで、ここでは「どんな環境でも通用する対処法」を紹介したいと思います。
とても簡単なので、WordPressにwarningのメッセージが出てどうしようもないというときはぜひ一度試してみてください!
「Warning: Cannot modify header information – headers already sent by…」の原因とは?
「Warning: Cannot modify header information…」が表示される理由はいくつかあるんですが、その中でも代表的なのが2つあります。
1、「header()」関数が原因
まず最初に疑うのが、WordPressの「functions.php」内に記述されている「header()関数」です。
- header()関数の前に空白がある
- header()関数の前にecho()等を使った出力処理がある
これらの問題があると、エラーメッセージが表示されることがあります。
ちなみにエラーメッセージの最後に、「エラーの原因になっているファイル」と「何行目のコード」かが記載されています。最後に注目してみてください。
この場合「functions.php」の「255目」に問題があるようですね。
対照箇所を実際に覗いてみると、やはりheader()関数の記述がありました…。
ここを修正して解決出来たらラッキーなんですが、WordPressの場合「function.php」ファイルはよく更新されるので、一度修正してもテーマをアップデートした際にもとに戻ってしまう可能性があります。
子テーマを使う手もありますが、このファイルは知識もなく下手に複製してカスタマイズするのも危険。これに関しては下記記事でも触れています。
そんなわけで、WordPressの場合この対処法を取ることは難しそう…。今回は別の手段を考えます。
2、php.iniの設定が原因
もう一つの原因は「php.ini」ファイルの設定です。
「php.ini」は「設定ファイル」と呼ばれているんですが、その名の通りPHP関連の情報が記述されているファイルです。
このファイルの中に記述されている「output_buffering」設定が、今回のエラーの原因となっている場合があります。
ちなみに、php.iniファイルは多くの場合、各自使っているサーバーのコントロールパネル内で設定することが出来ます。設定可能な場合は、「output_buffering」設定を「On」にすることで、先ほど紹介したheader()関数関連の問題を回避することが出来ます。
ただしこの方法は「php.ini」ファイルが使える場合に限ります…。
サーバーによってはこれらのファイルが扱えないことがあるので、その場合はこれから紹介する方法を試してみてください。
エラーメッセージを非表示にする方法もある
エラーの原因を解決できない場合は、最後の手段として「エラーメッセージを非表示にする方法」を使いましょう。
これを聞いて不安に思う人もいると思いますが、実はPHPのエラーにもいろんなレベルがあって、今回のような「Warning」メッセージは”致命的ではない警告”に分類されます。
つまりこれ、厳密に言うとエラーではないんです。
ですからどうしようもない場合は、エラーメッセージを非表示にすることで対処することも実際少なくないんですよ。
ちなみにこの「エラーメッセージを消す方法」も色々あるんですが、これもサーバーによっては出来ないことがあるので、今回はどんな環境でも使える方法を紹介したいと思います。
WordPressを使っている場合は下記を参考にお試しください。
子テーマの「functions.php」内でエラーメッセージを制御
今回はWordPressの「functions.php」ファイルに、エラーメッセージを非表示にするコードを記述することで解決します。
下記コードをfunctions.php内にそのまま張り付けてください。もちろん子テーマのファイルです。
これで解決するはず。
<?php error_reporting(E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR); ?>
「error_reporting()」は、PHPエラーの出力を制御できる関数です。これを使うことで、エラーレベルによって表示・非表示を制御できます。
この場合「致命的なエラーのみを表示します」という意味のコードとなります。
先ほどエラーにもレベルがあるという話をしましたが、その中でも致命的なもの意外は無視するってことです。
サイトを見て特に問題がないようなら、この方法を使って問題を回避することも全然ありだと思います。
あわせて読みたい
WordPressを使うサーバーによってエラー表示設定が違う?
ここから先は今回のエラーに関する予備知識。
エックスサーバーやロリポップなど、有名どころのサーバーは大抵「php.ini」の設定ができます。しかもコントロールパネルの中で出来るので超簡単。
「php.ini」内でもエラーメッセージを制御できるんですが、サーバーによってはあらかじめエラーメッセージを表示しない設定がしてある場合もあります。
同じWordPressを使っていても、サーバーによってこれらの初期設定が違う場合があることも覚えておくと良いでしょうね。
これ以外にも、PHP関連で何か問題が起きたときは「php.ini」ファイルを操作することで解決できることも多いので、一度見ておくと良いと思いますよ。