Praktik Terbaik untuk Merujuk Direktori Plugin

9

Plugin saya menggunakan kode berikut untuk referensi file, tetapi saya sudah baca WP_PLUGIN_DIRtidak akan berfungsi jika pengguna mengganti nama folder plugin default. Saya juga ingin mengganti /location-specific-menu-items/dengan referensi ke folder plugin saat ini.

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

Bagaimana saya bisa menulis ulang ini agar berfungsi terlepas dari nama direktori plugin WP dan folder plugin tertentu?

EDIT:

Inilah solusi terakhir saya yang bekerja mengikuti masukan semua orang. Terimakasih banyak!

$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;              
}   
j8d
sumber
Dimana Anda membaca itu..? jika pengguna mengganti nama folder plugin saya pikir mereka harus memastikan untuk mendefinisikan ulang WP_PLUGIN_DIR juga ...
majick
Ah, saya salah bicara. Masalahnya adalah bahwa plugin tidak selalu hidup di direktori plugin default. Inilah kutipan yang saya baca: "Jangan gunakan WP_PLUGIN_URL atau WP_PLUGIN_DIR - plugin mungkin tidak ada di direktori plugins."
j8d

Jawaban:

8

Jika struktur plugin adalah:

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

lalu untuk PHP 5.3.0+, Anda bisa mencoba konstanta ajaib __DIR__

__DIR__Direktori file. Jika digunakan di dalam sebuah include, direktori file yang disertakan dikembalikan. Ini setara dengan dirname(__FILE__). Nama direktori ini tidak memiliki garis miring kecuali jika itu adalah direktori root.

dalam some-plugin.phpfile:

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

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

Untuk dukungan PHP yang lebih luas, Anda dapat menggunakan dirname( __FILE__ ), di mana __FILE__ditambahkan dalam PHP 4.0.2.

birgire
sumber
1
ps: perhatikan bahwa jika Anda menggunakan plugin_dir_path( __FILE__ ), maka itu adalah pembungkus untuk trailingslashit( dirname( __FILE__ ) )yang menambahkan garis miring ke dirname.
birgire
woah keren itu hampir persis kata demi kata yang baru saja saya posting, lol
majick
hehe Saya baru saja mengalahkan kamu untuk itu, tapi ini bisa terjadi, tetap +1 ;-)
birgire
Jadi $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';apakah pekerjaan itu baik?
j8d
1
ya itu seharusnya bekerja @ j8d
birgire
5

Kamu bisa menggunakan:

plugin_dir_path(__FILE__);

Yang merupakan fungsi pembungkus tetap untuk:

trailingslashit(dirname(__FILE__));    
majik
sumber
2

Anda juga dapat melihat fungsi-fungsi yang dimiliki WordPress untuk hal ini: misalnya plugin_dir_path(), plugins_url()atauplugin_dir_url()

Mereka akan membantu Anda menentukan di mana plugin Anda ditempatkan di server. Fungsi-fungsi itu juga direkomendasikan oleh Codex di Writing a Plugin: Names, Files, and Locations.

Selain itu Anda jelas dapat menggunakan konstanta ajaib dari PHP dan memfilter outputnya untuk menentukan di mana file Anda.

flomei
sumber
Saya tidak melihat masalah dengan penggunaannya plugin_dir_url(), ia mengembalikan folder untuk file yang Anda lewati, ya. Itu yang dia butuhkan.
flomei
1
plugin_dir_pathmengembalikan direktori, plugin_dir_urlakan memberi Anda URL ke file, yang sama sekali bukan hal yang sama dan BUKAN apa yang dia butuhkan. itu berguna untuk hal-hal lain - seperti sumber gambar atau stylesheet enqueueing sekalipun.
Majick