「Stinger3」のfunctions.php にBOM が付いていたおかげで、いろいろ勉強になった話

シェアする

こんにちは。

当ブログのテーマをStinger2 からStinger3 に変えてから、管理画面での動作が一部変になりました。

現在は回復しています。ありがとうございます。

以下、トラブルシューティングの記録です。

事象

具体的には、次のような事象が起こるようになりました。

事象1.アイキャッチ画像設定時に、メディアライブラリが表示されない

各記事のアイキャッチ画像は、プラグインの機能により自動設定されるようにしています。

自動設定用のプラグインでは記事内の1枚目の画像が使われるようなので、別の画像をアイキャッチにしたいときや、あるいは何かの理由でうまく設定されなかったときは、管理画面にログインして手作業で設定をしています。

その際、投稿の編集画面から「アイキャッチ画像を設定」に進むと、メディアライブラリに何も表示されなくなりました。

画像ファイル自体は存在しており、管理画面内のメディア>ライブラリでは一覧表示できています。

事象2.プラグインの有効化/停止でPHPエラーメッセージが出る

プラグインのどれかが悪さをして、事象1.を起こすのかなと思いました。

というのも、プラグインを1つも入れていないローカルのXAMPP 環境では、事象1.は起こらなかったからです。アイキャッチ画像の設定画面でメディアライブラリが正常に表示されます。

試しに1つずつプラグインを停止しながら確かめてみると、そこにも問題が生じました。停止時にPHP のエラーメッセージが出るようになったのです。

反対に、プラグインを有効化する際も同様です。

メッセージによれば、エラーの出ているのはfunctions.php のようです。

有効化/停止自体はできているようです。

解析と対処

事象2.で出力されたPHP のエラーメッセージの前半分「Cannot modify header information – headers already sent」をGoogle 検索してみました。

「headers already sent」と表示されるとき(php1st.com)というページが参考になりました。上から順に引用します。

まず、「該当しなかった」という意味で参考にならなかった方です。

headers already sent」という警告メッセージは、スクリプトの途中でheader関数を実行したときなどに表示されます。つまり、header関数より前では何も出力しないようにということです。

何も出力していないのにこのメッセージが表示されるときは、スクリプトファイルの先頭に無駄な空白行がないか調べましょう。

これら2つとも、心当たりがありません。

というのも、functions.php は、タイトル画像を表示させないために数値を1か所だけ0 に変更したものの、それ以外に何も変えていないからです。

今回の事象に関係した、参考になった部分はこちらでした。

それも身に覚えがないという方。ファイルの文字コードをBOM付きのUTF-8で保存した場合、このメッセージが表示されます。保存するときに「BOMなし」の設定で保存してください。

BOM の有無はよくわかりませんでしたが、ともかくfunctions.php をBOM なしで保存し直して再アップロードすると、2つの事象は両方とも起こらなくなりました。

BOMってなに?

Wikipedia によると、BOM というのは

  • Byte Order Mark の略
  • 「バイトオーダーマーク」「バイト順マーク」とも呼ぶ
  • Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのこと

だそうです。

プログラムがテキストデータを読み込む時、その先頭の数バイトからそのデータがUnicodeで表現されていること、また符号化形式(エンコーディング)としてどれを使用しているかを判別できるようにしたもの ―Wikipedia:バイトオーダーマーク

ということで、UTF-8の場合は、16進表記で「EF BB BF」がBOM となるそうです。

BOM はいつ付いたか? A:最初から

functions.php にBOM が付いていたみたいなんですが、いつ、どの段階で付いたんでしょうか。

編集してBOM 付けちゃったのかな-。でも、自分の使っているエディタ(MIFES8)では、文字コードも含めて自動判定の自動保存だから、考えにくいよなー。

などと思い、ダウンロードしたパッケージ内のfunctions.php がどうなっているかを確かめてみました。

フリーソフトのバイナリエディタ「Stirling」でfuncitons.php の先頭を表示させたものを貼り付けておきます。

Stinger3 の場合

Stinger3 のfunctions.phpです。格納フォルダ名は「stinger3ver20130906」です。

Stinger3 のfunctions.php

あ、最初から付いてますね。

cf. Stinger2 の場合

ちなみに、Stinger2 のfunctions.php(stinger2013815フォルダ配下)の先頭はこうでした。

Stinger2 のfunctions.php

BOM はありません。

まとめ

PHP ソースファイルにBOM が付いていると、誤動作の原因になることがわかりました。

もっとも、疑問はまだ残っています。

  • BOM の付いたPHP ファイルの実行時に何が起こっているのか
  • なぜローカルのXAMPP 環境では発生しなかったのか

です。

僕の遭遇した事象で言えば、何がどうなって「header already sent」エラーへ至るのか。サーバー環境とローカル環境とで何が違っていたのか。そこはまだ、調べが足りません。

教訓:Lessons Learned

今回の教訓は「不具合発生時はエラーメッセージから調べよう」です。

起こっている事象をキーワードに入れて手がかりを探してもみましたが、結局は、エラーメッセージの文言を検索したのが解決につながりました。

それが近道なのでしょうね。

つづく、かも。

スポンサーリンク
Google AdSense
Google AdSense

シェアする

フォローする

スポンサーリンク
Google AdSense

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)