引用插件目录的最佳实践

时间:2016-02-12 作者:j8d

我的插件使用以下代码引用文件,但我已经阅读了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;              
}   

3 个回复
最合适的回答,由SO网友:birgire 整理而成

如果插件结构为:

plugins/
   some-plugin/
       some-plugin.php
       data/
           GeoIP.dat
然后,对于PHP 5.3.0+,可以尝试使用magic常量__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中添加。

SO网友:majick

您可以使用:

plugin_dir_path(__FILE__);
它只是一个包装函数,用于:

trailingslashit(dirname(__FILE__));    

SO网友:flomei

你也可以看看WordPress的功能:例如:。plugin_dir_path(), plugins_url()plugin_dir_url()

它们将帮助您确定插件在服务器上的位置。这些功能也是Codex在Writing a Plugin: Names, Files, and Locations.

除此之外,您显然可以使用PHP中的魔法常量并过滤它们的输出来确定文件的位置。