Prática recomendada para referenciar o diretório de plug-ins

9

Meu plug-in usa o código a seguir para fazer referência a um arquivo, mas li WP_PLUGIN_DIRque não funcionará se um usuário renomear a pasta padrão do plug-in. Eu também gostaria de substituir /location-specific-menu-items/por uma referência à pasta atual do plugin.

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

Como eu poderia reescrever isso para fazê-lo funcionar, independentemente dos nomes do diretório do plugin WP e da pasta específica do plugin?

EDITAR:

Aqui está a minha solução final de trabalho, seguindo a opinião de todos. Muito Obrigado!

$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
fonte
Onde você leu isso..? se o usuário renomeia o plugin pasta Eu acho que eles teriam que ter a certeza de redefinir WP_PLUGIN_DIR bem ...
majick
Ah, eu errei. O problema é que os plug-ins nem sempre vivem no diretório de plug-ins padrão. Aqui está a citação que li: "Não use WP_PLUGIN_URL ou WP_PLUGIN_DIR - os plugins podem não estar no diretório de plugins".
j8d

Respostas:

8

Se a estrutura do plug-in for:

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

então, para o PHP 5.3.0+, você pode tentar a constante mágica __DIR__

__DIR__O diretório do arquivo. Se usado dentro de uma inclusão, o diretório do arquivo incluído é retornado. Isso é equivalente a dirname(__FILE__). Esse nome de diretório não possui uma barra final, a menos que seja o diretório raiz.

dentro do some-plugin.phparquivo:

// 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 um suporte mais amplo ao PHP você pode usar dirname( __FILE__ ), onde __FILE__foi adicionado no PHP 4.0.2.

Birgire
fonte
11
ps: observe que, se você usar plugin_dir_path( __FILE__ ), é um invólucro trailingslashit( dirname( __FILE__ ) )que adiciona uma barra final ao nome do diretório.
birgire
woah legal que é quase exatamente palavra por palavra o que eu só postou, lol
majick
hehe Eu só vencê-lo a ele, mas isso pode acontecer, de qualquer maneira +1 ;-)
birgire
Então $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';, o trabalho estava bem?
j8d
11
sim que deve funcionar @ j8d
birgire
5

Você pode usar:

plugin_dir_path(__FILE__);

Que, como é apenas uma função de invólucro de qualquer maneira para:

trailingslashit(dirname(__FILE__));    
majick
fonte
2

Você também pode dar uma olhada nas funções que o WordPress possui para isso: por exemplo plugin_dir_path(), plugins_url()ouplugin_dir_url()

Eles ajudarão você a determinar onde o plug-in está colocado no servidor. Essas funções também são recomendadas pelo Codex ao escrever um plug-in: nomes, arquivos e locais.

Além disso, você pode obviamente usar constantes mágicas do PHP e filtrar sua saída para determinar onde estão seus arquivos.

flomei
fonte
Não vejo problema em usar plugin_dir_url(), ele retorna a pasta do arquivo que você passou, sim. É disso que ele precisa.
flomei
11
plugin_dir_pathretorna o diretório, plugin_dir_urlfornecerá a URL para o arquivo, que simplesmente não é a mesma coisa e NÃO é o que ele precisa. é útil para outras coisas - como fontes de imagem ou enfileirar folhas de estilo.
1825