In a question that is related to, but not the same as, How to link to images in my plugin regardless of the plugin folder's name
plugin-folder/plugin-main-file.php
plugin-folder/images/
containing all imagesplugin-folder/classes/
containing class definitionsplugin-folder/classes/class1-files
containing additional files for class 1plugin-folder/classes/class2-files
containing additional files for class 2- etc
To access images, I can use relative addressing, such as plugins_url( '../images/image.png', dirname( __FILE__ ) )
but this requires a knowledge of the file structure, and a level of hard-coding that leads to potential maintenance issues.
Alternatively, I can define a global constant (eg) define('PLUGIN_ROOT', basename(dirname(__FILE__)) . '/' . basename(__FILE__));
in my main-file.
Ideally, there is a Wordpress function that would give me the plugin base name, from anywhere in my plugin (ie always return /plugin-folder/
)... but I haven't found one. Is there such a beastie?
-- EDIT TO ADD --
I am also aware of plugins_url()
with no parameters... but this returns /wp-content/plugins
- ie without my plugin name!
In a question that is related to, but not the same as, How to link to images in my plugin regardless of the plugin folder's name
plugin-folder/plugin-main-file.php
plugin-folder/images/
containing all imagesplugin-folder/classes/
containing class definitionsplugin-folder/classes/class1-files
containing additional files for class 1plugin-folder/classes/class2-files
containing additional files for class 2- etc
To access images, I can use relative addressing, such as plugins_url( '../images/image.png', dirname( __FILE__ ) )
but this requires a knowledge of the file structure, and a level of hard-coding that leads to potential maintenance issues.
Alternatively, I can define a global constant (eg) define('PLUGIN_ROOT', basename(dirname(__FILE__)) . '/' . basename(__FILE__));
in my main-file.
Ideally, there is a Wordpress function that would give me the plugin base name, from anywhere in my plugin (ie always return /plugin-folder/
)... but I haven't found one. Is there such a beastie?
-- EDIT TO ADD --
I am also aware of plugins_url()
with no parameters... but this returns http://mydomain.ext/wp-content/plugins
- ie without my plugin name!
4 Answers
Reset to default 3I think you are looking for plugin_dir_url:
$url = plugin_dir_url(__FILE__);
$imageurl = $url.'images/someimage.png';
EDIT: Sorry I misread the question... that is only an answer to the linked question. You could check the parent directory recursively until you find the right one:
function base_plugin_dir($dirpath) {
if (substr(dirname($dir),-7) == 'plugins') {return $dirpath;}
else {$dirpath = base_plugin_dir($dirpath);}
return $dirpath;
}
function base_plugin_dir_url($filepath) {
$baseplugindir = base_plugin_dir(dirname($filepath));
$url = plugin_dir_url(trailingslashit($baseplugindir));
return $url;
}
Then you can get the URL using that function from whatever file:
$basepluginurl = base_plugin_dir_url(__FILE__);
$imageurl = $basepluginurl.'/images/wordpress.png';
OR
Better yet just set a constant from your main plugin file to use it later:
$url = plugin_dir_url(__FILE__);
define('MY_UNIQUE_PLUGIN_URL',$url);
So as to use in say /plugin/my-plugin/class/class1.php
$imageurl = MY_UNIQUE_PLUGIN_URL.'/images/wordpress.png';
Sorry for the late answer, below is the function I use to retrieve the plugin directory name in the format requested by @Andrew (i.e. with a trailing slash as mentioned in the comment to Kevin)
/**
* Retrieve the Plugin Directory
*
* Returns the root directory for current plugin with a trailing slash
*/
function current_plugin_dir() {
$base = plugin_basename( __FILE__ );
$slash = strpos($base,'/');
$plugin_dir = $loc? substr( $base, 0, $loc + 1): $base;
return $plugin_dir;
}
To remove the slash just leave out the '+ 1' in the $plugin_dir line.
Edit
My bad, in that case I can think of this.
$x = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
It should return
http://[url-path-to-plugins]/[custom-plugin]/
But straight forward class I don't think wordpress has one
Yes it is
from https://codex.wordpress/Function_Reference/plugin_basename
$x = plugin_basename( __FILE__ );
plugin_basename
may be what you want. If your plugin file is located at /wp-content/plugins/my-plugin/my-plugin.php
this would return:
$file = plugin_basename( __FILE__ ); // "my-plugin/my-plugin.php"
If you called the same thing from a sub-directory in your plugin, such as /wp-content/plugins/my-plugin/inc/my-plugin-include.php
it would return:
my-plugin/inc/my-plugin-include.php
If you want the current root directory for a plugin, then this custom function should do the trick:
/**
* Current Plugin Directory
*
* Returns the root directory for current plugin
*/
function current_plugin_dir() {
$basename = plugin_basename( __FILE__ );
return str_replace( __FILE__, '', $basename );
}