Usando ganchos do WordPress para limpar código, ativar e desinstalar

Publicados: 2015-01-23

Os autores de plugins dedicam tanto tempo e energia à funcionalidade principal de seus produtos, que permitem que coisas menos importantes sejam deixadas de lado.

Por exemplo, ativação e desativação. Embora os ganchos de ativação sejam difundidos – muitos plugins precisam adicionar algumas opções, liberar regras de reescrita, talvez criar uma tabela de banco de dados ou verificar diferenças de versão na instalação – os ganchos de desativação e desinstalação são muito menos comuns.

O ponto aqui? Muitos autores de plugins não têm tempo para limpar depois de si mesmos. A instalação do WordPress realmente precisa da tabela personalizada que você criou após a remoção do plugin? Por que não limpar algumas opções exclusivas do plugin antes de descartá-lo?

Neste artigo, mostrarei como usar ganchos de ativação, desativação e desinstalação para inicializar seu plug-in e limpar as coisas com mais facilidade depois que os usuários terminarem com seu produto.

  • O Gancho de Ativação
    • A Sequência de Instalação
    • Liberando Regras de Reescrita
    • Criando tabelas de banco de dados
    • Verificações de dependência
  • O Gancho de Desativação
  • O Gancho de Desinstalação
  • Segurança Adicional
  • É hora de limpar

Nota: Se você planeja percorrer este artigo, sugiro fortemente dar uma olhada na seção “Segurança Adicional” no final, que complementa o código com algumas verificações de segurança valiosas. Além disso, se você precisar de ajuda com ganchos de plug-in do WordPress, aqui está uma rápida atualização sobre o uso de ganchos do WordPress e como ativar uma função no WordPress.

O Gancho de Ativação

Embora o gancho de ativação seja bastante simples, instalá-lo é um caso um pouco especial, portanto, precisamos prestar atenção à sequência de eventos. Antes de entrarmos em tudo isso, aqui está um exemplo simples:

Carregando essência f356a899b7f009d136644383339db4f6

A chave para tudo isso é a função register_activation_hook() . O primeiro parâmetro é o caminho para o arquivo de plugin principal; o segundo parâmetro define a função a ser executada. Internamente, a função register_activation_hook() é um wrapper para a ação “activate_[plugin_name]”, mas como é um pouco mais fácil de usar, é incomum ver o gancho em plugins.

A Sequência de Instalação

Compreender a sequência de instalação é importante porque evita o uso de métodos aos quais você pode estar acostumado. register_activation_hook() é chamado entre o usuário clicar no link de ativação e, consequentemente, ver o aviso de ativação. Ele é executado em uma página intermediária, que redireciona imediatamente antes que qualquer gancho possa ser executado.

Vejamos um exemplo para ver por que isso é uma grande chatice:

Liberando Regras de Reescrita

Vários plugins criam tipos de postagem personalizados. Liberar as regras de reescrita na ativação para garantir que os usuários não recebam um erro 404 ao visitar uma postagem do novo tipo de postagem personalizada é uma jogada inteligente.

O código abaixo parece lógico, mas falhará.

Carregando essência 7c656623608efd1785437ebe7cdb7350

Parece perfeitamente bem. O tipo de postagem personalizado é criado e, na ativação, liberamos as regras de reescrita. O problema é que os tipos de postagem personalizados ainda não foram criados quando liberamos as regras de reescrita.

Veja como fica o fluxo do processo:

  1. O usuário instala o plugin.
  2. O usuário clica no link de ativação.
  3. Uma página intermediária executa apenas o gancho de ativação, nada mais. Isso libera as regras de reescrita.
  4. O plugin está ativo e o código é executado normalmente. O tipo de postagem personalizado é registrado.

Uma solução postada no Stack Overflow, que é oficialmente endossada pelo WordPress Codex, resolve nosso pequeno problema. A solução envolve adicionar uma opção para indicar que o plugin acabou de ser instalado.

Se essa opção existir, fazemos nossa ativação e a excluímos.

Algo assim:

Carregando essência 6f0927b3bf9807e426c8778a3bf3a797

Pessoalmente, não gosto muito desta solução. O problema é que a verificação na linha oito é executada em cada carregamento de página. Não há nada para se preocupar, pois não sobrecarregará seus servidores e não diminuirá a velocidade do site para seus usuários. É uma verificação muito rápida com um impacto insignificante no desempenho. No entanto, é desnecessário 99,9% das vezes.

Existe uma solução melhor mencionada no Codex na documentação para a função flush_rewrite_rules() . Nesta solução, usamos a modularidade de nossas funções para registrar o tipo de postagem personalizado na ativação separadamente:

Carregando essência b44bf08bf511277184a49de53c0c3ed8

Em vez de depender de uma verificação que precisa ser executada o tempo todo, usamos a função de ativação para registrar nossos tipos de postagem. Observe que uma vez que nosso plugin é ativado, os tipos de postagem sempre serão registrados a partir do gancho init .

Este é um triste exemplo do Codex estar em todo lugar. Geralmente, o WordPress tem uma boa documentação, mas se algo parecer inútil ou ilógico, não tenha medo de fazer sua própria pesquisa.

Criando tabelas de banco de dados

Outra tarefa que alguns plugins realizam é ​​criar tabelas de banco de dados. Na maioria das vezes, isso é desnecessário, mas existem alguns casos de uso legítimos.

Este exemplo do artigo do Codex sobre Criação de tabelas mostra como várias chamadas de ativação podem ser usadas:

Carregando essência 9a1d4757d023f2442093a9a158cdb6b4

A primeira função, jal_install() cria uma nova tabela de banco de dados. A segunda função, jal_install_data , adiciona dados iniciais à tabela. Em vez de usar register_activation_hook() para adicionar uma função contendo todo esse código, podemos usar register_activation_hook várias vezes.

Esta é uma ótima prática para modularidade. Por um lado, você não precisa adicionar dados de teste iniciais – é tão simples quanto remover o gancho de ativação – para que você possa manter a função intacta. Por outro lado, você é livre para reutilizar essas funções em qualquer lugar, pois elas são separadas.

Verificações de dependência

Outra tarefa comum para a função de ativação é verificar dependências. Seu plugin pode contar com uma versão específica do WordPress, outro plugin ou até mesmo uma versão específica do PHP.

O código abaixo verifica se há uma versão mínima de WP e PHP e redireciona o usuário (sem ativar o plugin) se necessário:

Carregando essência 79a2c5414969291ec90cac11c38b7522

O Gancho de Desativação

Os ganchos de desativação são executados quando um usuário desativou um plug-in, mas antes de ser desinstalado (excluído). Ganchos de desativação são usados ​​da mesma forma que ganchos de ativação:

Carregando a essência 6ed9bb66ee1863ab3e84db1f9f753792

Desativação significa que o usuário desativou apenas seu plugin, então você não vai querer fazer tanto quanto faria durante uma desinstalação. Talvez você queira liberar as regras de reescrita, mas neste estágio, você não vai querer se livrar de todas as suas opções e sua tabela de banco de dados (se você tiver uma).

Isso é bastante simples, mas prestarei atenção especial à liberação das regras de reescrita, pois, mais uma vez, elas são problemáticas.

O codex recomenda fazê-los como mostrado abaixo, mas isso não funciona :

Carregando essência 4440a0178b4e34506530e13d0ead8958

A razão pela qual isso não funciona é a mesma de antes. A execução de uma desativação executa o gancho init , o que significa que conforme estamos desativando nosso plugin, também estamos registrando nosso tipo de postagem personalizado. As regras de reescrita são liberadas, mas levam em consideração o tipo de postagem personalizado.

Um bilhete Trac está em vigor para resolver isso, mas até então, não posso lhe dar uma maneira muito boa de fazer isso. A única maneira que descobri que funciona é excluir completamente as regras de reescrita:

Carregando essência 98b496826278084a2f7a5ea27994f781

Embora isso tenha funcionado para mim no passado, eu não recomendaria. Ele introduz uma incerteza maior do que o problema de ter algumas regras extras de reescrita. Prefiro exibir uma nota aos usuários solicitando que eles visitem as configurações de permalink após a desativação, o que liberaria as regras de reescrita. Até que uma solução melhor seja implementada, estamos presos a isso... desculpe!

O Gancho de Desinstalação

Existem duas maneiras de executar o código ao desinstalar um plug-in. Você pode usar o gancho de desinstalação via register_uninstall_hook() ou pode usar um arquivo uninstall.php dedicado dentro do seu plugin. Vou mostrar os dois, mas o método preferido é usar o arquivo de desinstalação.

O principal problema com o gancho de desinstalação é que “ele impede que o arquivo principal do plug-in seja executado durante a desinstalação, o que pode ser problemático se o plug-in executar código no espaço global. Também é melhor porque o código de desinstalação é centralizado.” – Scott Riley

O código abaixo mostra o processo de desinstalação usando um gancho básico:

Carregando a essência 040847db4739148900b1ee29d227d71d

Conforme discutido, esta não é a melhor solução. Uma maneira muito melhor de lidar com desinstalações é usar o arquivo uninstall.php . Tudo que você precisa fazer é criá-lo e ele será usado se estiver disponível.

Carregando essência 44dde25dcb57b4239be8586f4d04c765

Como você pode ver, esta é realmente uma solução mais simples. O melhor de tudo é que é independente.

Segurança Adicional

Eu não queria complicar demais os exemplos mostrados até agora com problemas relacionados à segurança, mas você realmente deveria tomar algumas medidas para garantir que apenas aqueles que têm permissão para fazer isso possam executar essas ações.

Use o seguinte snippet na ativação e desativação:

Carregando essência 357037989065f89c15f049314e9831bf

Este bloco de código garante que o usuário tenha as permissões para realizar esta ação e que a ação se originou na página apropriada. Isso deve proteger contra a maioria das tentativas maliciosas.

O processo de desinstalação é especial, então precisaremos usar um código um pouco diferente:

Carregando essência 541c93cfa9b89e1e6c7b48b06732d31f

É hora de limpar

Se o seu plug-in adiciona coisas ao WordPress, é seu dever como desenvolvedor removê-lo quando um usuário decidir excluir seu plug-in.

O uso dos métodos de ativação, desativação e desinstalação descritos acima permitirá que você construa um sistema que faça isso com segurança. Também recomendo a leitura deste tópico do Stackexchange, que descreve esses processos em ambientes OOP.

Se você ainda não é membro do WPMU DEV, inscreva-se hoje para uma avaliação gratuita, totalmente sem riscos. Como membro, você terá acesso a todos os nossos excelentes plugins e serviço de hospedagem extremamente rápido, além de suporte especializado 24 horas por dia, 7 dias por semana, para todas as suas dúvidas e problemas relacionados ao WordPress.

Você acha que os plugins deixam seu banco de dados em uma bagunça quando você os remove? Deixe-nos saber o que você pensa nos comentários abaixo.
Tag: