Apa perbedaan antara get_home_path () dan ABSPATH?

27

Apa perbedaan antara get_home_path()dan ABSPATH? Bukankah maksud keduanya untuk menunjuk ke root instalasi WordPress?

Borek Bernard
sumber

Jawaban:

33

Mereka harus melakukan hal yang sama, tetapi dalam kondisi tertentu, mungkin tidak.

Catatan pertama:

Mengenai entri codex,

Deskripsi

Dapatkan jalur sistem file absolut ke akar instalasi WordPress.

Nilai Pengembalian

Jalur sistem file lengkap ke akar instalasi WordPress. Jika Anda menginstal wordpress di subfolder, itu akan menunjukkan lokasi subfolder

Contohnya

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

Ini menyatakan bahwa nilai kembali akan mengembalikan jalur subfolder jika Anda telah menginstal WordPress di sub-direktori. Ini sebenarnya, salah.

get_home_path()akan mengembalikan direktori root dari instalasi WordPress Anda, bahkan jika itu diinstal di sub-direktori. Itulah tujuan dari fungsinya.

Asumsikan instalasi WordPress Anda berada dalam sub-direktori bernama /dev,

Jika Anda mencatat panggilan ke ABSPATH, maka hasilnya akan menjadi, /var/www/htdocs/devyang bukan merupakan akar dari instalasi Anda. Akar instalasi Anda adalah /var/www/htdocs.

ABSPATHdidefinisikan pertama di wp-load.phpmana akan berlokasi di /var/www/htdocs/dev/wp-load.phpmaka di sinilah ABSPATHakan mengambil definisi dari.

Jika Anda memeriksa get_home_path()lebih lanjut, Anda akan mencatat bahwa jika site_urldan home_urlberbeda, maka sub-string diambil dari jalan yang diatur oleh posisi (kejadian pertama) dari sub-direktori yang ditemukan dalam 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 );
}

Karena itu, sebagai akibat dari ini, get_home_path()dan ABSPATHdapat mengembalikan hasil yang berbeda jika Anda menginstal WordPress di sub-direktori.

Kedua, pemanggilan get_home_path()harus dilakukan dalam konteks di mana yang wp-admin/includes/file.phptelah disebutkan telah dimasukkan.

Sebagai contoh menggunakan get_home_path()di dalam admin_inithook tidak apa-apa sedangkan menggunakannya di dalam inittidak.

Melihat file ini hanya akan dimasukkan dari dalam konteks admin (dashboard), jika Anda benar-benar membutuhkannya di luar konteks ini, Anda harus memasukkan file sendiri sebelum memanggil fungsi,

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

Ironisnya (atau tidak) yang menggunakan ABSPATH: D

Adam
sumber
Diterangkan dengan baik, meskipun saya pikir pengembang pihak ketiga tidak boleh menggunakan konstanta atau fungsi. Karena WordPress dapat ditemukan di mana saja , menempatkannya di luar root dokumen menyebabkan konstanta dan fungsi untuk mengembalikan misalnya /var/apps/wordpressbukan /var/www/htdocs. Sebaliknya gunakan $_SERVER['DOCUMENT_ROOT'], setidaknya jika Anda dapat memastikan bahwa root dokumen tidak akan berubah.
Fleuv
@ Fluv Memang ini yang sulit ... bahkan $_SERVER['DOCUMENT_ROOT']ada masalah ... misalnya mungkin tidak disetel atau disetel dengan benar dan seterusnya. Ada cara lain yang bisa saya pikirkan untuk menangani ini ... Masing-masing dengan peringatan mereka sendiri. Sangat menyenangkan :)
Adam
1
Solusi ini dijelaskan dengan baik dan bekerja persis seperti yang diinginkan setelah WP melempar kesalahan "tidak didefinisikan". Terima kasih;)
Chris Sprague
-1

Saya menggunakan home_url () untuk menautkan ke halaman "Beranda" dari WP. Terkadang, site_url () mungkin bukan home_url Anda () . Anda dapat mendefinisikan halaman tertentu sebagai beranda di Wordpress.

mdikici
sumber