web-dev-qa-db-ja.com

Get_home_path()とABSPATHの違いは何ですか?

get_home_path()ABSPATHの違いは何ですか?両者の意味がWordPressのインストールルートを指しているのではないですか?

24
Borek Bernard

彼らはshouldは同じことをしますが、特定の条件下ではそうではありません。

まず最初に:

  • codex エントリの説明が誤解を招く
  • 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というサブディレクトリ内にあると仮定します。

ABSPATHへの呼び出しをログに記録すると、その結果は、インストールのルートであるnot/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が異なる場合、サブストリングのサブディレクトリの位置(最初の出現)によって管理されるパスのサブストリングが取得されることに注意してください。文字列。

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 が既に含まれているコンテキストで実行する必要があります。

例として、admin_initフック内で get_home_path() を使用するのは問題ありませんが、init内で使用するのは適切ではありません。

このファイルは管理(ダッシュボード)コンテキスト内からのみインクルードされるため、このコンテキスト外で絶対に必要な場合は、関数を呼び出す前に自分でファイルをインクルードする必要があります。

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

皮肉なことに(またはそうではない)、ABSPATHを使用します:D

31
Adam