问题描述

get_home_path()ABSPATH 有什么区别?两点都不指向 WordPress 的安装根?

最佳解决方案

他们应该做同样的事情,但在某些情况下,可能不会。

首先注意:

  • codex 条目描述是有误导性的

  • wp-admin/includes/file.php 必须包含在上下文中,否则调用 get_home_path()将导致调用未定义的函数。

关于食典进口,

Description

Get the absolute filesystem path to the root of the WordPress installation.

Return Value

Full filesystem path to the root of the WordPress installation. If you install wordpress in subfolder, it will show subfolder location

Examples

$path = get_home_path(); print "Path: ".$path; // Return "Path: /var/www/htdocs/" or "Path: /var/www/htdocs/wordpress/" if it is subfolder 

它声明如果您在 sub-directory 中安装了 WordPress,返回值将返回子文件夹的路径。这其实是错误的。

get_home_path()将返回您的 WordPress 安装的根目录,即使它安装在 sub-directory 中。这就是功能的目的。

假设您的 WordPress 安装在名为/dev 的 sub-directory 中,

如果您登录到 ABSPATH,那么其结果将是/var/www/htdocs/dev,而不是您安装的根目录。您的安装根是/var/www/htdocs

ABSPATH 首先在 wp-load.php 中定义,其位于/var/www/htdocs/dev/wp-load.php,因此这是 ABSPATH 将从其定义的位置。

如果您进一步检查 get_home_path(),您将会注意到,如果 site_urlhome_url 不同,则采用由字符串中发现的 sub-directory 的位置 (首次发生) 控制的路径的 sub-string 。

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 安装在 sub-directory 中,get_home_path()ABSPATH 可能会返回不同的结果。

其次,调用 get_home_path()必须在已经包含所提及的 wp-admin/includes/file.php 的上下文中完成。

作为使用 admin_init admin_init 中的 get_home_path()钩子的一个例子,在 init 中使用它是不错的。

看到这个文件只能从管理 (仪表板) 上下文中包含,如果你绝对需要它在这个上下文之外,你需要在调用该函数之前自己包括这个文件,

require_once(ABSPATH . 'wp-admin/includes/file.php');

讽刺的是 (或不) 使用 ABSPATH:D

参考文献

注:本文内容整合自 google/baidu/bing 翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为 @) 。