Mejores prácticas para hacer referencia al directorio de complementos

9

Mi complemento utiliza el siguiente código para hacer referencia a un archivo, pero he leído WP_PLUGIN_DIRque no funcionará si un usuario cambia el nombre de la carpeta predeterminada del complemento. También me gustaría reemplazar /location-specific-menu-items/con una referencia a la carpeta del complemento actual.

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

¿Cómo podría reescribir esto para que funcione independientemente de los nombres del directorio de complementos de WP y la carpeta de complementos específica?

EDITAR:

Aquí está mi solución de trabajo final siguiendo los comentarios de todos. ¡Muchas gracias!

$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
fuente
Dónde leíste eso..? si el usuario cambia el nombre de la carpeta del complemento, creo que también tendrían que asegurarse de redefinir WP_PLUGIN_DIR ...
majick
Ah, hablo mal. El problema es que los complementos no siempre viven en el directorio de complementos predeterminado. Aquí está la cita que leí: "No use WP_PLUGIN_URL o WP_PLUGIN_DIR; es posible que los complementos no estén en el directorio de complementos".
j8d

Respuestas:

8

Si la estructura del complemento es:

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

entonces para PHP 5.3.0+, puedes probar la constante mágica __DIR__

__DIR__El directorio del archivo. Si se usa dentro de un include, se devuelve el directorio del archivo incluido. Esto es equivalente a dirname(__FILE__). Este nombre de directorio no tiene una barra inclinada final a menos que sea el directorio raíz.

dentro del some-plugin.phparchivo:

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

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

Para un soporte PHP más amplio que podría usar dirname( __FILE__ ), donde __FILE__se agregó en PHP 4.0.2.

Birgire
fuente
1
ps: tenga en cuenta que si usa plugin_dir_path( __FILE__ ), entonces es un contenedor para trailingslashit( dirname( __FILE__ ) )eso agrega una barra diagonal al nombre del directorio.
Birgire
woah genial eso es casi exactamente palabra por palabra lo que acabo de publicar, jajaja
majick
jeje te acabo de ganar, pero esto puede suceder, de todos modos +1 ;-)
birgire
¿Entonces $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';funcionaría bien?
j8d
1
sí, eso debería funcionar @ j8d
birgire
5

Puedes usar:

plugin_dir_path(__FILE__);

Que como es solo una función de contenedor de todos modos para:

trailingslashit(dirname(__FILE__));    
majick
fuente
2

También puede echar un vistazo a las funciones que WordPress tiene a bordo para esto: por ejemplo plugin_dir_path(), plugins_url()oplugin_dir_url()

Le ayudarán a determinar dónde se coloca su complemento en el servidor. Esas funciones también son recomendadas por el Codex al escribir un complemento: nombres, archivos y ubicaciones.

Además de eso, obviamente puedes usar constantes mágicas de PHP y filtrar su salida para determinar dónde están tus archivos.

flomei
fuente
No veo ningún problema con el uso plugin_dir_url(), devuelve la carpeta del archivo que pasaste, sí. Eso es lo que necesita.
flomei
1
plugin_dir_pathdevuelve el directorio, plugin_dir_urlle dará la URL del archivo, que simplemente no es lo mismo y NO lo que necesita. es útil para otras cosas, como fuentes de imágenes o hojas de estilo en cola.
majick