引用插件目录的最佳实践


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 ...
majick

啊,我误会了。问题在于插件并不总是存在于默认插件目录中。这是我读过的引文:“不要使用WP_PLUGIN_URL或WP_PLUGIN_DIR-插件可能不在插件目录中。”
j8d

Answers:


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__ ) )在目录名后添加斜杠。
birgire

哇,很酷,几乎就是我刚发布的单词,哈哈
majick 16/02/12

嘿,我只是击败了你,但这还是有可能发生,+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 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.