原始的な PHP のデバッグ方法として
echo や var_dump(), print_r() を利用する手法がありますが、
WrodPress ではこれらを行うと
HTTP レスポンスに書き込まれてしまい
ブラウザの表示が大きく崩れて
以降、正しく動作しなくなってしまうことがあります。
この記事では ブラウザの表示に影響をあたえず
WordPress のログを出力する方法を、
Stack Overflow の回答から翻訳しつつ詳細を解説します。
参考: php – How can I use error_log() with WordPress? – Stack Overflow
手順
wp-config.php などで次のように定数を定義します。
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
そして、確認したい箇所で error_log() という関数を使い、ログを出力します。
error_log( 'Hello World!' );
すると、WP_CONTENT_DIR で指定されているディレクトリー
(デフォルトでは wp-content) に debug.log というファイルが作成され、
ログが残ります。
print_r() 関数の第二引数に true をセットして引数に設定すると
変数の詳細を調査することもできます。
error_log( print_r( 'Hello World!', true ) );
参考: PHP: print_r – Manual
もし、エラーメッセージを画面に表示させたくないのに表示されてしまう場合は、
wp-config.php などで次の定数定義も行います。
define( 'WP_DEBUG_DISPLAY', false );
残念ながら、ログのレベルは指定できないようです。
詳細解説
PHP には error_log() という関数があります。
error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) : bool
PHP: error_log – Manual
この関数は第一引数 $message をログとして残すことができます。
ログをどこに残すかは第二引数 $message_type で変更できますが、
指定しなかった場合 (0 の場合) の振る舞いは
php.ini の “error_log”という項目の設定に依存します。
この設定項目 “error_log” にファイルパスが指定された場合は、
そのパスのファイルにログが残されます。
参考: PHP: 実行時設定 – Manual
この ini の設定は、 WordPress では
wp-include/load.php wp_debug_mode() という関数で設定されます。
この関数を確認すると、”error_log” の設定がなされるためには
定数 WP_DEBUG が true である必要があります。
また、併せて定数 WP_DEBUG_LOG を true に設定すると
定数 WP_CONTENT_DIR で設定されているディレクトリーに
debug.log というファイルが生成され、
ログが書き込まれるようになることがわかります。
この wp_debug_mode() は
wp-settings.php から必ず呼び出されるようになっており、
サーバーへのリクエストから辿ると、次の順番で呼び出されます。
index.php → wp-blog-header.php → wp-load.php → wp-config.php → wp-settings.php → load.php / wp_debug_mode()