プラグインディレクトリを参照するためのベストプラクティス


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 2016

回答:


8

プラグイン構造が次の場合:

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

次に、PHP 5.3.0以降の場合、魔法の定数を試すことができます __DIR__

__DIR__ファイルのディレクトリ。インクルード内で使用すると、インクルードされたファイルのディレクトリが返されます。これはと同等 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:を使用する場合、dirnameに末尾のスラッシュを追加するplugin_dir_path( __FILE__ )ためのラッパーでtrailingslashit( dirname( __FILE__ ) )あることに注意してください。
バージィ

かっこいい、これは私が投稿した内容とほぼ完全に同じです、笑
majick

hehe私はあなたにそれを打ち負かしただけですが、これはとにかく起こる可能性があります+1 ;-)
バージール

それで$file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';仕事はうまくいったでしょうか?
j8d 2016

1
はい、@ j8dで動作するはずです
バージニア

5

以下を使用できます。

plugin_dir_path(__FILE__);

とにかくラッパー関数です:

trailingslashit(dirname(__FILE__));    

2

また、WordPressのは、このためにボードの上に持っている機能を見て持つことができる:例えばplugin_dir_path()plugins_url()またはplugin_dir_url()

これらは、プラグインがサーバーのどこに配置されるかを決定するのに役立ちます。これらの関数は、Codexの「プラグインの作成:名前、ファイル、場所」でも推奨されています。

その上、PHPのマジック定数を使用して、ファイルの場所を判別するために出力をフィルタリングすることができます。


の使用plugin_dir_url()に問題はありません。渡したファイルのフォルダーが返されます。それは彼が必要とするものです。
flomei

1
plugin_dir_pathディレクトリを返し、plugin_dir_urlファイルへのURLを提供します。これは単に同じものではなく、彼が必要としているものではありません。画像ソースやスタイルシートのエンキューなど、他のものにも役立ちます。
majick 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.