デバッグのスキルはどのような開発者にも不可欠です。この記事では、WordPressとPHPのエラーをデバッグする際のパワフルな11の方法を紹介します。
最初に有名な「WP_Debug」を取り上げ、そのあとさらに高度な方法へと進みます。
PHPでの一般的なエラーの種類を説明しておきます。
A –Notice(注意):PHPで表示されるもっとも重要度の低いエラーメッセージ。必ずしも問題があることを示すわけではないが、改善可能な点が提案される
例:文字列を待ち受ける関数にnull要素が渡されている
B – Warning(警告):Noticeより深刻なエラーではあるが、スクリプトの停止には至らない
例:存在しないファイルが「include()」に与えられている。
C – Fatal error(致命的エラー):深刻な問題があることを示し、スクリプトは停止している
例:存在しない関数の呼び出し
1:WP_DEBUG
WordPressには、デバッグで必要なレベルを指定するグローバル定数WP_DEBUGがあります。関連して2つの重要な定数WP_DEUBG_DISPLAYとWP_DEBUG_LOGがあります。
WP_DEBUGはデバッグモードのオン・オフを設定します。WP_DEUBG_DISPLAYはエラーの表示・非表示を決定します。最終的にWP_DEBUG_LOGによってエラーメッセージがwp-content/debug.log内に保存されます。
この3つのグローバル定数はwp-config.php内で次のようにtrueまたはfalseに設定します。
define("WP_DEBUG", true);
define("WP_DEBUG_DISPLAY", true);
define("WP_DEBUG_LOG", true);
2 :is_wp_error()
デバッグ用の別のWordPressビルトインツールにis_wp_error()メソッドがあります。これは特定のresultがWP_Errorのタイプであるかどうかをチェックするメソッドです。WP_Errorは、WordPressのメソッドでエラーが発生した場合に実際に返されるオブジェクトです。
以下に例を示します。
$post = array(
'post_title' => 'Test post',
'post_content' => 'This is my post.',
'post_status' => 'publish',
'post_author' => 1
);
$result = wp_insert_post( $my_post );
if(is_wp_error($result)){
echo $return->get_error_message();
}
上のコードではwp_insert_post()メソッドを使って新規の投稿を追加しています。このメソッドでエラーが発生するとWP_Errorオブジェクトが返されます。これをキャッチしてエラーメッセージを取得できます。
3:Debug Bar
Debug BarもWordPressでのエラーのデバッグに役立つツールです。とてもハンディで、Webサイト内の各ページに関する有用な情報を取得できます。
インストール後、Debugボタンが表示されます。ボタンをクリックすると、クエリ、テンプレート、PHPのインストールに関する解析など、たくさんの有用な情報を取得できます。
4:テスト用のWebサイト
実稼働中のWebサイトをテストや開発(用のサイト)と別にしておくことはとても大切です。私は通常、自分のWebサイトにWordPressを2つインストールしています。これが重要なのは、エラー報告の発生時にスクリプトの停止を避けるためです。
5:Simply Show Hooks
Simply Show Hooksはページ上で動作するフックをすべて表示する優れたプラグインです。「エラー報告」という手段がまったく通用しない状況に遭遇した場合、動作中のフックをすべて1つ1つ取り出します。
このプラグインは、ページ上でどんなアクションやフィルターフックが実行中か教えてくれるので、それぞれのフックコードの解析とデバッグに取りかかれます。さらに1つ1つのフックに付随するメソッドも確認できるだけでなく、それぞれの優先順位さえも把握できます。
6:WPDBのエラー報告
データベース処理にwpdbクラスを使っているなら、クエリが正しく動作しているかどうか確認し、デバッグ用のエラーメッセージを表示するために、エラー報告はどうしても必要です。
以下に例を示します。
global $wpdb;
// Before running your query:
$wpdb->show_errors = TRUE;
$result = $wpdb->get_results("SELECT field_value FROM table_name");
if(! $result){
$wpdb->print_error();
// Or you can choose to show the last tried query.
echo $wpdb->last_query;
}
7:サーバーのエラーログ
ある時点で、WordPressでもPHPでもコードのエラーをキャッチできなくなることがあります。たとえばスクリプトが許可される最大実行時間を超過すると、PHPのエラーメッセージは取得できません。Apache(またはサーバーが設置されているそのほかのシステム)でInternal Server Error(内部サーバーエラー)などのポップアップを表示します。
このとき、エラーログを取得してPHPのコードやWordPressの実装の特定の部分に不具合があった場合の状況を確認することが必要です。
ログを保管しているWebホスティングにも問い合わせができます。たいてい、ログフォルダーを調べるとなにか見つかります。
8:PHPによるエラーログ作成
PHPには独自のレベルのエラー報告機能があり、WordPressの範囲を越えて解決するべき問題も含まれます。特にWordPressの外部でなにかが動作して問題を引き起こしている場合、とても有用です。
最初にphp.iniファイルを構成してエラー報告を取得し、次いでメッセージの格納場所を指定します。
error_reporting = E_ALL | E_STRICT
error_log = /var/log/php_error.log
上の2行で、エラー報告を取得し、指定されたパスにエラー(報告)を保存するよう設定できます。
さらにphpinfo()を実行してerror_logオプションを確認できます。
9:PHPの構文チェックツール
ホスティングプロバイダーによってphp.iniファイルへのアクセスが制限されていたり、エラーログにアクセスできなかったりすると、少しやっかいです。とはいえ、真っ白なページだけが表示されてエラーメッセージが出ない状況に対処するためのツールはたくさんあります。PHP Code Checkerは手軽なツールの1つです。
PHP Code Checkerは構文エラーチェックツールです。セミコロンや中カッコのミスがあった場合とても役立ちますが、ミスが起きた場所は示されません。
10:PHPのIDE
PHP Code Checkerで構文エラーが発見できなかった場合、さらに強力なツールが必要になります。 PhpStormなどのパワフルなIDEは、コードをパーツに分解してより高度なデバッグをします。
変数に文字列を代入して表示しようとしたのになにも反応がない、といった状況があります。IDEを使えば、コードのあとのほうで変数がオーバーライドされているなどの誤りを見つられます。PhpStormやEclipseなど、好みのパワフルなIDEの導入は特におすすめです。
11:ブラウザーのキャッシュを無効にする
Webサイトのフロントエンド側で作業している場合、ブラウザーのキャッシュを無効にする必要があります。JavaScriptを更新していなかったり、なお悪いことに更新しているのに新しいエラーが表示されないときは、キャッシュの無効化が必須です。
キャッシュを無効にすると、ブラウザーにこれまで保存していたWebサイトのファイルは動作しなくなります。保存していたファイルにはCSSやJavaScriptファイルも含まれます。
Google Chromeでブラウザーのキャッシュを無効にするには、Webページの任意の場所で右クリックしてデベロッパーツールを開き、ツールバーのNetworkタブをクリックします。最後に、画面上部のDisable Cache(キャッシュの無効化)チェックボックスにチェックを入れます。
最後に
デバッグ工程で参考になる11のヒントを紹介してきました。デバッグ作業は面倒になりがちですが、説明してきたコツを使えば工程全体がずっと楽になるでしょう。
(原文:Debugging WordPress: 11 Powerful Tips and Techniques)
[翻訳:新岡祐佳子/編集:Livit]