Meilleure pratique pour référencer le répertoire des plugins

9

Mon plugin utilise le code suivant pour référencer un fichier, mais j'ai lu que WP_PLUGIN_DIRcela ne fonctionnera pas si un utilisateur renomme le dossier du plugin par défaut. Je voudrais également remplacer /location-specific-menu-items/par une référence au dossier du plugin actuel.

$gi = geoip_open(WP_PLUGIN_DIR ."/location-specific-menu-items/GeoIP.dat", GEOIP_STANDARD);

Comment pourrais-je réécrire cela pour le faire fonctionner indépendamment des noms du répertoire du plugin WP et du dossier du plugin spécifique?

ÉDITER:

Voici ma solution de travail finale suite à l'apport de tout le monde. Merci beaucoup!

$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
la source
où avez-vous lu ça ..? si l'utilisateur renomme le dossier du plugin, je pense qu'il devrait être sûr de redéfinir WP_PLUGIN_DIR aussi ...
majick
Ah, j'ai mal parlé. Le problème est que les plugins ne vivent pas toujours dans le répertoire des plugins par défaut. Voici la citation que j'ai lue: "N'utilisez pas WP_PLUGIN_URL ou WP_PLUGIN_DIR - les plugins peuvent ne pas être dans le répertoire des plugins."
j8d

Réponses:

8

Si la structure du plugin est:

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

alors pour PHP 5.3.0+, vous pouvez essayer la constante magique __DIR__

__DIR__Le répertoire du fichier. S'il est utilisé à l'intérieur d'une inclusion, le répertoire du fichier inclus est renvoyé. C'est équivalent à dirname(__FILE__). Ce nom de répertoire n'a pas de barre oblique de fin sauf s'il s'agit du répertoire racine.

dans le some-plugin.phpfichier:

// Full path of the GeoIP.dat file
$file =  __DIR__ . '/data/GeoIP.dat';

// Open datafile
if( is_readable ( $file ) ) 
    $gi = geoip_open( $file, GEOIP_STANDARD );

Pour une prise en charge PHP plus large que vous pourriez utiliser dirname( __FILE__ ), où a __FILE__été ajouté en PHP 4.0.2.

Birgire
la source
1
ps: notez que si vous utilisez plugin_dir_path( __FILE__ ), c'est un wrapper pour trailingslashit( dirname( __FILE__ ) )qui ajoute une barre oblique de fin au dirname.
birgire
woah cool c'est presque exactement mot pour mot ce que je viens de poster, lol
majick
hehe je viens de vous battre pour cela, mais cela peut arriver, de toute façon +1 ;-)
birgire
Alors ça $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';marcherait bien?
j8d
1
oui ça devrait marcher @ j8d
birgire
5

Vous pouvez utiliser:

plugin_dir_path(__FILE__);

Ce qui n'est de toute façon qu'une fonction wrapper pour:

trailingslashit(dirname(__FILE__));    
majick
la source
2

Vous pouvez également consulter les fonctions que WordPress a à bord pour cela: par exemple plugin_dir_path(), plugins_url()ouplugin_dir_url()

Ils vous aideront à déterminer où votre plugin est placé sur le serveur. Ces fonctions sont également recommandées par le Codex dans l' écriture d'un plugin: noms, fichiers et emplacements.

En plus de cela, vous pouvez évidemment utiliser des constantes magiques de PHP et filtrer leur sortie pour déterminer où se trouvent vos fichiers.

flomei
la source
Je ne vois pas de problème avec l'utilisation plugin_dir_url(), il renvoie le dossier du fichier que vous avez passé, oui. C'est ce dont il a besoin.
flomei
1
plugin_dir_pathrenvoie le répertoire, plugin_dir_urlvous donnera l'URL du fichier, ce qui n'est tout simplement pas la même chose et PAS ce dont il a besoin. il est utile pour d'autres choses, comme les sources d'images ou la mise en file d'attente des feuilles de style.
majick