Wordpress获取插件目录

时间:2013-12-26 06:47:27

标签: wordpress wordpress-plugin

是否有任何函数可以在WordPress中返回插件的完整路径?

示例是

path/wp-contents/plugins/myplugin

我已尝试plugin_dir_path(__FILE__)但返回当前目录。

18 个答案:

答案 0 :(得分:39)

我建议使用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

答案 1 :(得分:27)

是的,根据plugin_dir_path的描述,它将为您提供当前的插件文件路径。但是根据你在这里提出的问题,你可以做下面的事情,不幸的是没有直接的方法,

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

答案 2 :(得分:13)

  

插件根路径代码

$dir = plugin_dir_path( __FILE__ );
// Example: /home/user/var/www/wordpress/wp-content/plugins/my-plugin/
     

插件路径代码

echo  WP_PLUGIN_DIR.'/plugin-name';

答案 3 :(得分:4)

我的解决方案是在plugin_dir_path中使用 DIR

plugin_dir_path( __DIR__ ) . $path_inside_plugin_folder;

以上应该为您提供服务器上插件文件夹的绝对路径,然后您可以使用插件文件夹中的任何文件加载您的变量

答案 4 :(得分:2)

plugins_dir_path() 是用词不当。
它将始终将路径返回到当前文件。

链接到法典:
https://developer.wordpress.org/reference/functions/plugin_dir_path/#more-information

  

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

     

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

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

IF 当前文件位于plugins目录中,然后是,该函数返回当前文件的路径。
但是,如果从其他任何目录中的文件调用此函数,则当前文件在plugins目录中为 not ,因此不会 返回插件目录的路径。 确实总是将路径返回到当前文件,但不带斜杠。

此处的大多数答案不正确,或仅“有时”正确。如果您的文件恰好位于plugins目录中,则这些答案仅会像他们所说的那样起作用!在所有其他情况下,它们都会给您造成误导的结果:当前文件的路径。


您的文件更有可能位于plugins文件夹的*子目录中。

在这种情况下,此编解码器向您展示了如何创建指向当前文件的URL: https://codex.wordpress.org/Function_Reference/plugins_url

  

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

     

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

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

答案:

这些解决方案解决方案与调用函数文件所在的位置无关。如果您的文件位于plugins文件夹或其子目录中,则上述选项将起作用。否则,您将需要采取以下措施:

WP_PLUGIN_DIR

WordPress 确实为插件的文件夹定义了一个常量:

食典:https://codex.wordpress.org/Determining_Plugin_and_Content_Directories

  

常量

     

WordPress在确定内容目录和插件目录的路径时会使用以下常量。这些插件或主题不应直接使用,而是出于完整性的目的在此处列出。

     

WP_CONTENT_DIR //不带斜杠,仅包含完整路径
  WP_CONTENT_URL //完整网址
  WP_PLUGIN_DIR //完整路径,没有斜杠
  WP_PLUGIN_URL //完整网址,不带斜杠

     

/// MS中默认可用,未在单个站点安装中设置
  //可以在单个站点安装中使用(照常:风险自负)
  UP // //(如果已设置,则上传相对于ABSPATH的文件夹)(例如:/ wp-content / uploads)


或者,如果您可以保证plugins文件夹位于WordPress安装的正常位置,则无论您的文件位于哪个目录(您要从中调用此函数),以上i_a's answer above的答案都适用在。 请在此线程中查看他的更完整的文章,但是为了没有“仅链接的答案”,我将在此处包括它,实质上,归结为使用以下内容(并将其转换为函数):

$plugins_root = WP_CONTENT_DIR . '/plugins';   

还是M07的帖子,也在此主题中,在这里:https://stackoverflow.com/a/28525164/5411817

答案 5 :(得分:2)

不幸的是,这里的大部分答案似乎都忘记了重要的事情。

除插件目录外,插件也可能在must use plugins dir

因此我们需要检查多个目录。示例函数

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;

}

答案 6 :(得分:1)

当您不在插件根目录内时,这是一个解决方案:

截至目前, 4.7.5 ,WordPress 没有 get_plugins_root()功能,就像有一个 get_theme_root( )功能。这可能是因为你真的不需要修改主题中的插件,插件根目录永远不会改变。

但是,如果您需要在开发主题时以编程方式影响插件,这将非常有用。

简单地说,就像WP对主题词所做的那样:

$plugin_root = WP_CONTENT_DIR . '/plugins';

或者,如果你需要一个函数,为什么不像WordPress为主题根那样做呢?

只需从 wp-includes / theme.php 复制 get_theme_root()功能,然后将其粘贴到主题的functions.php文件中,将函数重命名为get_plugins_root(),简化它,并更改主题&#39;插件&#39;插件在功能......

get_plugins_root() {

    $plugins_root = WP_CONTENT_DIR . '/plugins';

    /**
     * Filters the absolute path to the plugins directory.
     *
     * @since now
     *
     * @param string $plugins_root Absolute path to plugins directory.
     */
    return apply_filters( 'plugins_root', $plugins_root );
}

使用该路径,您现在可以添加您希望影响的插件文件夹名称。

$the_plugin_root = get_plugins_root()."/the-plugin-name/";

答案 7 :(得分:1)

正如Plugins Url功能参考页的Common Usage部分所述,这对我有用:

  

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

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

这个输出是:

http://domain/app/wp-content/plugins/my-plugin

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

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

答案 8 :(得分:1)

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

这意味着如果您在“ your_plugin_dir / sub_dir / file.php” 内部调用该函数, 将返回“ your_plugin_dir / sub_dir /”

如果要获取插件目录的 ROOT ,只需将__FILE__更改为__DIR__

plugin_dir_path( __DIR__ )

答案 9 :(得分:0)

当原始答案被接受时,此解决方案不可用。
如果当前文件是插件路径下的两个文件夹,请使用:

$plugin_path = plugin_dir_path(dirname(__FILE__, 2));
$plugin_url = plugin_dir_url(dirname(__FILE__, 2)); 

注意将数字作为 dirname() 的第二个参数,自 PHP v7.0.0 起可用。

使用常量的技术也适用于此,这次是在根级 plugin.php 之外:

// from pluginname/src/API/Common/Constants.php
define( 'MYPLUGIN_PLUGIN_DIR_PATH', plugin_dir_path(dirname(__FILE__, 3)) );

注意 PHP 手册站点上的 this comment

<块引用>

Dirname 喜欢弄乱斜线。

所以我对路径进行了规范化以避免双斜线和当前操作系统错误的斜线:

$normalized = wp_normalize_path( $plugin_path . '/' . $required_file);
if (file_exists($normalized))
  require_once $normalized;
else
  die(__('Required file does not exist') . ": $normalized");

答案 10 :(得分:0)

截至目前,没有任何函数只返回插件基目录的完整路径。

然而,WordPress 使用常量 WP_CONTENT_DIR 来实现这一点。但是,即使 WordPress 使用这个常量,他们也警告我们不要直接在我们的插件或主题中使用它。这是因为它可能会导致一些问题,例如当用户更改或重命名其插件的默认目录时。

使用 plugin_dir_path() 函数将返回文件所在目录的路径。因此,如果您从插件子文件夹内的 PHP 文件调用此函数,它将返回该子文件夹目录的路径,而不是插件的基本目录。

答案

现在,作为一种解决方法,我们可以在直接位于插件基本目录中的 PHP 文件中定义一个常量,然后将其值设置为调用 plugin_dir_path( __FILE__ ) 的结果。这样,我们就可以在插件的任何地方使用该常量来获取插件基目录的完整路径。

因此,打开一个直接位于插件基本目录中的 PHP 文件。例如:

../wp-content/plugins/myplugin/myplugin.php

然后,通过将其值设置为调用 plugin_dir_path() 函数的结果来定义一个常量。例如:

define( 'MYPLUGIN_PLUGIN_DIR_PATH', plugin_dir_path( __FILE__ ) );

这个常量现在保存了插件根目录的路径。所以,现在,如果你从插件的任何目录中的任何文件中回显该常量,如下所示:

echo MYPLUGIN_PLUGIN_DIR_PATH;

它将打印如下内容:

/home/example.com/public_html/wp-content/plugins/myplugin/

答案 11 :(得分:0)

如果从插件的子目录调用其他解决方案将不起作用,或者它们要求您对插件的目录名称进行硬编码,或者您需要定义一个全局变量。

我的解决方案使用了一个函数,该函数可以放置在插件的任何目录中,而无需您对某些内容进行硬编码。

function get_my_plugin_root_dir()
{
    // WP_PLUGIN_DIR will have something like "/home/michael/public_html/wp-content/plugins"
    // __DIR__ will have something like "/home/michael/public_html/wp-content/plugins/my-plugin-folder/the-dir-being-called-from
    
    // First, we remove WP's root plugin path from our __DIR__ path.
    $path_to_this_files_dir_without_wp_plugin_dir = str_replace(WP_PLUGIN_DIR, '', __DIR__);

    // Now, we're left with only our plugin's path, which looks like
    // this: "/my-plugin-folder/the-dir-being-called-from"

    // Next, we discard any sub-directories that are included with our
    // plugin's path and keep the first directory in the path, our 
    // plugin's directory name.
    $plugin_directory_name_only = explode(DIRECTORY_SEPARATOR, $path_to_this_files_dir_without_wp_plugin_dir)[1];

    // Now $plugin_directory_name_only has "my-plugin-folder"

    // Lastly, we build the plugin's complete root path using 
    // WP's root plugin directory and our plugin's root dir name.
    return WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_directory_name_only;
}

答案 12 :(得分:0)

您可以使用此方法获得它

plugin_dir_url( __DIR__ )

答案 13 :(得分:0)

有点迟到这个派对,但只是因为其他一些因此而失误。

var tableData = [String]() // [...] func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tableData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableViewController.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = tableData[indexPath.row] return cell } // [...] @IBAction func brandButton(_ sender: Any){ tableData = brandInformation tableViewController.reloadData() } @IBAction func profileButton(_ sender: Any){ tableData = profileInformation tableViewController.reloadData() } 将始终返回当前路径(调用它的文件所在的路径) 如果您希望root使用下面的代码

plugin_dir_path(__FILE__)

然后您可以定义常量

plugin_dir_path( dirname( __FILE__ ) )

答案 14 :(得分:0)

我会建议以下代码。如果您从任何子文件夹访问此功能。

plugins_url( 'images/logo.png' , dirname(__FILE__ ));

答案 15 :(得分:0)

您可以在主Php文件中定义变量。它应该是您的插件文件夹的根目录。 该文件应该在这里:... / wp-content / plugins / plugin-folder / my-plugin.php

您可以将此行添加到文件中。

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

您可以在插件的任何位置使用新变量。

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

我希望它会帮助别人。

答案 16 :(得分:-2)

正如@ tsl143所提到的,函数plugins_url()就是你想要的,以及__FILE__魔法常量。如果你从插件文件夹中的文件中调用它,它将引用该文件夹。

示例:

对于目录:

echo plugins_url( '' , __FILE__ ); 
//outputs: http://www.example.com/wp-content/plugins/my-plugin    

对于插件目录中的文件或子目录:

echo plugins_url( 'images/logo.png' , __FILE__ ); 
//outputs: http://www.example.com/wp-content/plugins/my-plugin/images/logo.png    

答案 17 :(得分:-2)