Wenn ich Plugins entwickle, teste ich sie auf mehreren Versionen von WordPress, indem ich mein Plugin-Verzeichnis mit den verschiedenen wp-content
Verzeichnissen verbinde. Das ist großartig, da ich die Dateien nur einmal bearbeiten muss, aber es bricht ein wichtiges Konstrukt ab, um Verweise auf Ressourcen in meinem Plugin zu generieren: __FILE__
Bezieht sich auf den physischen Speicherort des Plugins, nicht auf den in wp-content
. Wie soll ich das lösen?
Meine Verzeichnisstruktur sieht folgendermaßen aus:
/path/to/wordpress/development/dir/
plugin-development/
monkeyman-rewrite-analyzer/
monkeyman-rewrite-analyzer.php
js/
monkeyman-rewrite-analyzer.js
versions/
3.1/
wp-content/
plugins/
monkeyman-rewrite-analyzer
als Symlink zum obigen Plugin
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
als Symlink zum obigen Plugin
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
als Symlink zum obigen Plugin
Wenn ich die Javascript-Datei in die Warteschlange stellen möchte, sollte ich sie verwenden plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, aber die Verwendung __FILE__
hier funktioniert nicht, da der tatsächliche Dateipfad /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
nicht /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
so ist, dass WordPress den ersten Teil nicht entfernen und eine URL relativ zur WordPress-Installation generieren kann.
quelle
WP_PLUGIN_URL
wird nicht empfohlen, da Administratoren den Namen dieses bestimmten Plugin-Verzeichnisses ändern dürfen. Gibt es jedoch auch einen anderen Grund, dies zu vermeiden? Und in der Tat wäre Ihr Ticket eine einfache Lösung./external/folder/banana-plugin/
aber der Admin mit diesem Verzeichnis verknüpft ist/httpd-root/wp-content/plugins/apple-plugin/
? Dann wird es versuchen zu gehen/wp-content/plugins/banana-plugin/
, nein? Und ich glaube der Admin sollte frei sein, die einzelnen Plugin-Verzeichnisnamen zu wählen?Momentan benutze ich einen Trick, um den WordPress-relativen Dateispeicherort zu ermitteln:
wp_get_active_and_valid_plugins()
Gibt die Dateipfade zurück,wp_settings.php
durchläuft sie und schließt die Dateien ein . Die globale$plugin
Variable bezieht sich also auf Ihr aktuelles Plugin (natürlich nur, wenn das Plugin geladen ist, also speichere ich es in einer vorangestellten globalen Variablen):Da Plugins auch als Must-Use- oder Netzwerk-Plugins geladen werden können und diese Loops andere Variablennamen verwenden , sieht der vollständige Code folgendermaßen aus:
Der Fallback bleibt bestehen.
__FILE__
Wenn also jemand den Namen der Schleifenvariablen in Zukunft ändert, sollte mein Code für 99% aller Installationen noch funktionieren. Nur mein Entwicklungssetup schlägt fehl und ich kann problemlos eine neue Version veröffentlichen.quelle
global
. Dank Ihres Beitrags hier wurde mir klar, dass ich es viel einfacher machen könnte. Übrigens teste ich auch,false === strpos( __FILE__, WP_CONTENT_DIR )
bevor ich Ihre if-AnweisungenWP_CONTENT_DIR
ausführe, da ich davon ausgehe, dass das Plugin in dem nicht verlinkt ist. Ich hoffe, das ist eine gültige Logik.Ein Kommentar in Bug 46260 schlägt vor,
$_SERVER["SCRIPT_FILENAME"]
anstelle von zu verwenden__FILE__
. Funktioniert das?quelle
index.php
enthältlibrary.php
,$_SERVER['SCRIPT_FILENAME']
inlibrary.php
noch seinindex.php
. Aber danke für den Hinweis auf den Fehler, ich werde ihn genau verfolgen!$_SERVER["SCRIPT_FILENAME"]
funktioniert, wenn Sie es richtig verwenden. Sie müssen es nur verwenden, um einen Basispfad festzulegen, und dann Ihre Dateien unter Verwendung eines Pfads relativ zu diesem Basispfad einschließen.So etwas wie:
Beachten Sie, dass dies nützlicher ist, wenn Sie noch keinen Zugriff auf die Datei wp-blog-header.php haben (dh wenn Sie eine Ajax-basierte Formularanforderung bearbeiten).
quelle