Найкраща практика посилання на каталог плагінів


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 також ...
травень

Ах, я помиляюсь. Проблема полягає в тому, що плагіни не завжди містяться в каталозі плагінів за замовчуванням. Ось цитата, яку я прочитав: "Не використовуйте WP_PLUGIN_URL або WP_PLUGIN_DIR - плагіни можуть бути не в каталозі плагінів."
j8d

Відповіді:


8

Якщо структура плагіна:

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

то для PHP 5.3.0+ ви можете спробувати магічну константу __DIR__

__DIR__Каталог файлу. Якщо використовується всередині include, каталог повернутого файлу повертається. Це еквівалентно 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

хе-х, я просто побив тебе до цього, але все одно це може статися +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()

Вони допоможуть вам визначити, де ваш плагін розміщений на сервері. Ці функції також рекомендовані Кодексом при написанні плагіна: імена, файли та місця.

Крім того, ви, очевидно, можете використовувати магічні константи PHP і фільтрувати їх вихід, щоб визначити, де ваші файли.


Я не бачу проблем із використанням plugin_dir_url(), вона повертає папку для файлу, який ви передали, так. Це те, що йому потрібно.
flomei

1
plugin_dir_pathповертає каталог, plugin_dir_urlнадасть вам URL-адресу файлу, що просто не те саме, і НЕ те, що йому потрібно. це корисно для інших речей - як-от джерела зображень або зачаровуючі таблиці стилів.
majick
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.