Existe alguma documentação em algum lugar que explica qual é o ciclo de vida dos plug-ins?
Estou iniciando um novo plugin com o estilo OOP e acabei de descobrir que minha classe principal está sendo instanciada muito (graças ao Xdebug e Netbeans).
Eu me pergunto o porquê, e isso me irrita porque estou instanciando um objeto API do Dropbox, e eu realmente não acho que o WordPress instanciaria tanto minha classe principal.
Não encontrei nada relacionado ao ciclo de vida dos plug-ins no Codex nem no Google.
plugin-development
codex
RitonLaJoie
fonte
fonte
Respostas:
O que significa 'estilo OOP' significa para você? Envolvendo todas as suas funções com uma declaração de classe? Então você está fazendo errado. Você usa a classe como espaço para nome.
Hã?
Experimente e conte o número de arquivos criados. Se eu experimentar, há um arquivo criado para cada solicitação de página. Isso significa que apenas uma instância da classe Foo para cada solicitação de página.
Vamos tentar uma chamada de ação
Se eu procurar no meu diretório wp-content, encontrei dois arquivos. Não mais. Um arquivo é criado quando a instância da classe é criada. E um é criado quando a chamada de ação é concluída.
OK, vamos fazer algumas coisas estúpidas com a nossa instância. Remova o
add_action( 'plugins_loaded', .. )
e adicione este código:Quantos arquivos você espera? Eu espero duas. Um do construtor, outro do método.
Uma nova instância é criada apenas quando o
new
operador é usado.Agora conto quatro arquivos. Dois do construtor e dois do método Isso ocorre porque o WordPress primeiro inclui o plug-in e depois executa o gancho de ação
plugins_loaded
.A melhor prática é usar o gancho de ação em
plugins_loaded
vez de criar uma instância de uma função porque, se o arquivo do plug-in estiver incluído em qualquer lugar (por exemplo, em outro arquivo do seu plug-in), uma nova instância da classe será criada toda vez que o arquivo for incluído. O gancho de açãoplugins_loaded
é feito apenas uma vez para cada solicitação de página.fonte
O que pode acontecer é que você passe uma cópia da sua classe para um filtro ou ação. Por exemplo, se você deseja modificar diretamente variáveis de classe dentro de um gancho ou filtro, também deve passar o gancho por referência
ao invés de
Conforme mencionado pela bainternet, você também pode usar um padrão singleton para garantir que um objeto específico seja instanciado apenas uma vez (chamadas adicionais retornam a referência a esse objeto).
Você também pode considerar tornar estáticas algumas funções (fornecendo a elas a palavra-chave estática. Isso geralmente é feito para funções do tipo 'auxiliar' que não interagem com o restante da classe. Métodos estáticos podem ser chamados sem instanciar uma classe.
Você também pode passar funções estáticas para uma ação / filtro:
Eu também verifiquei http://codex.wordpress.org/Plugin_API/Action_Reference e descobri que os plugins só podem ser carregados em dois estágios da solicitação (muplugins_loaded e plugins_loaded).
fonte