WordPressで”Cannot modify header information”の警告が出たときの解決方法
WordPress
WordPressテーマの制作中、管理画面のJetpackメニューの部分に
Warning:Cannot modify header information
このような警告が出るようになりました。
Warningは警告なので重大な不具合が出るわけではありません。無視しても問題はなさそうですが、ずっと出た状態なのですごく気になります。
警告文を続けて読むと、headers already sent by ( output started at ~)となっています。
下記サイトによると、この警告はheader関数よりも前に余計な処理が割り込んでしまうことによって起こるものだそうです。
ということは、それを見つけて修正すれば「Warning:Cannot modify header information」は直りそうです。
「Warning:Cannot modify header information」の解決方法
原因のある箇所はrest-api.phpの513行目と書いています。
確認してみると下記のようなコードでした。
header( sprintf( 'X-WP-DeprecatedParam: %s', $string ) );
PHPマニュアルによると空白もダメということが書いてあり、このコードの上にも1行空白がありました。
覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
ということで、とりあえず空白を以下のように詰めてみましたが警告は消えませんでした。
function rest_handle_deprecated_argument( $function, $message, $version ) {
if ( ! empty( $message ) ) {
/* translators: 1: function name, 2: WordPress version number, 3: error message */
$string = sprintf( __( '%1$s (since %2$s; %3$s)' ), $function, $version, $message );
} else {
/* translators: 1: function name, 2: WordPress version number */
$string = sprintf( __( '%1$s (since %2$s; no alternative available)' ), $function, $version );
}
header( sprintf( 'X-WP-DeprecatedParam: %s', $string ) );
}
そもそもこのファイルはいじったことがないし、STINGER8では問題もなくJetpackが使えているので他を疑うことにしました。
WordPressは全然違う箇所をエラー報告したりするのでハマる原因にもなります。本当に厄介です。
Google先生に頼って調べていると、また一つ解決方法が見つかりました。
「php.ini」の「output_buffering」の設定を変更する
php.iniのoutput_bufferingという項目をOnに変更すると直るらしい。
php.iniとは
php.iniはPHPを動かすときに読み込まれるファイルで、CGI版やサーバーモジュール版があります。
設定ファイル (php.ini) は PHP の起動時に読み込まれます。 PHP のサーバーモジュール版では、Web サーバーの起動時に 一度だけ読み込まれます。CGI 版と CLI 版では、スクリプトが呼び出される度に読み込まれます。
バッファという言葉はストリーミングの動画を見るときによく目にします。ある程度ダウンロードしてからその分の動画が見られるようになるアレですね。
つまりこの、output_bufferingをOnにすると情報をまとめてから発信するということになります。逆にデフォルトのOffだと順番にその都度送ることになるので、空白や割り込み処理を無視しなくなるので警告が出るということですね。
output_bufferingの変更方法
結果としてoutput_bufferingをOnにしたら警告が出なくなりました。
レンタルサーバーのphp.iniという項目があるので、そこで変更します。ここではエックスサーバーを例に説明します。
まず、インフォパネルのphp.ini設定をクリックします。
編集したいドメインを選びます。
php.ini直接編集でoutput_bufferingの値を変更します。
私の場合は”4096″となっていましたが、これを”On”と変えて保存します。
output_buffering = On
これで警告は消えるはずです。