Plugin base URL

时间:2016-04-06 作者:Andrew

在一个与之相关但不相同的问题中,How to link to images in my plugin regardless of the plugin folder's name

  • plugin-folder/plugin-main-file.php
  • plugin-folder/images/ 包含所有图像plugin-folder/classes/ 包含类定义plugin-folder/classes/class1-files 包含类1的其他文件plugin-folder/classes/class2-files 包含用于类2等访问图像的附加文件,我可以使用相对寻址,例如plugins_url( \'../images/image.png\', dirname( __FILE__ ) ) 但这需要了解文件结构,以及导致潜在维护问题的硬编码级别。

    或者,我可以定义一个全局常量(eg)define(\'PLUGIN_ROOT\', basename(dirname(__FILE__)) . \'/\' . basename(__FILE__)); 在我的主文件中。

    理想情况下,有一个Wordpress函数可以从插件中的任何位置为我提供插件的基本名称(即始终返回/plugin-folder/)... 但我还没有找到。有这样的动物吗?

    --编辑以添加--

    我也知道plugins_url() 没有参数。。。但这又回来了http://mydomain.ext/wp-content/plugins - ie没有我的插件名!

4 个回复
最合适的回答,由SO网友:majick 整理而成

我想你在找plugin_dir_url:

$url = plugin_dir_url(__FILE__);

$imageurl = $url.\'images/someimage.png\';
EDIT: 对不起,我误读了这个问题。。。这只是对相关问题的回答。可以递归检查父目录,直到找到正确的目录:

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;
}
然后,您可以使用该函数从任何文件中获取URL:

$basepluginurl = base_plugin_dir_url(__FILE__);
$imageurl = $basepluginurl.\'/images/wordpress.png\';

OR

更好的是,只需从主插件文件中设置一个常量,以便以后使用:

$url = plugin_dir_url(__FILE__);
define(\'MY_UNIQUE_PLUGIN_URL\',$url);
以便在say中使用/plugin/my-plugin/class/class1.php

$imageurl = MY_UNIQUE_PLUGIN_URL.\'/images/wordpress.png\';

SO网友:Clinton

很抱歉回答得太晚,下面是我用来以@Andrew请求的格式检索插件目录名的函数(即,在给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;
}
要删除斜杠,只需在$plugin\\u dir行中去掉“+1”。

SO网友:Elektra

Edit

我的错,那样的话,我能想到这个。

$x = WP_PLUGIN_URL.\'/\'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
它应该会回来

http://[url-path-to-plugins]/[custom-plugin]/

但直截了当的课我认为wordpress没有

是的是的

从…起https://codex.wordpress.org/Function_Reference/plugin_basename

$x = plugin_basename( __FILE__ );

SO网友:Kevin Leary

plugin_basename 也许是你想要的。如果插件文件位于/wp-content/plugins/my-plugin/my-plugin.php 这将返回:

$file = plugin_basename( __FILE__ ); // "my-plugin/my-plugin.php"
如果您从插件中的子目录调用了相同的内容,例如/wp-content/plugins/my-plugin/inc/my-plugin-include.php 它将返回:

my-plugin/inc/my-plugin-include.php
如果您想要插件的当前根目录,则此自定义函数应执行以下操作:

/**
 * Current Plugin Directory 
 * 
 * Returns the root directory for current plugin
 */
function current_plugin_dir() {
    $basename = plugin_basename( __FILE__ );

    return str_replace( __FILE__, \'\', $basename );
}

相关推荐

Plugin Paths Issue

我正在使用一个插件,它有几个实例,它使用硬编码路径,而不是使用WP函数来查找路径。这里的问题是,它引用的是wp内容,但我已经更改了wp配置文件中的wp\\u content\\u FOLDERNAME设置(过去有这样做的要求)。无论如何,有没有一种方法可以在不更新插件代码库本身的情况下实现这一点(即允许它在将来进行升级)。我想这与扩展插件而不必编辑代码库的整个想法是一致的。