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

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.


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__));    

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.