Boas Práticas na Criação de Plugins
Boas Práticas na Criação de Plugins
Quando se pretende criar vários plugins para o CMS WordPress, deve-se levar alguns critérios em consideração para não se encomodar futuramente. Neste artigo Plugin Para exibir imagem dos artigos mais comentados eu disse que falaria sobre os critérios que utilizo durante a criação de plugins, e como promessa é dívida, eis aqui o artigo para tal fim.
Para quem vai trabalhar com funções – sem classes – na criação de seus plugins, convém-se utilizar seu nome completo ou parte dele no início do nome da função, seguido pelo nome do plugin e enfim pelo nome da função em sí. Por que tanto trabalho? Oras, caso você nomeie uma função com o nome de uma função já existente no núcleo do wordpress ou existente em um outro plugin, um erro ocorrerá. Mas só colocando o meu nome na frente da função não é suficiente? Infelizmente não, isso porque você mesmo poderá criar outros plugins e cometer o erro de nomear uma função com o mesmo nome já existente em outro plugin seu.
Para ilustrar o erro, vamos supor que você criou dois plugins: Plugin 01 e Plugin 02 e que dentro deles exista uma função chamada insere_ads. Ao ativar o primeiro plugin no WordPress, nenhum erro ocorre, já ao tentar ativar o segundo plugin, o CMS WP não o ativará e exibirá a seguinte mensagem:

Essa mensagem “Cannot redeclare insere_ads()” indica que você tentou declarar uma função com o mesmo nome de outra função já declarada. Para esse erro não ocorrer, eu colocaria o nome do plugin antes do nome da função, ficaria assim:
Para o plugin 01
function plugin_01_insere_ads($content){
$ads = "<div>ADS AQUI</div>";
return $content . $ads;
}
E para o plugin 02
function plugin_02_insere_ads($content){
$ads = "<div>ADS AQUI</div>";
return $content . $ads;
}
Usando a idéia acima, você conseguirá ativar os dois plugins sem problemas, contudo, ainda poderá encomodar-se caso outro desenvolvedor de plugins tenha usado a mesma idéia e criado um plugin com o mesmo nome e a mesma função. Então o que fazer? Nesse caso, como já falei aqui, você pode colocar seu nome na frente da função, ficaria assim: anderson_makiyama_plugin_01_insere_ads() e anderson_makiyama_plugin_02_insere_ads(), claro que em vez de anderson makiyama você colocaria o seu próprio nome.
Por que trabalhar com classes na criação de plugins
Trabalhar com classes evita você cometer equívocos, principalmente quando trabalhando com constantes. Sabemos que o WordPress possui várias constantes (veja algumas no link: Constantes do WordPress) e caso você defina uma constante com o mesmo nome de uma já existente, seu plugin não trabalhará de forma esperada. O mesmo problema ocorrerá caso outro desenvolvedor tenha definido uma constante com o memso nome ou mesmo se o tema ativo no blog WordPress possua em algum de seus arquivos uma definição de constante idêntica. Veja o exemplo abaixo, comento depois:
function anderson_makiyama_plugin_02_insere_ads($content){
define(WP_CONTENT_URL,'http://xxxyyy');
$ads = "<div>". WP_CONTENT_URL ."</div>";
return $content . $ads;
}
No código acima você tentou definir uma contante já definida pelo núcleo do CMS WordPress, que é a constante WP_CONTENT_URL, então sua definição será ignorada e o valor esperado “http://xxxyyy” não será retornado. Trabalhando com classe você poderia trabalhar com uma constante com o mesmo nome sem ter problemas, veja como ficaria o código:
class Anderson_Makiyama_Plugin_01{
const WP_CONTENT_URL = 'http://xxxyyy';
public function insere_ads($content){
$ads = "<div>". self::WP_CONTENT_URL ."</div>";
return $content . $ads;
}
}
Quando você quiser obter o valor da sua constante WP_CONTENT_URL bastará acessá-la através da sintaxe: self::WP_CONTENT_URL. Desta forma você evita cometer equívocos. Note que quando você opta por trabalhar com classes na criação de seus plugins WordPress, deverá tomar cuidado na instanciação do objeto, caso você instancie as classes em um mesmo objeto em plugins distintos, poderá cometer equívocos novamente. Por exemplo, se no plugin 01 eu faço isso:
$anderson_makiyama = new Anderson_Makiyama_Plugin_01();
E no plugin 02 eu faço isso:
$anderson_makiyama = new Anderson_Makiyama_Plugin_02();
Isso poderá dar problema, pois o plugin 02 atribui um novo valor ao objeto $anderson_makiyama, então se durante algum momento após o carregamento do plugin 02 eu tentar obter valores e invocar métodos da classe Anderson_Makiyama_Plugin_01, estarei na verdade fazendo as chamadas a um objeto da classe Anderson_Makiyama_Plugin_02
Para resolver esse problema, utilizo um ID único em cada plugin, e guardo esse valor dentro da classe de cada um, então antes de instanciar um objeto eu pego o ID do plugin e utilizo como indexador no array $anderson_makiyma. $anderson_makiyama não é um objeto, mas uma array de objetos. Veja o código abaixo:
class Anderson_Makiyama_Plugin_01{
const PLUGIN_ID = '1';
public static $PLUGIN_ID = self::PLUGIN_ID;
const CLASS_NAME = 'Anderson_Makiyama_Plugin_01';
public static $CLASS_NAME = self::CLASS_NAME;
const WP_CONTENT_URL = 'http://xxxyyy';
public function insere_ads($content){
$ads = "<div>". self::WP_CONTENT_URL ."</div>";
return $content . $ads;
}
public function getStaticVar($var){
return self::$$var;
}
}
if(!isset($anderson_makiyama)) $anderson_makiyama = array();
$anderson_makiyama_indice = Anderson_Makiyama_Plugin_01::PLUGIN_ID;
$anderson_makiyama[$anderson_makiyama_indice] = new Anderson_Makiyama_Plugin_01();
add_filter('the_content', array($anderson_makiyama[$anderson_makiyama_indice]->getStaticVar('CLASS_NAME'),'insere_ads'));
Se você achou estranho esse método getStaticVar, dê uma lida neste artigo: T_PAAMAYIM_NEKUDOTAYIM
Em suma, no código acima eu verifico se já existe a variável $anderson_makiyama, caso negativo crio um array vazio, na sequência pego o ID do plugin. Agora com o ID único eu instancio um objeto da classe e guardo-o no índice correto do array $anderson_makiyama. Fazendo assim você pode trabalhar com várias classes, cada uma acessível no índice do array $anderson_makiyama que é igual ao ID do respectivo plugin, sem nenhum problema. Interessante, não?
Se ficou alguma dúvida, deixe-a aqui nos comentários. Até o próximo artigo aqui no WordPress Livro.














