Лучшая практика для ссылки на каталог плагинов

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;              
}   
j8d
источник
где ты это прочитал ..? если пользователь переименует папку плагинов, я думаю, что он также должен будет переопределить 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__Каталог файла. Если используется внутри 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.

birgire
источник
1
ps: обратите внимание, что если вы используете plugin_dir_path( __FILE__ ), то это обертка, trailingslashit( dirname( __FILE__ ) )которая добавляет косую черту к dirname.
Birgire
Воу круто, это почти точно слово в слово, что я только что опубликовал, лол
Маджик
хе-хе, я просто побил тебя, но это может произойти, во всяком случае, +1 ;-)
birgire
Так $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';будет ли работать хорошо?
J8D
1
да, это должно сработать @ j8d
birgire
5

Ты можешь использовать:

plugin_dir_path(__FILE__);

Который в любом случае является просто функцией-оберткой для:

trailingslashit(dirname(__FILE__));    
majick
источник
2

Вы также можете взглянуть на функции, которые есть в WordPress: например plugin_dir_path(), plugins_url()илиplugin_dir_url()

Они помогут вам определить, где находится ваш плагин на сервере. Эти функции также рекомендованы Кодексом при написании плагина: имена, файлы и расположение.

Кроме того, очевидно, что вы можете использовать магические константы из PHP и фильтровать их выходные данные, чтобы определить, где находятся ваши файлы.

flomei
источник
Я не вижу проблемы с использованием plugin_dir_url(), он возвращает папку для файла, который вы передали, да. Это то, что ему нужно.
flomei
1
plugin_dir_pathвозвращает каталог, plugin_dir_urlвыдаст вам URL к файлу, который просто не то же самое и НЕ то, что ему нужно. это полезно для других вещей - таких как источники изображений или добавление таблиц стилей в очередь.
Маджик