ABSPATH 是如何在 Wordpress 中定义的

Wordpress 使用 dirname(FILE) 定义 ABDPATH; FILE常量是 PHP 定义的一个变量,包含运行脚本的文件路径,dirname 返回路径的目录部分。

在 Wordpress 中,在 define.php 中这样做:

define('ABSPATH', dirname(__FILE__));

我反对使用 dirname() 的第一个反对意见是,它可能会返回包含反斜杠或者正斜杠作为目录分隔符的路径,具体取决于操作系统。
我建议人们只使用正斜杠,因为这种不一致可能会在极少数情况下导致错误。
开发人员也期待正斜杠;这就引出了我的下一个反对意见。

dirname() 函数将返回一个不带斜杠的路径。
这意味着我们不能轻易地通过查看路径来判断路径是目录还是文件。
这也让开发人员感到困惑,因为他们现在会问自己是否有斜线,并且他们可能会做出可能导致错误的假设。
返回的路径将如下所示:

/var/www/my-site-name/wp-content/plugins/some-plugin

我更喜欢的是,在处理目录时总是包含 tail斜杠。
出于这个原因,我宁愿使用这样的东西:

define('ABSPATH', rtrim(preg_replace('#[/\\]{1,}#', '/', realpath(dirname(__FILE__))), '/') . '/');

这可确保始终包含斜杠,甚至可以解决系统中在末尾添加斜杠的不一致问题(有些可能不会添加斜杠,因此我们改为修剪路径并手动添加)。
realpath() 也是需要的,因为我们要考虑 PHP 版本之间的不一致;例如,旧版本的 PHP 可能会返回相对路径而不是绝对路径,而 realpath 应该更正这一点。
最后, preg_replace 将用正斜杠替换可能的反斜杠以提高一致性。

在更新的 PHP 版本中,比如 5.3+,这段代码可以进一步简化:

define('ABSPATH', rtrim(preg_replace('#[/\\]{1,}#', '/', __DIR__), '/') . '/');

阅读:确定 PHP 中的基本路径

当然,我们不仅仅是 Wordpress 开发人员——我们首先是 PHP 开发人员——但作为 PHP 开发人员,我们也知道安全地确定目录路径可能很困难。
它不像使用 $_SERVER['DOCUMENT_ROOT'] 那样简单,因为这个变量可能不会在所有服务器上都正确填写。

在 Wordpress 中确定文件系统路径

Wordpress 通过自己的内部常量和函数公开了开发人员所需的几乎任何路径,因此我们真的不应该求助于使用 PHP 来确定路径。

Wordpress 已经定义了一个常量,即 ABSPATH 变量,它包含 Wordpress 安装目录的绝对路径。
ABSPATH 的问题在于它对于罕见的情况可能不够一致,但由于我们正在使用 Wordpress,我建议我们坚持使用它,而不管潜在的问题。

ABSPATH 常量变量的内容可能如下所示:

/var/www/my-site-name/wp-content/plugins/some-plugin

另外我们还得到了 echo get_stylesheet_directory();功能。
这将返回激活主题目录的绝对路径。
一个例子是:

/var/www/my-site-name/wp-content/themes/Name-of-theme

此函数的名称相当具有误导性,因为它与样式表无关。
但别介意..

同样,在开发Wordpress插件时,我们可以使用echo plugin_dir_path();获取插件目录的路径:

/var/www/test-stay-local/wp-content/plugins/name-of-plugin/

那个 plugin_dir_path();最后产生一个斜线。
与 Wordpress 中的其他文件系统功能相比,这是不一致的。
这只是我们应该注意的事情。

注意不一致

一旦我们知道 Wordpress 在目录路径中不包含斜杠,记住在需要的地方手动包含斜杠可能就不难了;但这只是表明,即使是使用文件系统路径这样简单的事情也会令人困惑。

我个人更喜欢一致性,因为 Windows 也支持正斜杠作为目录分隔符,我认为我们不妨在任何地方都采用它。

还应该注意的是,PHP 为系统目录分隔符定义了一个常量,但我不确定它有多大意义,因为 Windows 也支持正斜杠。
事实上,我们甚至可以毫无问题地混合它们:

c:\some-directory/path/with\mixed\separators\

当然,我们不应该这样做,因为在某些情况下这可能会导致错误。
例如,在一段随机的第三方代码中可能有一个函数只允许使用正斜杠。
在使用 preg_replace() 之类的函数之前,也需要转义反斜杠;

日期:2020-06-02 22:17:23 来源:oir作者:oir