株式会社オンラインの金沢です。
ゴールデンウィークはいかがお過ごしでしたでしょうか。私はほとんど家に引きこもって、趣味に没頭しておりました。実は私、ギターも嗜んでおりまして、この連休で少し腕が上達したような気がします。気がするだけでしょうけどね。
さて、今回はWordPressのプラグイン開発中に遭遇した、ファイルパスなどの取得関数など説明を忘備録として書いておきます。連休明けにより既に忘れているところが多かったですので、復習しながら書きました。
PHPの定義済みの定数「__FILE__」
PHPであらかじめ定義される定数の中に「__FILE__」というものがあります。こちらは、現在処理が実行されているファイル名がフルパスで保存されています。ここでハマってしまいましたのは、「include」などでファイルを読み込んだときに、読み込み先では「__FILE__」の中身が変わっていたということです。例えば下記のようなコードです。
echo __FILE__; include_once 'content.php'; echo __FILE__;
echo __FILE__;
とてもいい加減な例ですが、こちらの実行結果は、次のようになります。
/サーバーによるディレクトリなど/index.php
/サーバーによるディレクトリなど/content.php
/サーバーによるディレクトリなど/index.php
同じ定数だと思って同じ値として使ってみましたら、失敗しました。定義済みの定数が一連の実行中に変化するものとは思いませんでした。
PHP関数の「dirname」
PHPの「dirname」という関数は、引数にパスを入れることで、そのパスのディレクトリを返してくれます。フルパス、絶対パス、相対パスでも何でも使えます。「__FILE__」と一緒に使われることが多く、先ほどの例と同じようなコードで見てみましょう。
echo dirname( __FILE__ ); include_once 'content.php';
echo dirname( __FILE__ );
実行結果は、
/サーバーのディレクトリ
/サーバーのディレクトリ
となります。もう少しひねってみまして、下記のような例を示します。
echo dirname( __FILE__ ); include_once 'page/content.php';
echo dirname( __FILE__ );
「include_once」で読み込むファイルを、1階層下の「page」というディレクトリにあるファイルにしてみました。こちらの場合の実行結果は、こうなります。
/サーバーのディレクトリ
/サーバーのディレクトリ/page
WordPressの関数「plugins_url」
ここからはWordPress専用の関数になります。「plugins_url」はプラグインのファイルが保存されているディレクトリまでのパスを、絶対パスで返す関数です。第2引数にプラグインファイルのフルパスを入れることで、そのプラグインの絶対パスを得られますので、通常は第2引数に「__FILE__」を入れて使います。第1引数は文字を入れることで、返り値のパスにファイル名やディレクトリを追加することができます。プラグインフォルダに格納した画像を読み込むときなどに使えます。
具体的な例として、「online-plugin」というプラグインを仮定して説明します。「online-plugin.php」というファイルを「online-plugin」というフォルダに入れて、プラグインとしてインストールします。「online-plugin.php」の中身は下記の通りです。
/* * Plugin Nameなどのプラグイン情報 */ function online_plugin_url_test() { echo plugins_url( '', __FILE__ ); } add_action( 'admin_head', 'online_plugin_url_test' );
「admin_head」のアクションフックは、「Hello Dolly」の表示のときに使われているフックです。こちらのプラグインを有効化しますと、管理画面の上のほうに「plugins_url」の返り値の「http://www.online-inc.jp/wp-content/plugins/online-plugin」が表示されます。
ここで注意するべきことは、「plugins_url」は第2引数の「__FILE__」に依存しているということです。プラグインファイルを多層構造にしている場合は、「plugins_url( ”, __FILE__ )」を実行しているファイルがプラグインのトップディレクトリ以外にある場合は、そのディレクトリまでの絶対パスが返されてしまいます。
WordPress関数の「plugin_basename」
WordPressで定義されている関数の「plugin_basename」は、引数にフルパスを入れることで、プラグインのトップディレクトリからそのファイルまでのパスを得ることができます。「plugins_url」と同じような例で見てみます。
function online_plugin_basename_test() { echo plugin_basename( __FILE__ ); } add_action( 'admin_head', 'online_plugin_basename_test' );
こちらの表示は「online-plugin/online-plugin.php」となります。得られた値を「dirname」に入れることで、プラグインの名前「online-plugin」を得ることができます。
まとめ
これらにより得られる値は実行ファイルの場所により変化するものもありますので、最初のファイルの始めに定数として定義しておくとよいでしょう。特に、プラグインのファイルを分割して開発を進める場合は必要性が大きいでしょう。PHP関数「define」を使った例と、その保存値をコメントアウトで示します。
define( 'ONLINE_PLUGIN_FILE', __FILE__ ); // /サーバーによるディレクトリなど/wp-content/plugins/online-plugin/online-plugin.php define( 'ONLINE_PLUGIN_DIRNAME', dirname( __FILE__ ) ); // /サーバーによるディレクトリなど/wp-content/plugins/online-plugin define( 'ONLINE_PLUGIN_URL', plugins_url( '', __FILE__ ) ); // http://www.online-inc.jp/wp-content/plugins/online-plugin define( 'ONLINE_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); // online-plugin/online-plugin.php
プラグインによっては、これら全て使うとは限りませんので、必要なものだけ定義すればよいと思います。
まだまだプラグイン開発に着手し始めたばかりですので、理解不十分なところもありますが、メモ程度に書き留めておきます。
金沢