get_plugin_data関数

WordPressのテーマ情報が取得できるのであれば、プラグインの情報ももちろん取得できるでしょと思って調べていたらやっぱりあった。get_plugin_dataという関数を発見したので、早速自分の作ったプラグインに実装しようと思い試してみることに。

プラグインのコアファイルのコンストラクタで以下のコードを書いてみました。

$data = get_plugin_data( __FILE__ );
var_dump( $data );

実行すると……エラーが出るんですけど!?!?

Fatal error: Uncaught Error: Call to undefined function get_plugin_data() ......

どうやら「get_plugin_dataなんて関数ないよ」と言っている模様。関数のリファレンスを見ると、定義されているファイルは、wp-admin/includes/plugin.phpに定義されているので、そのファイルを読み込まないといけないようです。それで以下のように追記。

if ( is_admin() ) {
	if( !function_exists('get_plugin_data') ) {
		require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
	}
	$data = get_plugin_data( __FILE__ );
	var_dump( $data );
}

ページ側では、そもそもwp-admin/includes/plugin.phpを読み込めないので、is_admin関数で管理画面だった時にだけ処理を通します。そして、get_plugin_data関数が存在しなかった場合にplugin.phpファイルを読み込むようにしました。これで、$dataの中身を見ると以下のように出力されました。(WordPress Posted Displayプラグインで試しています。)

array(11) {
  ["Name"]=>
  string(24) "WordPress Posted Display"
  ["PluginURI"]=>
  string(45) "https://github.com/miiitaka/wp-posted-display"
  ["Version"]=>
  string(5) "2.4.2"
  ["Description"]=>
  string(249) "投稿記事情報をウィジェットやショートコードで表示させるプラグインです。閲覧履歴をCookieに保存して表示することもできます。 <cite>By <a href="https://www.terakoya.work/">Kazuya Takami</a>.</cite>"
  ["Author"]=>
  string(54) "<a href="https://www.terakoya.work/">Kazuya Takami</a>"
  ["AuthorURI"]=>
  string(26) "https://www.terakoya.work/"
  ["TextDomain"]=>
  string(17) "wp-posted-display"
  ["DomainPath"]=>
  string(10) "/languages"
  ["Network"]=>
  bool(false)
  ["Title"]=>
  string(84) "<a href="https://github.com/miiitaka/wp-posted-display">WordPress Posted Display</a>"
  ["AuthorName"]=>
  string(13) "Kazuya Takami"
}

あ、取れた。Versionも取得できているのでこれを使えば良さそう……と思うのですが、コアファイルを読み込んだりしないといけないのが、今一しっくりこないなぁ~と思って他の方法がないか調べていたらあった。

get_file_data関数

get_file_data関数なるものを発見。シンプルに以下のような指定で取得できました。

if ( is_admin() ) {
	$data = get_file_data( __FILE__, array( 'Version' ) );
	var_dump( $data );
}

第二引数にヘッダーのフォーマットを指定しないといけない模様。そちらのほうが必要な情報だけ取得できるので便利。出力すると以下のように取得できます。

array(1) {
  ["version"]=>
  string(5) "2.4.2"
}

取れた!\(^o^)/
テーマ情報の取得もこのやり方で良いのでは?と思ってしまった。WP_Themeオブジェクトと比較してどちらがパフォーマンスが良いんだろう?今度調べてみよ。