Когда я разрабатываю плагины, я тестирую их на нескольких версиях WordPress, вставляя ссылки на каталог моих плагинов в разные wp-content
каталоги. Это замечательно, поскольку мне нужно редактировать файлы только один раз, но это нарушает важную конструкцию для генерации ссылок на ресурсы в моем плагине: __FILE__
относится к физическому расположению плагина, а не к тому, в котором он находится wp-content
. Как мне решить это?
Моя структура каталогов выглядит так:
/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
как символическая ссылка на вышеуказанный плагин
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
как символическая ссылка на вышеуказанный плагин
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
как символическая ссылка на вышеуказанный плагин
Если я хочу епдиеий файл Javascript, я должен использовать plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, но при использовании __FILE__
здесь не буду работать, так как реальный путь к файлу будет /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, не /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
так WordPress не может лишить первую часть и сгенерирует URL относительно установки WordPress.
источник
WP_PLUGIN_URL
не рекомендуется, потому что администраторы должны иметь возможность изменять имя каталога этого конкретного плагина, но есть ли еще одна причина, чтобы этого избежать? И действительно, ваш билет будет простым решением./external/folder/banana-plugin/
но админ ссылается на этот каталог как/httpd-root/wp-content/plugins/apple-plugin/
? Тогда он попытается пойти/wp-content/plugins/banana-plugin/
, нет? И я считаю, что администратор должен свободно выбирать имена каталогов отдельных плагинов?В настоящее время я использую трюк, чтобы получить местоположение файла, относящееся к WordPress:
wp_get_active_and_valid_plugins()
возвращает пути к файлам,wp_settings.php
перебирает их и включает в себя файлы . Таким образом, глобальная$plugin
переменная будет ссылаться на ваш текущий плагин (конечно, только когда плагин загружен, поэтому я сохраняю его в префиксной глобальной переменной):Поскольку плагины также могут быть загружены как обязательные или сетевые плагины, и эти циклы используют другие имена переменных , полный код выглядит следующим образом:
Откат остается прежним
__FILE__
, поэтому, если в будущем кто-то изменит имя переменной цикла, мой код все равно будет работать для 99% всех установок, произойдет сбой только моей настройки разработки, и я с легкостью смогу выпустить новую версию.источник
global
. Благодаря вашему посту я понял, что могу сделать это намного проще. Кстати, я также проверяюfalse === strpos( __FILE__, WP_CONTENT_DIR )
перед выполнением ваших операторов if, потому что я предполагаю, что если плагин находится в,WP_CONTENT_DIR
он не является символической ссылкой; Я надеюсь, что это правильная логика.Комментарий в ошибке 46260 предлагает использовать
$_SERVER["SCRIPT_FILENAME"]
вместо__FILE__
. Это работает?источник
index.php
включает в себяlibrary.php
,$_SERVER['SCRIPT_FILENAME']
по -library.php
прежнему будетindex.php
. Но спасибо за ссылку на ошибку, буду внимательно следить за ней!$_SERVER["SCRIPT_FILENAME"]
работает, если вы используете это правильно. Вам просто нужно использовать его, чтобы установить базовый путь, а затем включить ваши файлы, используя путь относительно этого базового пути.Что-то вроде:
Обратите внимание, это более полезно, когда у вас еще нет доступа к wp-blog-header.php (т.е. при обработке запроса формы на основе ajax)
источник