コンテンツにスキップ

WordPress サイトのデバッグ方法

メインイメージ

WordPress サイトの基礎的なデバッグ方法を紹介します。

対象読者

本ページでは「プログラミングの基礎知識がある方」を対象としています。

WordPress のデバッグ設定を有効にする

WordPress ではデバッグ用のフラグ定数 WP_DEBUG が用意されています。 この値を true にセットすると WordPress のデバッグ設定が有効になります。

設定ファイル wp-config.php の先頭付近に次の行を追加します。

define( 'WP_DEBUG', true );

wp-config.php はデフォルトでは WordPress インストールディレクトリ直下に置かれています。

define() の代わりに const キーワードを使って定義しても OK です。

const WP_DEBUG = true;

WP_DEBUG の注意点

WP_DEBUG でデバッグ設定を有効にすると、 PHP の設定次第では発生したエラーの情報がブラウザで閲覧した画面に出力されてしまいます。 これが本番環境で起こるのはセキュリティ上望ましくありません。

そのため、本番環境で WP_DEBUGtrue に設定する必要があるときはエラーの詳細が出力されないよう WP_DEBUG_DISPLAYfalse にセットしておくのがよい習慣です。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_DISPLAY', false );

WP_DEBUG_DISPLAYfalse の場合にエラーが発生したときの画面:

このサイトで重大なエラーが発生しました。

ただし注意をしても事故が起こるリスクはあるので、本番環境では原則デバッグ作業を行わないようにする方がベターです。

WordPress のデバッグログを出力する

デバッグログを出力するには定数 WP_DEBUG_LOG を使います。 WP_DEBUG_LOG が機能するには WP_DEBUGtrue にセットされている必要があります。

設定ファイル wp-config.php の先頭付近に次の行を追加します。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );

このようにすると、 WordPress インストールディレクトリの下の wp-content/debug.log ファイルにログが出力されます。

試しにアクティブなテーマの functions.php に次のように記述するとログが出力されることが確認できます。

error_log("This is not a test of the emergency broadcast system.");

WP_DEBUG_LOG の値にファイルパスをセットするとログの出力先を変更できます。

define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' );

WP_DEBUG_LOGtrue にセットときの出力先 wp-content/debug.log はサイトの訪問者がブラウザでアクセスすると閲覧できてしまう可能性がありこれはセキュリティ上リスクがあります。 本番環境でログ出力が必要な場合は極力 WP_DEBUG_LOG にファイルパスをセットして WordPress インストールディレクトリの外にログを出力すべきです。

なお、ウェブサーバーで拡張子が .log のファイルをあらかじめ閲覧不可に設定しておくと、万が一 WordPress インストールディレクトリ以下にログが出力されたときの被害の発生を防げます。

Apache 2.4 で .log ファイルを閲覧不可にする設定:

<FilesMatch "\.log$">
  Order allow,deny
  Deny from all
</FilesMatch>

関連ページ:

プリントデバッグをする

単純に変数の値などを出力するプリントデバッグには大きく 2 通りの方法があります。

  • A. デバッグ設定を有効にした上で error_log() 関数を使う
  • B. file_put_contents() でファイルに出力する

A. デバッグ設定を有効にした上で error_log() 関数を使う

こちらの方法では上の「デバッグログを出力する」の設定をした上で error_log() 関数を使います。 ただし、 error_log() 関数は引数に文字列のみを受け付けるので、配列やオブジェクトは直接渡すことができません。 次のように事前に文字列にしておく必要があります。

error_log( print_r( $data, true ) );

複雑なデバッグ作業などで error_log() を多用する場合は毎回文字列に変えるのが煩わしくなるのでヘルパー関数を書いておくと便利です。 WordPress Developer Resources の Debugging in WordPress のページではそんなヘルパー関数の例として次のヘルパー関数が紹介されています:

function write_log( $data ) {
    if ( true === WP_DEBUG ) {
        if ( is_array( $data ) || is_object( $data ) ) {
            error_log( print_r( $data, true ) );
        } else {
            error_log( $data );
        }
    }
}

B. file_put_contents() でファイルに出力する

B の方法は単純に file_put_contents() でファイルに出力する方法です。 特定の値を他のログと区別して見たい場合などはこちらの方法を選ぶとよいと思います。

書き込み時に既存の内容を上書きするか末尾に追加するかは第 3 引数のフラグで制御できます。

上書きする場合 → 複数回呼ばれたときは最後の出力だけが残る:

file_put_contents( '/tmp/wp-vars.log', print_r( $data , true ) );

末尾に追加する場合:

file_put_contents( '/tmp/wp-vars.log', print_r( $data , true ), FILE_APPEND );

PHP のログを確認する

WordPress のログとは別に PHP のエラーログもあります。

WordPress のレイヤーで補足できたエラーや例外は WordPress のログに出力されますが、できなかったものは PHP のエラーログの方に出力されます。

出力先は PHP のランタイム設定 error_log で制御されています。

error_log の値 出力先
なし なし
syslog syslog
ファイルパス そのパスのファイル

この error_log の値は PHP の設定ファイル php.ini で設定できます。

error_log = "/tmp/php_error.log";

環境によっては wp-config.php 内で ini_set() を使って設定することもできます。

ini_set( 'error_log', '/tmp/php_error.log' );

実際に出力されるエラーの種類については error_reporting で設定されているので、エラーが出力されない場合はこの値を調整すると解決できることがあります。

Apache のログを確認する

WordPress サイトではウェブサーバーに Apache を使っている場合が多いですが、 Apache サーバーを使っている場合は Apache のログもデバッグに有用です。

サイトにアクセスしているのに WordPress が反応しない場合などは Apache のアクセスログやエラーログを確認するとよいです。 Apache のログの出力先は Apache の設定ファイルの CustomLogErrorLog ディレクティブで制御されています。

CSS や JavaScript のデバッグ

CSS や JavaScript のデバッグについてはここでは紹介しませんが、 minify されたコードではなく可読性の高いオリジナルのコードを使う設定などデバッグに有用な定数がいくつか用意されています。 WordPress 公式の Debugging in WordPress ページに説明があるので興味がある方はそちらをご覧ください。

関連ページ

公式ドキュメンテーション