namespaces-folders

 

Você que desenvolve para WordPress há um tempo, já deve ter percebido o quanto é comum a utilização de prefixos nas funções, certo?

Basta reparar no código fonte do Akismet, um dos plugins mais populares que existe, ou até mesmo nas próprias funções nativas do WordPress. Em ambos os casos você vai se deparar com o raio dos prefixos.
Por exemplo: akismet_init()wp_enqueue_style()

Eu não sei você, mas eu acho isso no mínimo um porre. Os nomes das funções ficam imensos e além disso, já pensou se alguém criar o mesmo prefixo que o seu?

Apesar disso, não me espanta em nada se você faz dessa forma. O Próprio WordPress incentiva esse tipo de prática.

Ué? Mas então o que você está sugerindo? Tirar o prefixo simplesmente e usar um nome genérico? Quase isso, vamos lá.

Namespaces

A finalidade dos prefixos é criar uma maneira de isolar um pedaço do seu código com a tentativa de evitar que entre em conflito com o código de outras pessoas e até mesmo seu. E não tem nada de errado nisso. Porém existe uma maneira muito mais elegante e inteligente de se fazer isso usando Namespaces! Detalhe que é um recurso que está presente desde a versão 5.3 do PHP!

Como funciona na prática? Vamos pensar num exemplo. Imagine que você tem 2 plugins instalados e os 2 precisam carregar um arquivo javascript.

  • Da maneira tradicional utilizando prefixos essa seria a maneira padrão que os plugins teriam para chamar o javascript
//PLUGIN 1
add_action('wp_enqueue_scripts','plugin1_enqueue_scripts');
function plugin1_enqueue_scripts(){
     wp_enqueue_script( 'plugin1', 'js1.js'); 
}

//PLUGIN 2
add_action('wp_enqueue_scripts','plugin2_enqueue_scripts');
function plugin2_enqueue_scripts(){
     wp_enqueue_script( 'plugin2', 'js2.js'); 
}
  • Agora usando namespaces
//PLUGIN 1
namespace Plugin1;
add_action('wp_enqueue_scripts','Plugin1\enqueue_scripts');
function enqueue_scripts(){
     wp_enqueue_script( 'plugin1', 'js1.js'); 
}

//PLUGIN 2
namespace Plugin2;
add_action('wp_enqueue_scripts','Plugin2\enqueue_scripts');
function enqueue_scripts(){
     wp_enqueue_script( 'plugin2', 'js2.js'); 
}

Percebeu a diferença?

Só foi necessário 1 linha a mais. Dessa forma é possível organizar o seu código de uma maneira muito melhor e criar funções com nomes bem menores e que fazem sentido! Nesse caso por exemplo cada plugin tem uma função com o mesmo nome chamada enqueue_scripts() e elas não vão entrar em conflito porque o Namespace de cada plugin está fazendo o papel de isolamento. Interessante, não?

Aproveite essa funcionalidade pra manter seu código organizado e crie uma pasta para cada Namespace existente. E caso você precise de Namespaces aninhados, não há problema nenhum. É possível fazer isso:

//PLUGIN 2
namespace Plugin2\Scripts;
add_action('wp_enqueue_scripts','Plugin2\Scripts\enqueue_scripts');
function enqueue_scripts(){
     wp_enqueue_script( 'plugin2', 'js2.js'); 
}

Um pouco de orientação ao objeto

Gostaria só de lembrar que essa prática de utilizar Namespaces é muito mais comum quando trabalhada de forma orientado ao objeto. Isso porque seu código fica ainda mais organizado, você pode utilizar classes e todas as vantagens do OOP e ainda por cima pode utilizar o Autoload, que é uma outra técnica muito mão na roda que carrega todas as suas classes automaticamente de forma inteligente conforme você vai precisando. Sim, existe uma maneira bem mais legal de carregar suas classes do que ficar usando requires e includes manualmente!

Nesse caso os Namespaces e Autoload caminham juntos, mas esse assunto fica para um próximo post. Bom, já que eu mencionei o assunto, só pra não passar em branco aí vai uma maneira bem básica de se implementar o mesmo plugin 1 orientado ao objeto

//Plugin 1
namespace Plugin1;
class Meu_Plugin{
     function enqueue_scripts(){
          wp_enqueue_script( 'plugin1', 'js1.js'); 
     }
}
$meu_plugin= new Plugin1\Meu_Plugin();
add_action('wp_enqueue_scripts',array($meu_plugin, 'enqueue_scripts');

 

Não conhecia Namespaces? Escreve aí se isso te ajudou ou se era algo que você já sabia ou meio que já tinha ouvido falar :)