Autoloader de plug-ins de uso obrigatório: Como usar get_plugins () corretamente?

4

Minha classe autoloader é responsável pelo carregamento de plug-ins obrigatórios que não estão na raiz da pasta mu-plugins . Para localizá-los, preciso usar a função get_plugins() . De acordo com o Codex , a função aceita um parâmetro:

  

$ plugin_folder (string) (opcional): Caminho relativo para a pasta do único plugin.

Minha hierarquia de arquivos é assim:

|-- /mu-plugins
|   |-- autoload.php                    // only includes wpmu/autoload.php
|   |-- /wpmu
|   |   |-- autoload.php                // uses **get_plugins()** and autoloads other MU plugins
|   |-- /mu-plugin-to-autoload-A
|   |   |-- plugin-file-to-autoload.php // this plugin file should be autoloaded
|   |-- /mu-plugin-to-autoload-B
|   |   |-- plugin-file-to-autoload.php // this plugin file should be autoloaded

Eu pensei que deveria ser assim:

// array to store plugins
$plugins = [];
// get mu-plugin folders
$plugin_dirs = glob(WPMU_PLUGIN_DIR . '/*' , GLOB_ONLYDIR);
// loop through mu-plugin folders
foreach ($plugin_dirs as $plugin_dir) {
    $plugins[] = get_plugins($plugin_dir);
}

No entanto, a função get_plugins () retorna um array vazio.

Eu quero alcançar uma funcionalidade semelhante à que Sébastien Lavoie fez em sua essência no GitHub . Seu script deve estar na raiz da pasta WPMU, já que ele usa get_plugins('/../mu-plugins') , o que eu não entendo (ele vai e volta para a pasta wpmu plugins?).

$plugins = array();
foreach (get_plugins('/../mu-plugins') as $plugin_file => $data) {
    if (dirname($plugin_file) != '.') { // skip files directly at root
        $plugins[] = $plugin_file;
    }
}

No entanto, funciona (como testei).

Espero que tudo faça sentido. :)

    
por Petr Cibulka 04.05.2014 / 15:41

1 resposta

3

'get_plugins' destina-se a ser utilizado apenas com plug-ins normais e também analisa cabeçalhos de plug-ins e devolve apenas plug-ins válidos, como

/* Plugin Name: A plugin */

No entanto, os plug-ins mu podem funcionar mesmo sem esses cabeçalhos.

Considere também que com o WP 3.9 foi introduzida a função wp_register_plugin_realpath que deve ser usada para garantir a compatibilidade com pastas vinculadas ao symbolink.

De acordo com um post de Ryan McCue no make. wordpress.org a sinple, mas o carregador de plug-ins do mu deve ser algo assim:

<?php
$plugins = array(
    'my-mu-plugin/my-mu-plugin.php'
);
foreach ( $plugins as $plugin ) {
    $path = dirname( __FILE__ ) . '/' . $plugin;
    // Add this line to ensure mu-plugins subdirectories can be symlinked
    wp_register_plugin_realpath( $path );
    include $path;
}

A matriz $plugins aqui é codificada. Sinceramente achei essa abordagem mais funcional do que a glob + get_plugins

porque:

  • é mais rápido
  • funciona para plugins mu que não tem nenhum cabeçalho de plugins

Claro que é necessário adicionar manualmente uma linha no array toda vez que você instalar um novo plugin, mas isso não é um grande problema, e também dá a capacidade de facilmente desativar um plugin mu.

    
por gmazzap 04.05.2014 / 17:46