WordPressのplugin_basename()とかplugins_url()の使い方のまとめ

WordPressのプラグインを作っていると、plugin_basename()plugins_url()と言う2つの関数を知ったので、今のうちに使い方とかをまとめておく。

plugin_basename()の使い方

plugin_basename()は、第1引数として与えられたファイル名をプラグインディレクトリ以下の相対パスとして返す関数。

具体的には、/home/www/wp-content/plugins/myplugin/myplugin.phpというファイル名の場合は、myplugin/myplugin.phpと言う文字列が戻り値として返ってくる。

実際には、以下の様にして使う事が多い

<?php
$plugin_name = plugin_basename(__FILE__);

plugin_basename()の仕組み

plugin_basename()自体は、WordPress/plugin.php at master · WordPress/WordPressのページに書かれている。

<?php
function plugin_basename($file)
{
	global $wp_plugin_paths;
	// $wp_plugin_paths contains normalized paths.
	$file = wp_normalize_path($file);
	arsort($wp_plugin_paths);

	foreach ($wp_plugin_paths as $dir => $realdir) {
		if (strpos($file, $realdir) === 0) {
			$file = $dir . substr($file, strlen($realdir));
		}
	}
	
	$plugin_dir    = wp_normalize_path(WP_PLUGIN_DIR);
	$mu_plugin_dir = wp_normalize_path(WPMU_PLUGIN_DIR);
	$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#', '', $file); // get relative path from plugins dir
	$file = trim($file, '/');
	return $file;
}

色々処理があるが、大事なのは最後の5行。結局plugin_basename()でやっているのは、引数のファイル名からWP_PLUGIN_DIR(/wp-content/plugins/)以上のディレクトリ名をpreg_replace関数を使って正規表現で削除しているだけなのだ。

<?php

$plugin_dir    = wp_normalize_path(WP_PLUGIN_DIR);
$mu_plugin_dir = wp_normalize_path(WPMU_PLUGIN_DIR);

$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#', '', $file); // get relative path from plugins dir
$file = trim($file, '/');
return $file;

補足として、途中で出てくるwp_normalize_path()と言う関数は、ディレクトリのパスの表現を/に統一する関数。Windowsだとディレクトリのパスを¥で表現している場合があるので、/で統一してディレクトリを扱いやすくしている。

plugin_urlの使い方

plugin_urlは、pluginの絶対パスを返す関数。

<?php plugins_url( $path, $plugin ); ?>

例えば、プラグインのディレクリ構造が以下の様になっているとする。

plugins - oreore_plugins - css - style.css
oreore_plugins.php

例えば、oreore_plugins.php内で、css/style.cssの絶対パスを取得したい場合は以下の様に書くと良い。

<?php plugins_url("css/style.css", plugin_basename(__FILE__) ); ?>

plugins_url()の仕組み

pugins_url()でやっていることは、先ほど説明したplugin_basename()と逆のことをしている、と言える。(完全に逆ではないが)

<?php
function plugins_url($path = '', $plugin = '')
{
	$path          = wp_normalize_path($path);
	$plugin        = wp_normalize_path($plugin);
	$mu_plugin_dir = wp_normalize_path(WPMU_PLUGIN_DIR);
	if (!empty($plugin) && 0 === strpos($plugin, $mu_plugin_dir)) {
		$url = WPMU_PLUGIN_URL;
	} else {
		$url = WP_PLUGIN_URL;
	}
	$url = set_url_scheme($url);
	if (!empty($plugin) && is_string($plugin)) {
		$folder = dirname(plugin_basename($plugin));
		if ('.' != $folder) {
			$url .= '/' . ltrim($folder, '/');
		}
	}
	if ($path && is_string($path)) {
		$url .= '/' . ltrim($path, '/');
	}
	/**
	 * Filters the URL to the plugins directory.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url    The complete URL to the plugins directory including scheme and path.
	 * @param string $path   Path relative to the URL to the plugins directory. Blank string
	 *                       if no path is specified.
	 * @param string $plugin The plugin file path to be relative to. Blank string if no plugin
	 *                       is specified.
	 */
	return apply_filters('plugins_url', $url, $path, $plugin);
}

詳しくは、「plugins_url」を参照すること。

ReratedPosts

WordPressのget_template_part()はどのような仕組みになっているのか?
WordPressのディレクトリやファイルのパーミッションは何がベストなのか?
WordPressのapply_filters、do_action、add_filter、add_actionの使い方とか違いとか