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;              
}   

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.


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__));    

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.