Kiedy tworzę wtyczki, testuję je na wielu wersjach WordPressa poprzez symlinkowanie mojego katalogu wtyczek w różnych wp-content
katalogach. Jest to świetne, ponieważ muszę edytować pliki tylko raz, ale łamie ważną konstrukcję, aby generować odwołania do zasobów w mojej wtyczce: __FILE__
odnosi się do fizycznej lokalizacji wtyczki, a nie tej w wp-content
. Jak mam to rozwiązać?
Moja struktura katalogów wygląda następująco:
/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
jako dowiązanie symboliczne do powyższej wtyczki
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
jako dowiązanie symboliczne do powyższej wtyczki
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
jako dowiązanie symboliczne do powyższej wtyczki
Jeśli chcę enqueue plik JavaScript, powinno się używać plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, ale przy użyciu __FILE__
tutaj nie będzie działać, ponieważ rzeczywista ścieżka do pliku będzie /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, nie /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, tak nie może pozbawić WordPress pierwszą część na zewnątrz i wygenerować URL w stosunku do instalacji WordPressa.
źródło
WP_PLUGIN_URL
nie jest zalecane, ponieważ administratorzy powinni mieć możliwość zmiany nazwy katalogu tej konkretnej wtyczki, ale czy jest też inny powód, aby tego unikać? I rzeczywiście, twój bilet byłby prostym rozwiązaniem./external/folder/banana-plugin/
ale administrator odsyła do tego katalogu jako/httpd-root/wp-content/plugins/apple-plugin/
? Potem spróbuje się udać/wp-content/plugins/banana-plugin/
, nie? I wierzę, że administrator powinien mieć swobodę wyboru nazw poszczególnych katalogów wtyczek?Obecnie używam sztuczki, aby uzyskać lokalizację pliku zależną od WordPress:
wp_get_active_and_valid_plugins()
zwraca ścieżki do plików,wp_settings.php
zapętla je i dołącza pliki . Zatem$plugin
zmienna globalna będzie odnosić się do twojej bieżącej wtyczki (oczywiście tylko wtedy, gdy wtyczka jest załadowana, więc zapisuję ją w zmiennej globalnej z prefiksem):Ponieważ wtyczki można również ładować jako wtyczki do użycia lub wtyczki sieciowe, a te pętle używają innych nazw zmiennych , pełny kod wygląda następująco:
Powrót jest nadal możliwy
__FILE__
, więc jeśli ktoś zmieni nazwę zmiennej pętli w przyszłości, mój kod powinien nadal działać dla 99% wszystkich instalacji, tylko moja konfiguracja programowania zakończy się niepowodzeniem i mogę z łatwością wydać nową wersję.źródło
global
. Dzięki postowi tutaj zrozumiałem, że mogę to znacznie uprościć. BTW, testuję równieżfalse === strpos( __FILE__, WP_CONTENT_DIR )
przed uruchomieniem instrukcji if, ponieważ zakładam, że wtyczka jest wWP_CONTENT_DIR
niej, nie jest dowiązaniem symbolicznym; Mam nadzieję, że to poprawna logika.Komentarz w błędzie 46260 sugeruje użycie
$_SERVER["SCRIPT_FILENAME"]
zamiast__FILE__
. czy to działa?źródło
index.php
zawieralibrary.php
,$_SERVER['SCRIPT_FILENAME']
wlibrary.php
nadal będzieindex.php
. Ale dzięki za odniesienie do błędu, będę go dokładnie śledził!$_SERVER["SCRIPT_FILENAME"]
działa, jeśli używasz go poprawnie. Wystarczy użyć go, aby ustawić ścieżkę bazową, a następnie dołączyć pliki, używając ścieżki względem tej ścieżki bazowej.Coś jak:
Uwaga: jest to bardziej przydatne, gdy nie masz jeszcze dostępu do wp-blog-header.php (tj. Podczas przetwarzania żądania formularza opartego na ajax)
źródło