Najlepsza praktyka odwoływania się do katalogu wtyczek

9

Moja wtyczka używa następującego kodu do odwołania się do pliku, ale przeczytałem, WP_PLUGIN_DIRże nie zadziała, jeśli użytkownik zmieni nazwę domyślnego folderu wtyczek. Chciałbym również zastąpić /location-specific-menu-items/odniesieniem do bieżącego folderu wtyczek.

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

Jak mogę to przepisać, aby działało niezależnie od nazw katalogu wtyczki WP i określonego folderu wtyczek?

EDYTOWAĆ:

Oto moje ostatnie działające rozwiązanie po uwagach wszystkich. Wielkie dzięki!

$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
źródło
gdzie to przeczytałeś? jeśli użytkownik zmieni nazwę folderu wtyczek, myślę, że musiałby też zredefiniować WP_PLUGIN_DIR ...
majick
Ach, źle napisałem. Problem polega na tym, że wtyczki nie zawsze znajdują się w domyślnym katalogu wtyczek. Oto cytat, który przeczytałem: „Nie używaj WP_PLUGIN_URL lub WP_PLUGIN_DIR - wtyczki mogą nie znajdować się w katalogu wtyczek.”
j8d

Odpowiedzi:

8

Jeśli struktura wtyczki to:

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

następnie dla PHP 5.3.0+ możesz wypróbować magiczną stałą __DIR__

__DIR__Katalog pliku. Jeśli zostanie zastosowany w pliku include, zwrócony zostanie katalog dołączonego pliku. Jest to równoważne z dirname(__FILE__). Ta nazwa katalogu nie ma ukośnika końcowego, chyba że jest to katalog główny.

w some-plugin.phppliku:

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

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

Aby uzyskać szerszą obsługę PHP, możesz użyć dirname( __FILE__ ), gdzie __FILE__został dodany w PHP 4.0.2.

birgire
źródło
1
ps: pamiętaj, że jeśli używasz plugin_dir_path( __FILE__ ), to jest to opakowanie, trailingslashit( dirname( __FILE__ ) )które dodaje ukośnik do nazwy katalogu.
birgire,
woah spoko, to prawie dokładnie słowo po słowie, co właśnie opublikowałem, lol
majick
hehe właśnie cię
pobiłem
Czy $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';praca byłaby dobra?
j8d
1
tak, to powinno działać @ j8d
birgire
5

Możesz użyć:

plugin_dir_path(__FILE__);

Która jak i tak jest tylko funkcją otoki dla:

trailingslashit(dirname(__FILE__));    
majick
źródło
2

Można również zapoznać się z funkcjami WordPress ma na pokładzie za to: na przykład plugin_dir_path(), plugins_url()lubplugin_dir_url()

Pomogą ci ustalić, gdzie wtyczka zostanie umieszczona na serwerze. Te funkcje są również zalecane przez Kodeks przy pisaniu wtyczki: Nazwy, pliki i lokalizacje.

Poza tym możesz oczywiście używać magicznych stałych z PHP i filtrować ich dane wyjściowe, aby określić, gdzie są twoje pliki.

flomei
źródło
Nie widzę problemu z używaniem plugin_dir_url(), zwraca folder dla przekazanego pliku, tak. Tego potrzebuje.
flomei
1
plugin_dir_pathzwraca katalog, plugin_dir_urlpoda ci URL do pliku, który po prostu nie jest tym samym i NIE jest tym, czego potrzebuje. jest przydatny do innych celów - takich jak źródła obrazów lub kolejkowanie arkuszy stylów.
majick