get_home_path () และ ABSPATH แตกต่างกันอย่างไร


27

ความแตกต่างระหว่างget_home_path()และABSPATHคืออะไร จุดทั้งคู่ชี้ไปยังรูทการติดตั้ง WordPress หรือไม่

คำตอบ:


33

พวกเขาควรทำสิ่งเดียวกัน แต่ภายใต้เงื่อนไขบางอย่างอาจไม่

ประการแรกจากทั้งหมด:

  • ว่าCodexคำอธิบายรายการเป็นความเข้าใจผิด
  • ที่wp-admin/includes/file.phpจะต้องรวมอยู่ในบริบทการโทรอื่นget_home_path()จะนำไปสู่การเรียกฟังก์ชั่นที่ไม่ได้กำหนด

เกี่ยวกับรายการ codex

ลักษณะ

รับเส้นทางของระบบไฟล์ที่แน่นอนไปสู่รูทของการติดตั้ง 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ยังผลลัพธ์ที่จะเป็น/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 );
}

ดังนั้นเป็นผลมาจากสิ่งนี้get_home_path()และABSPATHอาจส่งคืนผลลัพธ์ที่แตกต่างกันหากคุณมี WordPress ติดตั้งในไดเรกทอรีย่อย

ประการที่สองการโทรget_home_path()จะต้องกระทำในบริบทที่wp-admin/includes/file.phpรวมความสบายไว้แล้ว

ตัวอย่างเช่นการใช้get_home_path()ภายในadmin_initเบ็ดเป็นเรื่องปกติที่การใช้ภายในinitไม่ได้

การเห็นว่าไฟล์นี้ถูกรวมไว้ในบริบทผู้ดูแลระบบ (แดชบอร์ด) เท่านั้นหากคุณต้องการมันนอกบริบทนี้คุณจะต้องรวมไฟล์ด้วยตัวคุณเองก่อนที่จะเรียกใช้ฟังก์ชัน

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

แดกดัน (หรือไม่) ซึ่งใช้ABSPATH: D


อธิบายได้ดีทั้งหมดฉันคิดว่านักพัฒนาบุคคลที่สามไม่ควรใช้ค่าคงที่หรือฟังก์ชัน เพราะWordPress สามารถอยู่ที่ใดก็ได้เช่นวางไว้นอกรากเหง้าเอกสารทั้งคงที่และฟังก์ชั่นที่จะกลับมาแทน/var/apps/wordpress /var/www/htdocsใช้$_SERVER['DOCUMENT_ROOT']อย่างน้อยถ้าคุณมั่นใจได้ว่ารูทของเอกสารจะไม่เปลี่ยนแปลง
Fleuv

@Fleuv แน่นอนว่านี่เป็นสิ่งที่ยุ่งยาก ... แม้จะ$_SERVER['DOCUMENT_ROOT']มีปัญหา ... เช่นอาจไม่ได้ตั้งค่าหรือตั้งค่าอย่างถูกต้องและอื่น ๆ มีวิธีอื่นที่ฉันสามารถคิดได้เช่นกันในการจัดการกับมัน ... สนุกมาก :)
Adam

1
วิธีการแก้ปัญหานี้ได้รับการอธิบายอย่างดีและทำงานตรงตามที่ต้องการหลังจาก WP ขว้างข้อผิดพลาด "ไม่ได้กำหนด" ขอบคุณ;)
Chris Sprague

-1

ฉันใช้home_url ()เพื่อเชื่อมโยงไปยังหน้า "Home" ของ WP บางครั้งsite_url ()อาจจะไม่เป็นจริงของคุณhome_url () คุณสามารถกำหนดหน้า spesific เป็นหน้าแรกใน Wordpress

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.