Quando desenvolvo plugins, eu os testo em várias versões do WordPress, associando o diretório do meu plugin nos diferentes wp-content
diretórios. Isso é ótimo, pois só preciso editar os arquivos uma vez, mas quebra uma construção importante para gerar referências aos recursos no meu plug-in: __FILE__
refere-se ao local do plug-in físico, não ao local wp-content
. Como devo resolver isso?
Minha estrutura de diretórios é assim:
/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
como um link simbólico para o plug-in acima
3.1-multi-dir/
wp-content/
plugins/
monkeyman-rewrite-analyzer
como um link simbólico para o plug-in acima
3.1-multi-domain/
wp-content/
plugins/
monkeyman-rewrite-analyzer
como um link simbólico para o plug-in acima
Se eu quiser enfileirar o arquivo Javascript, eu deveria usar plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )
, mas usando __FILE__
aqui não vai funcionar, porque o caminho do arquivo real será /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, não /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php
, de modo WordPress não pode tirar a primeira parte para fora e gerar uma URL relativa à instalação do WordPress.
fonte
WP_PLUGIN_URL
não é recomendado porque os administradores devem ter permissão para alterar o nome do diretório deste plug-in específico, mas há outro motivo para evitá-lo? E, de fato, seu ingresso seria uma solução simples./external/folder/banana-plugin/
mas o administrador vincular esse diretório como/httpd-root/wp-content/plugins/apple-plugin/
? Então ele tentará ir/wp-content/plugins/banana-plugin/
, não? E acredito que o administrador deve ser livre para escolher os nomes de diretório de plugins individuais?Atualmente, uso um truque para obter o local do arquivo relativo ao WordPress:
wp_get_active_and_valid_plugins()
retorna os caminhos do arquivo,wp_settings.php
passa-os por cima e inclui os arquivos . Portanto, a$plugin
variável global se refere ao seu plug-in atual (é claro apenas quando o plug-in é carregado, então eu o salvo em uma variável global prefixada):Como os plug-ins também podem ser carregados como plug-ins obrigatórios ou de rede e esses loops usam outros nomes de variáveis , o código completo se parece com o seguinte:
O fallback ainda é
__FILE__
, portanto, se alguém alterar o nome da variável de loop no futuro, meu código ainda funcionará em 99% de todas as instalações, apenas minha instalação de desenvolvimento falhará e eu posso lançar uma nova versão com facilidade.fonte
global
. Graças ao seu post aqui, percebi que poderia torná-lo muito mais simples. BTW, eu também estou testandofalse === strpos( __FILE__, WP_CONTENT_DIR )
antes de executar suas instruções if porque estou assumindo que o plug-in está noWP_CONTENT_DIR
não está vinculado; Espero que seja lógica válida.Um comentário no bug 46260 sugere usar em
$_SERVER["SCRIPT_FILENAME"]
vez de__FILE__
. Isto funciona?fonte
index.php
incluilibrary.php
,$_SERVER['SCRIPT_FILENAME']
emlibrary.php
ainda seráindex.php
. Mas obrigado pela referência ao bug, eu o seguirei de perto!$_SERVER["SCRIPT_FILENAME"]
funciona se você usá-lo corretamente. Você só precisa usá-lo para definir um caminho base e, em seguida, incluir seus arquivos usando um caminho relativo a esse caminho base.Algo como:
Observe que isso é mais útil quando você ainda não tem acesso ao wp-blog-header.php (por exemplo, no processamento de uma solicitação de formulário baseada no Ajax)
fonte