WordPress使うなら、PHPのエラーメッセージと仲良くなっておこう

WordpPress Advent Calendar 2015 6日目の記事になります。

何を書こうか色々と迷ったのですが、フォーラムの質問やSNSなどを見ていると、まだまだPHPのエラーメッセージが何を伝えているかを見ていない人が多いと感じたので、啓発の意味も込めてエラーメッセージについて書いてみることにしました。(WordPressというより単なるPHPの話になっている気がしますが、デザイナーさんとかブロガーさんとか、必要だと思われる人が多い気がするのでよしとしてください。

WordPressは、至極当たり前ながらPHPで動作していますね。テンプレートだけだと、HTMLも混ざっているので、あまり感じられないかもしれませんが、index.phpから始まって、処理が全て完了するまで、全てPHP上で動作しています。そして、PHPのお作法上間違っていたりすると、その間違っている箇所で処理が止まってしまいます。

このとき、WordPressのデバッグモードを有効にしておくと表示されるのがエラーメッセージです。
このエラーメッセージは、エラーを取り除くための非常に重要な情報が詰まっていて、エラーの種類と原因、発生した場所が必ず含まれています。また、特定のエラーの場合は、それの原因となる場所を教えてくれるものもあります。エラーメッセージを正しく理解すれば、何が原因でなのかが一目瞭然になり、解決の最短距離をとることができるのです。

まずは、エラーメッセージの構造から見ていきましょう。

Fatal error: Call to undefined function wp_http_validate_url() in /path/to/wordpress/wp-includes/some-script.php on line 123

Fatal error:
この部分は、エラーの程度を示しています。Fatal error は致命的なエラーとして処理がとまります。Warning や Notice の場合は、このエラーで処理がとまることはありません。

Call to undefined function wp_http_validate_url()
エラーの内容を示いており、この部分で何が発生したのかを知ることができます。

in /path/to/wordpress/wp-includes/some-script.php on line123
エラーが発生したファイル名と行数を示しています。

これだけ分かれば、少なくともどこを直せばよいのか分かりますよね。
英語なので、とっつきにくい部分はあるかもしれませんが、落ち着いてよく読んでみれば、大体把握できると思います。

フォーラムでよく登場する代表的なエラーメッセージの説明とよくある原因、対処法を挙げておきますので参考にしてみてください。

Fatal error: Call to undefined function some_function() in /path/to/wordpress/wp-includes/some-script.php on line 123

未定義の関数が実行されようとしたというエラーです。

よくある原因として、関数名のスペルミスやFTPでのファイルアップロードエラー、プラグインを停止などがあります。自分で記述したものであれば、まずスペルの再確認をしましょう。WordPressの関数自体で発生したときは、ファイルの存在確認や、コアファイルの上書きアップロードなどが有効です。

Fatal error: Maximum execution time of 30 seconds exceeded in /path/to/wordpress/wp-includes/some-script.php on line 123

phpの実行時間上限に達した場合に発生します。大きいファイルサイズの処理やサーバに負荷が掛かっている場合、APIなど外部とのやりとりで処理がつまっている場合などに発生しがちです。

Fatal error: Cannot redeclare some_function() (previously declared in /path/to/wordpress/wp-includes/another-script.php on line 456) in /path/to/wordpress/wp-includes/some-script.php on line 123

同じ関数名が定義されようとした場合のエラーです。previously declared で示されるファイルの場所が最初に定義された箇所を示しています。
プラグインとテーマで同名の関数が定義されていた場合などに発生します。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65484 bytes) in /path/to/wordpress/wp-includes/some-script.php on line 123

PHPのメモリー上限を超えてしまった場合に発生します。サーバのメモリ設定が低かったり、プラグインが多い、1ページに表示する記事が多すぎる場合などに発生しがちです。
プラグインの変更などで対応できない場合は、サーバのメモリ設定の変更を検討します。変更ができないサーバでは、メモリの多いサーバへの移転を検討してください。

Fatal error: require() [function.require]: Failed opening required '../another-script.php' (include_path='.:/usr/local/share/pear') in /path/to/wordpress/wp-includes/some-script.php on line 123

ファイルの読み込みに失敗した場合のエラーです。ファイルがサーバに正しくアップロードされているか確認します。

Parse error: syntax error, unexpected end of file in /path/to/wordpress/wp-includes/some-script.php on line 123

PHPの記述間違いがある場合のエラーです。単に記述間違いに場合や if や while などの入れ子が合っていない場合にも発生します。入れ子のエラーの場合は、エラーメッセージの行にエラーが含まれていない場合があるんので注意する必要があります。

Warning: Cannot modify header information - headers already sent by (output started at /path/to/wordpress/wp-includes/another-script.php on line 456:1) in /path/to/wordpress/wp-includes/some-script.php on line 123

送出済みのヘッダ情報を変更しようとした場合に発生するエラーです。
このエラー単体では処理は停止しませんが、大抵の場合、ログイン時や記事更新時のリダイレクト処理で発生し、真っ白になってしまいます。
output started 示される場所で送出がされているので、該当箇所に文字や空行がないか、ファイルの編集が BOM付きになってしまっていないか確認します。

多少なりとも、今まで忌避していたエラーメッセージを読んでみようという気になったのであれば、まずは第一歩というところです。根気よく取り組んでみてくださいね。

7日のWordpPress Advent Calendar 2015は、徳丸先生です。
昨今、WordPressは標的にされやすいので、セキュリティには十二分の配慮が必要です。
どのような内容になるか私も楽しみです。
WordPress Advent Calendar 2015に参加したかった人達の Advent Calendar 2015はというと、井村先生です。プラグイン作るときに考えるあれこれとは興味深い。