แนวทางปฏิบัติที่ดีที่สุดสำหรับการอ้างอิงไดเรกทอรีปลั๊กอิน


9

ปลั๊กอินของฉันใช้รหัสต่อไปนี้เพื่ออ้างอิงไฟล์ แต่ฉันอ่านแล้วWP_PLUGIN_DIRจะไม่ทำงานหากผู้ใช้เปลี่ยนชื่อโฟลเดอร์ปลั๊กอินเริ่มต้น ฉันต้องการแทนที่/location-specific-menu-items/ด้วยการอ้างอิงไปยังโฟลเดอร์ปลั๊กอินปัจจุบัน

$gi = geoip_open(WP_PLUGIN_DIR ."/location-specific-menu-items/GeoIP.dat", GEOIP_STANDARD);

ฉันจะเขียนสิ่งนี้ใหม่เพื่อให้ทำงานได้โดยไม่คำนึงถึงชื่อของไดเรกทอรีปลั๊กอิน WP และโฟลเดอร์ปลั๊กอินที่ระบุได้อย่างไร

แก้ไข:

นี่คือวิธีแก้ปัญหาการทำงานขั้นสุดท้ายของฉันหลังจากที่ทุกคนป้อนข้อมูล ขอบคุณมาก!

$GeoIPv4_file = plugin_dir_path( __FILE__ ) . 'data/GeoIPv4.dat';
$GeoIPv6_file = plugin_dir_path( __FILE__ ) . 'data/GeoIPv6.dat';

if (!filter_var($ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === FALSE) {     
    if ( is_readable ( $GeoIPv4_file ) ) { 
        $gi = geoip_open( $GeoIPv4_file, GEOIP_STANDARD );
        $user_country = geoip_country_code_by_addr($gi, $ip_address);
        geoip_close($gi);
    }
} elseif (!filter_var($ip_address, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) === FALSE) {
    if ( is_readable ( $GeoIPv6_file ) ) {
        $gi = geoip_open( $GeoIPv6_file, GEOIP_STANDARD );
        $user_country = geoip_country_code_by_addr($gi, $ip_address);
        geoip_close($gi);
    }
} else {
    $user_country = "Can't locate IP: " . $ip_address;              
}   

คุณอ่านที่ไหน .. หากผู้ใช้เปลี่ยนชื่อโฟลเดอร์ปลั๊กอินฉันคิดว่าพวกเขาจะต้องให้แน่ใจว่าได้กำหนด WP_PLUGIN_DIR ใหม่เช่นกัน ...
majick

อ๊ะฉันพลาดไปแล้ว ปัญหาคือปลั๊กอินไม่ได้อยู่ในไดเรกทอรีปลั๊กอินเริ่มต้นเสมอไป นี่คือข้อความที่ฉันอ่าน: "อย่าใช้ WP_PLUGIN_URL หรือ WP_PLUGIN_DIR - ปลั๊กอินอาจไม่อยู่ในไดเรกทอรีปลั๊กอิน"
j8d

คำตอบ:


8

หากโครงสร้างปลั๊กอินคือ:

plugins/
   some-plugin/
       some-plugin.php
       data/
           GeoIP.dat

สำหรับ PHP 5.3.0+ คุณสามารถลองค่าคงที่เวทย์มนตร์ __DIR__

__DIR__ไดเรกทอรีของไฟล์ หากใช้ภายในการรวมไดเร็กทอรีของไฟล์ที่รวมจะถูกส่งคืน dirname(__FILE__)นี้จะเทียบเท่ากับ ชื่อไดเร็กทอรีนี้ไม่มีเครื่องหมายสแลชต่อท้ายยกเว้นว่าเป็นไดเร็กทอรีรูท

ภายในsome-plugin.phpไฟล์:

// Full path of the GeoIP.dat file
$file =  __DIR__ . '/data/GeoIP.dat';

// Open datafile
if( is_readable ( $file ) ) 
    $gi = geoip_open( $file, GEOIP_STANDARD );

สำหรับการสนับสนุน PHP ที่กว้างขึ้นคุณสามารถใช้dirname( __FILE__ )ซึ่ง__FILE__ถูกเพิ่มใน PHP 4.0.2


1
ps: โปรดทราบว่าถ้าคุณใช้plugin_dir_path( __FILE__ )มันเป็นเสื้อคลุมtrailingslashit( dirname( __FILE__ ) )ที่เพิ่มเครื่องหมายสแลชต่อท้ายชื่อ dirname
Birgire

Woah cool ที่เกือบจะตรงกับคำที่ฉันเพิ่งโพสต์ lol
majick

hehe ฉันเพิ่งเอาชนะคุณไปได้ แต่สิ่งนี้สามารถเกิดขึ้นได้ +1 ;-)
birgire

ดังนั้น$file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';จะทำงานได้ดี
j8d

1
ใช่ที่ควรจะทำงาน @ j8d
Birgire

5

คุณสามารถใช้ได้:

plugin_dir_path(__FILE__);

ซึ่งเป็นเพียงฟังก์ชั่นเสื้อคลุมอยู่แล้วสำหรับ:

trailingslashit(dirname(__FILE__));    

2

นอกจากนี้คุณยังสามารถดูได้ที่ฟังก์ชั่น WordPress ที่มีต่อคณะกรรมการนี้: เช่นplugin_dir_path(), plugins_url()หรือplugin_dir_url()

พวกเขาจะช่วยคุณในการกำหนดตำแหน่งที่ปลั๊กอินของคุณวางอยู่บนเซิร์ฟเวอร์ ฟังก์ชั่นเหล่านั้นยังได้รับการแนะนำโดย Codex ในการเขียนปลั๊กอิน: ชื่อไฟล์และตำแหน่ง

นอกจากนั้นคุณยังสามารถใช้เวทมนต์คงที่จาก PHP และกรองผลลัพธ์เพื่อพิจารณาว่าไฟล์ของคุณอยู่ที่ไหน


ฉันไม่เห็นปัญหาเกี่ยวกับการใช้plugin_dir_url()มันส่งคืนโฟลเดอร์สำหรับไฟล์ที่คุณส่งผ่านใช่ นั่นคือสิ่งที่เขาต้องการ
flomei

1
plugin_dir_pathส่งคืนไดเรกทอรีplugin_dir_urlจะให้ URL ไปยังไฟล์ซึ่งไม่เหมือนกันและไม่ใช่สิ่งที่เขาต้องการ มันมีประโยชน์สำหรับสิ่งอื่น ๆ - เช่นแหล่งรูปภาพหรือสไตล์ชีท
majick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.