Best practice per fare riferimento alla directory dei plug-in


9

Il mio plugin utilizza il seguente codice per fare riferimento a un file, ma ho letto WP_PLUGIN_DIRche non funzionerà se un utente rinomina la cartella del plugin predefinita. Vorrei anche sostituire /location-specific-menu-items/con un riferimento alla cartella del plugin corrente.

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

Come potrei riscriverlo per farlo funzionare indipendentemente dai nomi della directory del plugin WP e della cartella specifica del plugin?

MODIFICARE:

Ecco la mia soluzione di lavoro finale che segue il contributo di tutti. Grazie molto!

$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;              
}   

dove l'hai letto ..? se l'utente rinomina la cartella del plugin penso che dovrebbero essere sicuri di ridefinire anche WP_PLUGIN_DIR ...
Majick

Ah, ho sbagliato. Il problema è che i plugin non vivono sempre nella directory predefinita dei plugin. Ecco la citazione che ho letto: "Non utilizzare WP_PLUGIN_URL o WP_PLUGIN_DIR - i plugin potrebbero non essere nella directory dei plugin."
j8d,

Risposte:


8

Se la struttura del plugin è:

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

quindi per PHP 5.3.0+, potresti provare la costante magica __DIR__

__DIR__La directory del file. Se utilizzato all'interno di un'inclusione, viene restituita la directory del file incluso. Questo equivale a dirname(__FILE__). Questo nome di directory non ha una barra finale a meno che non sia la directory principale.

all'interno del some-plugin.phpfile:

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

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

Per un più ampio supporto PHP è possibile utilizzare dirname( __FILE__ ), dove è __FILE__stato aggiunto in PHP 4.0.2.


1
ps: nota che se lo usi plugin_dir_path( __FILE__ ), allora è un wrapper per trailingslashit( dirname( __FILE__ ) )aggiungere una barra finale al dirname.
birgire,

woah cool che è quasi esattamente parola per parola quello che ho appena pubblicato, lol
majick

hehe ti ho appena battuto, ma questo può succedere, comunque +1 ;-)
birgire

Quindi $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';avrebbe funzionato bene?
j8d,

1
sì, dovrebbe funzionare @ j8d
birgire,

5

Puoi usare:

plugin_dir_path(__FILE__);

Che comunque è solo una funzione wrapper per:

trailingslashit(dirname(__FILE__));    

2

Puoi anche dare un'occhiata alle funzioni che WordPress ha a bordo per questo: ad esempio plugin_dir_path(), plugins_url()oplugin_dir_url()

Ti aiuteranno a determinare dove si trova il tuo plugin sul server. Queste funzioni sono consigliate anche dal Codice nella scrittura di un plug-in: nomi, file e posizioni.

Inoltre puoi ovviamente usare costanti magiche da PHP e filtrare il loro output per determinare dove sono i tuoi file.


Non vedo alcun problema con l'utilizzo plugin_dir_url(), restituisce la cartella per il file che hai passato, sì. Questo è quello di cui ha bisogno.
flomei,

1
plugin_dir_pathrestituisce la directory, plugin_dir_urlti darà l'URL del file, che non è semplicemente la stessa cosa e NON è quello di cui ha bisogno. è utile per altre cose, come fonti di immagini o accodamento di fogli di stile.
Majick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.