Best Practice zum Verweisen auf das Plugin-Verzeichnis

9

Mein Plugin verwendet den folgenden Code, um auf eine Datei zu verweisen, aber ich habe gelesen, WP_PLUGIN_DIRdass dies nicht funktioniert, wenn ein Benutzer den Standard-Plugin-Ordner umbenennt. Ich möchte auch durch /location-specific-menu-items/einen Verweis auf den aktuellen Plugin-Ordner ersetzen .

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

Wie könnte ich dies umschreiben, damit es funktioniert, unabhängig von den Namen des WP-Plugin-Verzeichnisses und des spezifischen Plugin-Ordners?

BEARBEITEN:

Hier ist meine endgültige Arbeitslösung, die allen Eingaben folgt. Danke vielmals!

$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
quelle
wo hast du das gelesen ..? Wenn der Benutzer den Plugin-Ordner umbenennt, müsste er meiner Meinung nach auch WP_PLUGIN_DIR neu definieren ...
Majick
Ah, ich habe falsch geschrieben. Das Problem ist, dass Plugins nicht immer im Standard-Plugins-Verzeichnis gespeichert sind. Hier ist das Zitat, das ich gelesen habe: "Verwenden Sie nicht WP_PLUGIN_URL oder WP_PLUGIN_DIR - Plugins befinden sich möglicherweise nicht im Plugins-Verzeichnis."
j8d

Antworten:

8

Wenn die Plugin-Struktur ist:

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

Dann könnten Sie für PHP 5.3.0+ die magische Konstante ausprobieren __DIR__

__DIR__Das Verzeichnis der Datei. Bei Verwendung in einem Include wird das Verzeichnis der enthaltenen Datei zurückgegeben. Dies entspricht dirname(__FILE__). Dieser Verzeichnisname hat keinen abschließenden Schrägstrich, es sei denn, es handelt sich um das Stammverzeichnis.

innerhalb der some-plugin.phpDatei:

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

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

Für eine breitere PHP-Unterstützung können Sie verwenden dirname( __FILE__ ), wo __FILE__in PHP 4.0.2 hinzugefügt wurde.

Birgire
quelle
1
ps: beachte, dass wenn du verwendest plugin_dir_path( __FILE__ ), es ein Wrapper ist trailingslashit( dirname( __FILE__ ) ), der dem Verzeichnisnamen einen abschließenden Schrägstrich hinzufügt.
Birgire
woah cool das ist fast genau wörtlich was ich gerade gepostet habe, lol
majick
hehe ich habe dich nur geschlagen, aber das kann sowieso passieren +1 ;-)
birgire
So $file = plugin_dir_path( __FILE__ ) . 'data/GeoIP.dat';würde war gut funktionieren?
j8d
1
Ja, das sollte funktionieren @ j8d
Birgire
5

Sie können verwenden:

plugin_dir_path(__FILE__);

Was sowieso nur eine Wrapper-Funktion ist für:

trailingslashit(dirname(__FILE__));    
Majick
quelle
2

Sie könnten auch einen Blick auf den Funktionen Wordpress für diesen an Bord haben: zB plugin_dir_path(), plugins_url()oderplugin_dir_url()

Sie helfen Ihnen bei der Bestimmung, wo sich Ihr Plugin auf dem Server befindet. Diese Funktionen werden auch vom Codex beim Schreiben eines Plugins empfohlen : Namen, Dateien und Speicherorte.

Außerdem können Sie natürlich magische Konstanten aus PHP verwenden und deren Ausgabe filtern, um festzustellen, wo sich Ihre Dateien befinden.

Flomei
quelle
Ich sehe kein Problem mit der Verwendung plugin_dir_url(), es gibt den Ordner für die Datei zurück, die Sie übergeben haben, ja. Das braucht er.
Flomei
1
plugin_dir_pathGibt das Verzeichnis zurück und plugin_dir_urlgibt Ihnen die URL zu der Datei, die einfach nicht dasselbe ist und NICHT das, was er benötigt. Es ist nützlich für andere Dinge - wie Bildquellen oder das Einreihen von Stylesheets.
Majick