Plugins em diretórios com links simbólicos?

19

Quando desenvolvo plugins, eu os testo em várias versões do WordPress, criando links simbólicos para o meu diretório de plugins nos diferentes diretórios wp-content . Isso é ótimo, pois só preciso editar os arquivos uma vez, mas isso quebra uma importante construção para gerar referências a recursos em meu plug-in: __FILE__ refere-se à localização do plug-in físico, não a em wp-content . Como devo resolver isso?

Minha estrutura de diretórios é assim:

  • %código%
    • %código%
      • %código%
        • /path/to/wordpress/development/dir/
        • %código%
          • plugin-development/
    • %código%
      • %código%
        • %código%
          • %código%
            • monkeyman-rewrite-analyzer/ como um link simbólico para o plug-in acima
      • %código%
        • %código%
          • %código%
            • monkeyman-rewrite-analyzer.php como um link simbólico para o plug-in acima
      • %código%
        • %código%
          • %código%
            • js/ como um link simbólico para o plug-in acima

Se eu quiser enfileirar o arquivo Javascript, devo usar monkeyman-rewrite-analyzer.js , mas usar versions/ aqui não funcionará, porque o caminho real do arquivo será 3.1/ , não wp-content/ , então o WordPress não pode remover o primeira parte e gerar uma URL relativa à instalação do WordPress.

    
por Jan Fabry 20.04.2011 / 12:13

4 respostas

6

O problema pode ser parcialmente resolvido com um plug-in de uso obrigatório ligado ao filtro plugins_url .

Ele não lidará com todos os outros casos em que plugin_basename() é usado, como register_activation_hook() e co.

Mais informações: enlace

    
por scribu 20.04.2011 / 12:56
3

Eu atualmente uso um truque para obter o local do arquivo relativo ao WordPress: wp_get_active_and_valid_plugins() retorna os caminhos dos arquivos e wp_settings.php faz um loop sobre eles e inclui os arquivos . Portanto, a variável global $plugin se referirá ao seu plug-in atual (é claro, somente quando o plug-in é carregado, portanto, salve-o em uma variável global prefixada):

$monkeyman_Rewrite_Analyzer_file = $plugin;

Porque plugins também podem ser carregados como plugins de rede ou de uso obrigatório e esses loops usam outros nomes de variáveis , o código completo se parece com isto:

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

O fallback ainda é __FILE__ , então se alguém alterar o nome da variável de loop no futuro, meu código ainda funcionará para 99% de todas as instalações, somente minha configuração de desenvolvimento falhará e eu posso lançar uma nova versão com facilidade.

    
por Jan Fabry 20.04.2011 / 12:22
0

Um comentário no erro 46260 sugere usar $_SERVER["SCRIPT_FILENAME"] em vez de __FILE__ . Isso funciona?

    
por fuxia 20.04.2011 / 12:22
0

$_SERVER["SCRIPT_FILENAME"] funciona se você usá-lo corretamente. Você só precisa usá-lo para definir um caminho base e incluir seus arquivos usando um caminho relativo a esse caminho base.

Algo como:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

Note que isso é mais útil quando você ainda não tem acesso ao wp-blog-header.php (ou seja, ao processar uma solicitação de formulário baseada em ajax)

    
por Chad Furman 24.03.2012 / 17:06