get_home_path()
和ABSPATH
有什么区别? 两者都不是指向WordPress安装根目录吗?
#1 楼
他们应该做同样的事情,但是在某些情况下可能做不到。首先请注意:
编解码器条目描述具有误导性
必须将
wp-admin/includes/file.php
包含在上下文中,否则调用get_home_path()
将导致调用未定义的函数。关于编解码器条目,
描述
获取WordPress安装根目录的绝对文件系统路径。
返回值
WordPress安装根目录的完整文件系统路径。如果在子文件夹中安装wordpress,它将显示子文件夹的位置。
示例
$path = get_home_path();
print "Path: ".$path; // Return "Path: /var/www/htdocs/" or "Path: /var/www/htdocs/wordpress/" if it is subfolder
它指出返回值将返回如果您已将WordPress安装在子目录中,则该子文件夹的路径。实际上,这是不正确的。
get_home_path()
将返回WordPress安装的根目录,即使它安装在子目录中也是如此。这就是该功能的目的。假设您的WordPress安装位于名为
/dev
的子目录中,http:// www .example.com / dev(
site_url
)(例如/ var / www / htdocs / dev)http://www.example.com/(
home_url
)如果您记录了对
ABSPATH
的呼叫,那么其结果将是/var/www/htdocs/dev
,这不是您的安装根目录。安装的根目录是/var/www/htdocs
。ABSPATH
最初是在wp-load.php
中定义的,它将位于/var/www/htdocs/dev/wp-load.php
,因此这是ABSPATH
的定义来源。如果您检查
get_home_path()
进一步说明,如果site_url
和home_url
不同,则将使用由字符串中子目录的位置(首次出现)所控制的路径的子字符串。function get_home_path() {
$home = set_url_scheme( get_option( 'home' ), 'http' );
$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );
if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {
$wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */
$pos = strripos( str_replace( '\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) );
$home_path = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos );
$home_path = trailingslashit( $home_path );
} else {
$home_path = ABSPATH;
}
return str_replace( '\', '/', $home_path );
}
因此,如果在子目录中安装了WordPress,则
get_home_path()
和ABSPATH
可能会返回不同的结果。其次,调用
get_home_path()
必须在已经包含上述提及的wp-admin/includes/file.php
的环境中进行。例如,在
get_home_path()
挂钩中使用admin_init
的示例很好,而在init
中不使用它。由于仅在admin(仪表盘)上下文中包含此文件,因此,如果您绝对需要在此上下文之外,则需要在调用函数之前自行包含该文件,
require_once(ABSPATH . 'wp-admin/includes/file.php');
具有讽刺意味的(或不)使用
ABSPATH
:D
评论
很好的解释了,尽管我认为第三方开发人员不应该使用常量或函数。由于WordPress可以位于任何地方,因此将其放置在文档根目录之外会导致常量和函数都返回例如/ var / apps / wordpress而不是/ var / www / htdocs。至少使用$ _SERVER ['DOCUMENT_ROOT'],至少可以确保文档根目录不会更改。
–luukvhoudt
18年2月13日在20:28
@Fleuv确实这是一个棘手的问题...甚至$ _SERVER ['DOCUMENT_ROOT']都有问题...例如可能未正确设置或正确设置等等。我也可以想到其他方法来解决此问题……每种方法都有自己的警告。很好玩:)
–亚当
18 Mar 19 '18在8:01
在WP抛出“未定义”错误之后,对该解决方案进行了很好的解释,并按预期工作。谢谢 ;)
–克里斯·斯普拉格(Chris Sprague)
18年7月9日在12:39