WordPress構築をしているときにデバッグは必要不可欠です。

print_rvar_dumpを用いてデバッグしますよね。

例えば、taxnomony.phpで現在表示中のタームのスラッグを取得したいとき。

get_query_var('term')を使いますが、本当に自分が意図したものが取得できているか確認したい場合は以下のように書けばいいでしょう。

print_r(get_query_var('term'));
または、
var_dump(get_query_var('term'));

これで、ブラウザ上で取得できているか確認などができます。

ただ、functions.phpだとprint_rやvar_dumpを使用してもブラウザでその値を確認できない場合があります。

例えば、フック(アクションフックやフィルターフック)内の値を確認したいときなどはprint_rやvar_dumpで確認したくてもできません。

そんなときは、PHPのfile_put_contentsを使って、任意の場所にログファイルを出力してみましょう。

結論

file_put_contentsを使用することで、サーバー上の任意の場所にファイルを出力することができます。

$file_path =  ログを書き込むファイルへのパス;
$data = ログファイルに出力したい内容;
file_put_contents($file_path, print_r($data, true));

試しに、functions.phpに以下のように書いてみてください。

$file_path =  __DIR__ . '/test.log';
$data = array('one' => 1, 'two' => 2, 'three' => 3);
file_put_contents($file_path, print_r($data, true));

__DIR__はPHPのマジック変数です
そのファイル(__DIR__を書いたファイル)の存在するディレクトリまでのパスを取得することができます。

書いたあとにブラウザでリロードすると、上記のコードを書いたfunctions.phpが置かれている位置と同階層に、test.logファイルが作成されます。

test.logファイルが作成される

test.logファイルの中身を見てみると、以下のようになっています。

test.logの中身

これは、先ほど書いた以下の記述が出力されています。

$file_path =  __DIR__ . '/test.log';
$data = array('one' => 1, 'two' => 2, 'three' => 3);
file_put_contents($file_path, print_r($data, true));

test.logというファイル名を変えたい場合は、上記1行目のtest.logという文字列を別の文字に置き換えてください。

これを今度はフックの中に書いてみましょう。

例えば、WordPressの管理画面のメニューのうち、使用していないメニューを消したいときに以下のように書くかと思います。

▼管理画面の不要なメニューを削除する

/**
 * 不要なメニューを非表示
 * (コメントアウトした行のメニューは表示される)
 */
add_action('admin_menu', 'my_add_remove_admin_menus');
function my_add_remove_admin_menus()
{
  global $menu;
  unset($menu[2]);  // ダッシュボード
  // unset($menu[4]);  // メニューの線1
  unset($menu[5]);  // 投稿
  // unset($menu[10]); // メディア
  // unset($menu[15]); // リンク
  // unset($menu[20]); // ページ
  unset($menu[25]); // コメント
  // unset($menu[59]); // メニューの線2
  // unset($menu[60]); // テーマ
  // unset($menu[65]); // プラグイン
  // unset($menu[70]); // プロフィール
  // unset($menu[75]); // ツール
  // unset($menu[80]); // 設定
  // unset($menu[90]); // メニューの線3
}

上記をみると、$menu[10]がメディアのメニューを意味してることが分かります。

この、「$menu[番号]の番号が、それぞれどのメニューに対応しているか」確認するためには、以下のように書いてみてください。

add_action('admin_menu', 'my_add_remove_admin_menus');
function my_add_remove_admin_menus()
{
  global $menu;


  $file_path =  __DIR__ . '/test.log';
  $data = $menu;
  file_put_contents($file_path, print_r($data, true));
}

書けたら、管理画面でブラウザをリロードします。

admin_menuアクションフックは管理画面で発動するフックなので、例えばトップページを表示している状態でリロードしてもtest.logの中身が変わりません。

その後、サーバー上に作成されたtest.logの中身を見てみると以下のようになっています。

私の場合一部メニューを削除しているので皆さんの出力結果とは異なるかもしれません。

$menuの中身が出力されている

この結果を見ると、$menu[10]は、メディアのメニューを意味していることなどが分かりますね!

無事、目的だったフック内の内容をデバッグできました!🎉

まとめ

改めて、この記事で紹介したデバッグ方法は以下の通りです。

$file_path =  ログを書き込むファイルへのパス;
$data = ログファイルに出力したい内容;
file_put_contents($file_path, print_r($data, true));

WordPressに限らずPHPだったらどの開発でも役立つと思うので、デバッグでこまったときにぜひ活用してみてください。👍