我应该用什么代替WP_CONTENT_DIR和WP_PLUGIN_DIR?


15

用于确定插件和内容目录的WordPress文档指出:

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

它接着名单WP_CONTENT_DIRWP_PLUGIN_DIR常量,因为这个主题和插件开发者不宜用,想必其中:

WordPress允许用户将wp-content目录放置在他们想要的任何位置,因此您绝不能假定插件将位于wp-content / plugins中,或者上传将位于wp-content / uploads中,或者主题将位于wp-内容/主题。

马克·贾奎斯(Mark Jaquith)在这里评论说,不应使用这些常量:

不要使用WP_PLUGIN_URL或WP_PLUGIN_DIR-插件可能不在插件目录中。

那么,在不使用这些常量的情况下引用插件,wp-content和theme文件夹的完整路径的公认方法是什么?

作为一个简单的示例,要输出所有已安装插件的完整路径,我可以这样做:

<?php
$plugins = get_plugins();

foreach ($plugins as $file => $details) {
    echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}

产生如下列表:

/var/www/wp-content/plugins/akismet/akismet.php
/var/www/wp-content/plugins/debug-bar/debug-bar.php
/var/www/wp-content/plugins/hello.php

(例如,如果我正在编写插件以允许用户有选择地将插件存档作为站点备份的一部分,则可能要这样做。)

如果使用WP_PLUGIN_DIR错误,建议的替代方法是什么?我找不到与之相对应wp_upload_dir()的插件,主题和wp-content文件夹,这使引用可能徘徊的主题和插件根目录成为问题。



2
@CharlesClarkson我在问题的第一句话中引用了该页面。它说不要使用上面的常量,但是不建议使用诸如之类的替代方法WP_PLUGIN_DIR,因此这里是我的问题。
尼克,

Answers:


17

当前路径或更深嵌套的参考文件

引用当前路径

plugin_dir_path( __FILE__ )."further/nesting/here.css";

插件和主题中工作

在插件中参考URl / URi

要指向插件或主题文件,请使用

plugins_url( "path/to/file", __FILE__ );

仅在插件中有效

wp-admin文件夹中的参考URl / URi

始终指向他们admin_url( 'some/path' );。也有get_admin_url()

wp-includes文件夹中的参考URl / Uri

指向他们 includes_url( 'some/path' );

相对于网站首页的URl / URi

home_url( 'etc' );get_home_url()为。与get_site_url()和类似site_url()。然后还有network_home_url()。你得到了network_admin_url()

wp-content 或重命名的目录

您可以重新定义wp-content文件夹名称。因此,您content_url()在那里使用。

如何获取plugins文件夹的URL?

如果使用WP_PLUGIN_DIR是错误的,建议的替代方法是什么?

plugins_url()无需任何参数即可简单使用。

如果您将其用于插件,那么它也适用于MU插件。

编辑#1如果您对当前插件的路径感兴趣,请使用plugin_basename();

编辑#2如果您对所有侧面活动插件都感兴趣,请使用wp_get_active_network_plugins();

如果您不在多站点上,请使用wp_get_active_and_valid_plugins();。这将考虑多站点/网络。请记住,如果您不在多站点上,但会直接使用它们,这将考虑它们sunrise.php

也可以通过来检索它们get_option( 'active_plugins' );不建议这样做,因为它没有考虑过滤器和插件验证,这种情况有时会发生。


进一步阅读

这个清单不胜枚举。查看QueryPosts.com上的搜索结果以获取更多信息。

文章进去绝对深度约的所有路径。


3
感谢您这样做,但是您的答案似乎处理的是URL,而不是绝对的服务器路径,这是我感兴趣的。例如,plugins_url()将URL返回到plugins文件夹,而不是服务器目录的完整路径。是否有类似的功能可以处理我不知道的目录?还是建议不要使用WP_PLUGIN_DIR常量完全是错误的?
尼克,

(我特别想查找除包含我自己的代码的插件以外的已安装插件的完整路径,以帮助说明。)
Nick

@Nick查看更新。
kaiser

“深入了解所有插件”的文章不再可用。而且我仍然不明白如何在不使用的情况下获取插件目录的绝对路径WP_PLUGIN_DIR
XedinUnknown

4
  1. 这将返回当前插件目录的服务器路径:

    plugin_dir_path(__FILE__)
    
    // example: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/

    参考:https : //codex.wordpress.org/Function_Reference/plugin_dir_path

    不要与:

    plugins_dir_path(__FILE__)

    (请注意,复数形式的“ plugin s ”。)

  2. 由于您不希望返回插件目录名称,因此我们必须将其删除。这是一个返回插件目录和文件名的函数:

    plugin_basename(__FILE__)
    
    // example: exampleplugin/exampleplugin.php
  3. 但是当然我们也不希望插件的文件名,因此我们需要将其删除plugin_basename(__FILE__)。要返回插件的文件名:

    basename(__FILE__)
    
    // example: exampleplugin.php
  4. 因此,要使用这些来构建插件目录的路径,我们可以使用str_replace()类似以下的功能:

    $myBnm = basename(__FILE__); // value: exampleplugin.php
    $myDir = plugin_basename(__FILE__); // value: exampleplugin/exampleplugin.php
    $myStr = str_replace($myBnm,"",$myDir); // value: exampleplugin/
    $myPth = plugin_dir_path(__FILE__); // value: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
  5. 而且,如果需要,可以将最后一行当然可以分配给变量,以供重复使用。

    代替:

    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    使用类似:

    $thePlgDir = str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    然后,在需要时:

    return $thePlgDir;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.