WordPress获取插件目录

77

有没有一个函数可以返回WordPress中我的插件的完整路径?

示例:

path/wp-contents/plugins/myplugin

我已经尝试了 plugin_dir_path(__FILE__),但返回的是当前目录。

19个回答

106

我建议使用WordPress内部常量来解决这个问题:

$my_plugin = WP_PLUGIN_DIR . '/my-plugin';

if ( is_dir( $my_plugin ) ) {
    // plugin directory found!
}

替代方案

另一个有效的替代方案是计算从URL中更复杂/令人困惑的路径。我不会使用这段代码:

$plugins_url = plugins_url();
$base_url = get_option( 'siteurl' );
$plugins_dir = str_replace( $base_url, ABSPATH, $plugins_url );
// Now $plugins_dir is same as the WP_PLUGIN_DIR constant.

$my_plugin = $plugins_dir . '/my-plugin';

在这种情况下,我的意见是:使用常量WP_PLUGIN_DIR


9
值得一提的是,名称 plugin_dir_path 非常误导人,它实际上与插件并没有什么关系,它只是 trailingslashit 的封装器,而后者只是在您提供的任何值上运行 dirname() - William Turrell
无法在Vagrant中工作,提供/srv/www/yoursite/路径。WordPress建议使用plugins_url('myscript.js', __FILE__); - gregbast1994
1
@gregbast1994 没错(也是预期的)。这段代码不会返回URL,而是插件文件夹的绝对路径。 - Philipp

56

根据plugin_dir_path的描述,它将为您提供当前插件文件路径。但是,根据您在此提出的要求,您可以像下面这样做,不幸的是没有直接的方法:

$plugin_dir = ABSPATH . 'wp-content/plugins/plugin-folder/';

编辑:18-09-2021

最佳实践是使用以下代码与最新版本的WP_PLUGIN_DIR:

$plugin_dir = WP_PLUGIN_DIR . '/plugin-folder';

3
有没有一种方法可以不手动指定插件文件夹?就像plugin_url一样,但返回的是绝对路径而不是URL路径。 - Cindy93
9
这不是一个好的示例:在WordPress安装中,'wp-content'可以拥有任何名称,如果这种情况发生,此代码将会出错。 - Philipp
21
是的,这很糟糕;你应该使用 WP_PLUGIN_DIR 代替。 - slikts
4
我个人认为使用WP_PLUGIN_DIR是一个不错的解决方案,这确实会使它变得更好。 - Robbiegod
3
根据WordPress文档这些常量不应直接被插件或主题使用,但为了完整性而列在此处。 然后列出了一些常量,包括WP_PLUGIN_DIR - Carter Pape
显示剩余2条评论

20
代码插件根路径
$dir = plugin_dir_path( __FILE__ );
// Example: /home/user/var/www/wordpress/wp-content/plugins/my-plugin/

插件路径代码

echo  WP_PLUGIN_DIR.'/plugin-name';

7
只有在调用位于插件目录根部的文件时,它才会提供插件目录。当你将 __FILE__ 传递给它时,它只是检索当前文件的目录。 - Carter Pape

15

plugins_dir_path()这个函数名不准确。
它将始终返回当前文件的路径。

代码库链接:
https://developer.wordpress.org/reference/functions/plugin_dir_path/#more-information

它是trailingslashit( dirname( $file ) );的包装器。

名称中的“插件”部分是误导性的 - 它可以用于任何文件,并且除非您在插件的基本目录中的文件中调用它,否则不会返回插件的目录。

实际上,它是trailingslashit()函数的同义词。

IF当前文件位于plugins目录中,then是的,该函数将返回当前文件的路径。
但是,如果您从任何其他目录的文件中调用此函数,则当前文件不在插件目录中,因此它将does NOT返回到插件目录的路径。它always返回当前文件的路径,但没有尾随斜杠。

这里的大多数答案都是不正确的,或者只有“有时”才是正确的。只有当您的文件恰好已位于插件目录中时,这些答案才能按照它们所说的那样工作!在所有其他情况下,它们将为您提供误导性的结果:当前文件的路径。


你的文件更可能在插件文件夹的*子目录*中。

如果是这种情况,此文档将向您展示如何创建到当前文件的URL: https://codex.wordpress.org/Function_Reference/plugins_url

如果您在嵌套在插件目录子目录中的文件中使用了plugins_url()函数,则应使用PHP的dirname()函数:

<?php echo '<img src="' . plugins_url( 'images/wordpress.png', dirname(__FILE__) ) . '" > '; ?>

然后您需要删除文件名以获取路径。 或使用``

答案:

这些解决方案与调用函数的文件位于何处无关。如果您的文件位于插件文件夹或其子目录中,则上述选项将起作用。否则,您将需要采用以下方法之一:

WP_PLUGIN_DIR

WordPress确实定义了常量,用于插件文件夹: Codex: https://codex.wordpress.org/Determining_Plugin_and_Content_Directories

常量 WordPress在确定内容和插件目录的路径时使用以下常量。这些常量不应直接被插件或主题使用,但为了完整性而在此列出。 WP_CONTENT_DIR //没有尾随斜杠,仅全路径 WP_CONTENT_URL //全URL WP_PLUGIN_DIR //全路径,没有尾随斜杠 WP_PLUGIN_URL //全URL,没有尾随斜杠 //默认情况下在MS中可用,在单站点安装中未设置 //可以在单站点安装中使用(通常要自担风险) UPLOADS //(如果设置,则为相对于ABSPATH的上传文件夹)(例如:/wp-content/uploads)
或者,如果您可以保证插件文件夹位于WordPress安装的正常位置,则i_a上面的答案答案将适用于您想要从中调用此函数的任何目录的文件。请参见他在这个线程中更完整的帖子,但为了避免“链接只有答案”,我将在此处包含它,基本上,它归结为使用以下内容(并将其转换为函数):
$plugins_root = WP_CONTENT_DIR . '/plugins';   

或者 M07 在这个帖子中的回复,可以在这里找到:https://dev59.com/02Ii5IYBdhLWcg3w9wQU#28525164


非常好的答案。谢谢。 - Genaut

11

虽然我来晚了,但如果有人看到这篇文章,请留意以下内容。

plugin_dir_path(__FILE__)始终会返回当前路径(调用它的文件所在的位置)。
如果你想获取根目录,请使用以下代码:

plugin_dir_path( dirname( __FILE__ ) )

接着,您可以定义一个常量:

define( 'YOUR_PLUGIN_DIR', plugin_dir_path( dirname( __FILE__ ) ) );
require_once YOUR_PLUGIN_DIR . 'includes/admin-page.php'
require_once YOUR_PLUGIN_DIR . 'admin/classes.php'

6

您可以在主PHP文件中定义常量。它应该位于插件文件夹的根目录下。

文件应该放在这里:.../wp-content/plugins/plugin-folder/my-plugin.php

您可以在文件中添加以下行。

define( 'MYPLUGIN__PLUGIN_DIR_PATH', plugins_url( '', __FILE__ ) );

在你的插件中,你可以随时使用新常量。

public function Test() 
    {   
            $folder2 = MYPLUGIN__PLUGIN_DIR_PATH . '/folder1/folder2/';
           // $folder2 = .../wp-content/plugins/plugin-folder/folder1/folder2/
    }

我希望这能对某些人有所帮助。


2
好的解决方案,将plugins_url更改为plugin_dir_path。 - lukenofurther

5

如在插件Url函数参考页面的“常见用法”部分中所述,以下是我使用的方式:

如果您正在使用plugins_url()函数来访问嵌套在您的插件目录子目录中的文件,则应使用PHP的dirname()函数:

echo plugins_url('', dirname(__FILE__) );

这个的输出结果是:
http://domain/app/wp-content/plugins/my-plugin

调用该函数的文件是位于 includes 下的我的 functions.php 文件,因此我的文件的完整路径为:

http://domain/app/wp-content/plugins/my-plugin/includes/functions.php

3
我建议使用以下代码。如果您从任何子文件夹访问此功能。
plugins_url( 'images/logo.png' , dirname(__FILE__ ));

3

plugin_dir_path( __FILE__ )将为您提供当前文件的插件路径。

这意味着,如果您在"your_plugin_dir/sub_dir/file.php"中调用此功能,将返回"your_plugin_dir/sub_dir/"

如果您想获取您的插件目录的根目录,请将__FILE__更改为__DIR__

plugin_dir_path( __DIR__ )

6
实际上,__DIR__ 只会向上移动一个目录,而不是将您带到根目录。 /wp-content/plugins/my-plugin/include/classes/ 将变为 /wp-content/plugins/my-plugin/include/ - Aaron

3
很遗憾,这里的大多数答案似乎忘了一件重要的事情。
除了插件目录之外,插件也可能在必用插件(mu-plugins)目录中。
因此,我们需要检查多个目录。 一个示例函数如下:
function get_plugin_dir_path($pluginFolderName){

    if ( defined( 'WPMU_PLUGIN_DIR' ) && file_exists( trailingslashit( WPMU_PLUGIN_DIR ) . $pluginFolderName ) ) {
        return trailingslashit( WPMU_PLUGIN_DIR ) . $pluginFolderName;
    } elseif ( defined( 'WP_PLUGIN_DIR' ) && file_exists( trailingslashit( WP_PLUGIN_DIR ) . $pluginFolderName ) ) {
        return trailingslashit( WP_PLUGIN_DIR ) . $pluginFolderName;
    }
    return false;

}

1
我建议首先检查默认的插件目录。这样插件存在的可能性更大,从而减少了必要的处理。 - Maxwell s.c
实际上,我是有意为之的。我的插件具有优先级,如果你使用了重复的插件(并且插件检查函数是否已定义),那么第一个将被使用。 - Maciej Paprocki
为了澄清未来的读者,这只适用于多站点WordPress安装,对吗@MaciejPaprocki? - ahaurat
1
这在使用必须使用插件的安装中是必需的。https://wpscholar.com/blog/wordpress-must-use-plugins/。可以在mu和非mu上使用。 - Maciej Paprocki
必须使用的插件可以在多站点和单站点安装中找到。 - SherylHohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接