Esta não é uma pergunta sobre como criar um plugin para WordPress. Em vez disso, o que, se houver, guias poderia ser aplicado a como montar a arquitetura de arquivo de qualquer plug-in.
Algumas outras linguagens de programação ou bibliotecas têm maneiras muito controladas de organizar diretórios e arquivos. Às vezes, isso é irritante e destaca a liberdade que o PHP oferece, mas, por outro lado, os plug-ins do WordPress são reunidos de qualquer maneira, conforme determinado pelo autor.
Não há uma resposta certa , mas minha esperança é refinar como eu e outros construímos plug-ins para torná-los mais amigáveis para outros desenvolvedores, mais fáceis de depurar, mais fáceis de depurar, mais fáceis de navegar e possivelmente mais eficientes.
A pergunta final: qual você acha que é a melhor maneira de organizar um plugin?
Abaixo estão algumas estruturas de amostra, mas de maneira alguma é uma lista exaustiva. Sinta-se livre para adicionar suas próprias recomendações.
Estrutura padrão assumida
/wp-content
/plugins
/my-plugin
my-plugin.php
Método Model View Controller (MVC)
/wp-content
/plugins
/my-plugin
/controller
Controller.php
/model
Model.php
/view
view.php
my-plugin.php
As três partes do MVC:
- O modelo interage com o banco de dados, consultando e salvando dados, e contém lógica.
- O controlador conteria tags de modelo e funções que a visualização utilizaria.
- A visualização é responsável por exibir os dados fornecidos pelo modelo, conforme construído pelo controlador.
Organizado pelo método de tipo
/wp-content
/plugins
/my-plugin
/admin
admin.php
/assets
css/
images/
/classes
my-class.php
/lang
my-es_ES.mo
/templates
my-template.php
/widgets
my-widget.php
my-plugin.php
WordPress Plugin Boilerplate
Disponível no Github
Com base na API do plug - in , nos padrões de codificação e nos padrões de documentação .
/wp-content
/plugins
/my-plugin
/admin
/css
/js
/partials
my-plugin-admin.php
/includes
my_plugin_activator.php
my_plugin_deactivator.php
my_plugin_i18n.php
my_plugin_loader.php
my_plugin.php
/languages
my_plugin.pot
/public
/css
/js
/partials
my-plugin-public.php
LICENSE.txt
README.txt
index.php
my-plugin.php
uninstall.php
Método fracamente organizado
/wp-content
/plugins
/my-plugin
css/
images/
js/
my-admin.php
my-class.php
my-template.php
my-widget.php
my-plugin.php
fonte
css/
,images/
ejs/
seriastyles/
,images/
escripts/
.Respostas:
Observe que os plugins são todos "controladores" pelos padrões WP.
Depende do que o plugin deve fazer, mas em todos os casos eu tentaria separar o máximo possível a saída da tela do código PHP.
Aqui está uma maneira de fazer isso facilmente - primeiro, defina uma função que carrega o modelo:
Agora, se o plug-in usa um widget para exibir dados:
O modelo:
Arquivos:
Onde você coloca suas CSS, JS, imagens ou como você projeta o contêiner para os ganchos é menos importante. É uma questão de preferência pessoal, eu acho.
fonte
Depende do plugin. Esta é minha estrutura básica para quase todos os plugins:
Isso seria algo que iria para a
lib
pasta.Se for um plugin particularmente complexo, com muitas funcionalidades da área administrativa, eu adicionaria uma
admin
pasta para conter todos esses arquivos PHP. Se o plugin fizer algo como substituir os arquivos de tema incluídos , talvez também haja uma pastatemplate
outheme
.Portanto, uma estrutura de diretórios pode ser assim:
fonte
IMHO, a rota mais fácil, mais poderosa e mais sustentável é usar uma estrutura MVC, e o WP MVC foi projetado para facilitar a escrita de plug-ins MVC (embora eu seja um pouco tendencioso ...). Com o WP MVC, você simplesmente cria os modelos, visualizações e controladores, e tudo o mais é tratado nos bastidores para você.
Controladores e visualizações separados podem ser feitos para as seções pública e administrativa, e toda a estrutura aproveita muitos dos recursos nativos do WordPress. A estrutura do arquivo e grande parte da funcionalidade são exatamente as mesmas das estruturas MVC mais populares (Rails, CakePHP, etc).
Mais informações e um tutorial podem ser encontrados aqui:
fonte
Estamos usando uma mistura de todos os métodos. Primeiro, estamos usando o Zend Framework 1.11 em nossos plugins e, portanto, tivemos que usar uma estrutura semelhante para os arquivos de classe por causa do mecânico de carregamento automático.
A estrutura do nosso plugin principal (que é usado por todos os nossos plugins como base) é semelhante a esta:
webeo-core.php
arquivo na pasta raiz do plug-in.Webeo_CoreLoader
classe dentro desse arquivo, que define algumas constantes do plugin, inicializa o carregador automático de classes e faz uma chamada para o método de configuração daCore.php
classe dentro dalib/Webeo
pasta. Isso é executado noplugins_loaded
gancho de ação com prioridade de9
.Core.php
classe é o nosso arquivo de inicialização do plugin. O nome é baseado no nome dos plugins.Como você pode ver, temos um subdiretório dentro da
lib
pasta para todos os nossos pacotes de fornecedores (Webeo
,Zend
). Todos os subpacotes dentro de um fornecedor são estruturados pelo próprio módulo. Para um novoMail Settings
formulário de administração, teríamos a seguinte estrutura:Nossos sub-plugins têm a mesma estrutura, com uma exceção. Aproximamos ainda mais a pasta do fornecedor devido à resolução de conflitos de nomes durante o evento de carregamento automático. Também chamamos a classe boostrap de plugins
E.g. Faq.php
com prioridade10
dentro doplugins_loaded
gancho.Provavelmente vou renomear a
lib
pastavendors
e mover todas as pastas públicas (css, imagens, js, idiomas) para uma pasta nomeadapublic
no próximo lançamento.fonte
Como muitos aqui já responderam Realmente depende do que o plug-in deve fazer, mas aqui está minha estrutura básica:
fonte
Sou parcial com o seguinte layout de plug-in, no entanto, ele geralmente muda dependendo dos requisitos dos plug-ins.
Ainda tenho que criar um plug-in do WordPress que exija uma arquitetura no estilo MVC, mas se eu fizesse isso, colocaria em um diretório MVC separado, que contém visualizações / controladores / modelos.
fonte
Minha lógica, quanto maior o plugin, mais estrutura eu uso.
Para plugins grandes, costumo usar o MVC.
Uso isso como ponto de partida e pulo o que não é necessário.
fonte
Todos os meus plugins seguem essa estrutura, que parece ser muito semelhante ao que a maioria dos outros desenvolvedores está fazendo:
O plugin-folder.php é geralmente uma classe que carrega todos os arquivos necessários do núcleo / pasta. Geralmente, no gancho init ou plugins_loaded.
Eu costumava prefixar todos os meus arquivos também, mas como o @kaiser observou acima, é realmente redundante e recentemente decidi removê-lo de qualquer plug-in futuro.
A biblioteca / pasta contém todas as bibliotecas auxiliares externas das quais o plug-in pode depender.
Dependendo do plugin, pode haver um arquivo uninstall.php na raiz do plugin. Na maioria das vezes, isso está sendo tratado através de register_uninstall_hook ().
Obviamente, alguns plug-ins podem não exigir arquivos ou modelos de administração, etc., mas a estrutura acima funciona para mim. No final, você apenas precisa encontrar uma estrutura que funcione para você e depois ficar com ela.
Eu também tenho um plug-in inicial, baseado na estrutura acima que eu uso como ponto de partida para todos os meus plugins. Tudo o que preciso fazer é pesquisar / substituir prefixos de função / classe e pronto. Quando eu ainda estava prefixando meus arquivos, era uma etapa extra que eu tinha que fazer (e bastante irritante), mas agora só preciso renomear a pasta do plugin e o arquivo principal do plugin.
fonte
Além disso, veja este ótimo modelo de widget do WP . Ele fornece ótimas dicas sobre estruturas (mesmo que não exista uma classe nem uma pasta para modelos separados).
fonte
Uma abordagem menos comum para estruturar os arquivos e diretórios de um plug-in é a abordagem de tipo de arquivo. Vale a pena mencionar aqui a integridade:
Cada diretório contém apenas arquivos desse tipo. Vale a pena notar que essa abordagem é insuficiente quando você tem muitos tipos de arquivos
.png .gif .jpg
que podem ser arquivados mais logicamente em um único diretório,images/
por exemplo.fonte