WordPress precisa de um nome para o filtro. Como não fornecemos um, o WordPress chama _wp_filter_build_unique_id()e cria um. Este nome não é previsível porque usa spl_object_hash().
Se executar um var_export()em $GLOBALS['wp_filter'][ 'wp_footer' ]nós obter algo parecido com isso agora:
Para encontrar e remover nossa ação maligna, precisamos passar pelos filtros associados ao gancho (uma ação é apenas um filtro muito simples), verifique se é uma matriz e se o objeto é uma instância da classe. Em seguida, tomamos a prioridade e removemos o filtro, sem nunca ver o identificador real .
Quando chamamos essa função? Não há como saber com certeza quando o objeto original é criado. Talvez algumas vezes antes 'plugins_loaded'? Talvez mais tarde?
Usamos o mesmo gancho ao qual o objeto está associado e saltamos muito cedo com prioridade 0. Essa é a única maneira de ter certeza. Aqui está como removeríamos o método print_message_3():
@ MikeSchinkel Idéia relacionada , ainda não tentei na prática até agora.
Fuxia
Interessante. Acho sua resposta muito boa, mas sua última conclusão é muito ruim. Na minha opinião, as instâncias de classe devem, em geral, ser instanciadas assim que o WordPress carregar o plugin. Então, o construtor da instância da classe não deve executar nenhuma ação real, basta adicionar ações e filtros. Dessa forma, os plug-ins que desejam remover ações e filtros da sua instância de classe podem ter certeza de que eles são realmente adicionados quando plugins_loadedchamados, o que é exatamente plugins_loadedpara isso. Obviamente, a instância da classe ainda precisa estar acessível, possivelmente via padrão singleton.
Engelen
@engelen Esta é uma resposta antiga. Atualmente, eu ofereceria uma ação para remover os retornos de chamada. Mas não um Singleton, isso é um anti-padrão por muitas razões.
fuxia
Esta resposta também funciona para remover ações, comoremove_action()
Nick Pyett
0
Não tenho certeza, mas você pode tentar usar um singleton.
Você deve armazenar a referência do objeto em uma propriedade estática da sua classe e retornar essa variável estática de um método estático. Algo assim:
Contanto que você conheça o objeto (e use o PHP 5.2 ou superior - a versão estável do PHP atual é 5.5, 5.4 ainda é suportada, 5.3 é o fim da vida útil), você pode simplesmente removê-lo com o remove_filter()método Tudo o que você precisa lembrar é o objeto, o nome do método e a prioridade (se usada):
No entanto, você comete um pequeno erro no seu código. Não prefixe $thiso e comercial &, que era necessário no PHP 4 (!) E está muito atrasado. Isso pode tornar problemático lidar com seus ganchos, então deixe-o fora do caminho:
&
do seu&$this
, é uma coisa do PHP 4Respostas:
Essa é uma pergunta muito boa. Ele vai para o coração negro da API do plug-in e das melhores práticas de programação.
Para a resposta a seguir, criei um plugin simples para ilustrar o problema com código de fácil leitura.
Agora vemos isso:
WordPress precisa de um nome para o filtro. Como não fornecemos um, o WordPress chama
_wp_filter_build_unique_id()
e cria um. Este nome não é previsível porque usaspl_object_hash()
.Se executar um
var_export()
em$GLOBALS['wp_filter'][ 'wp_footer' ]
nós obter algo parecido com isso agora:Para encontrar e remover nossa ação maligna, precisamos passar pelos filtros associados ao gancho (uma ação é apenas um filtro muito simples), verifique se é uma matriz e se o objeto é uma instância da classe. Em seguida, tomamos a prioridade e removemos o filtro, sem nunca ver o identificador real .
Ok, vamos colocar isso em uma função:
Quando chamamos essa função? Não há como saber com certeza quando o objeto original é criado. Talvez algumas vezes antes
'plugins_loaded'
? Talvez mais tarde?Usamos o mesmo gancho ao qual o objeto está associado e saltamos muito cedo com prioridade
0
. Essa é a única maneira de ter certeza. Aqui está como removeríamos o métodoprint_message_3()
:Resultado:
E isso deve remover a ação da sua pergunta (não testada):
Conclusão
'plugins_loaded'
. Não apenas quando o seu plugin é chamado pelo WordPress.fonte
plugins_loaded
chamados, o que é exatamenteplugins_loaded
para isso. Obviamente, a instância da classe ainda precisa estar acessível, possivelmente via padrão singleton.remove_action()
Não tenho certeza, mas você pode tentar usar um singleton.
Você deve armazenar a referência do objeto em uma propriedade estática da sua classe e retornar essa variável estática de um método estático. Algo assim:
fonte
Contanto que você conheça o objeto (e use o PHP 5.2 ou superior - a versão estável do PHP atual é 5.5, 5.4 ainda é suportada, 5.3 é o fim da vida útil), você pode simplesmente removê-lo com o
remove_filter()
método Tudo o que você precisa lembrar é o objeto, o nome do método e a prioridade (se usada):No entanto, você comete um pequeno erro no seu código. Não prefixe
$this
o e comercial&
, que era necessário no PHP 4 (!) E está muito atrasado. Isso pode tornar problemático lidar com seus ganchos, então deixe-o fora do caminho:E é isso.
fonte
$this
externo (outro plugin / tema).