Essa é uma prática ruim, devo dizer. Passou as últimas duas horas procurando uma solução para remover ações e filtros adicionados por meio de funções anônimas.
Este é o código usado em um tema principal e preciso removê-lo.
/**
* Add custom columns to admin comments grid
* * Rate that user set.
*/
add_filter( 'manage_edit-comments_columns', function( $default ) {
$columns['smr_comment_rate'] = __( 'Rate', 'txtdmn' );
return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});
Recebi a resposta de toscho , brinquei muito com ela, mas sem ajuda. Então, existe alguma outra alternativa que remova ações / filtros adicionados por funções anônimas?
obrigado
Respostas:
O problema é que você não pode distinguir entre uma função anônima e outra; portanto, é possível remover um fechamento (ou seja, função anônima), mas se mais de um fechamento agir no mesmo filtro com a mesma prioridade, você deverá fazer uma escolha. , remova todos eles ou remova apenas um (sem saber exatamente qual).
Vou mostrar como removê-los todos usando uma função altamente derivada da resposta @toscho que você postou:
Renomeei a função
remove_object_filter
porque ela pode remover todos os tipos de filtros de objetos: métodos de classe estática, métodos de objetos dinâmicos e fechamentos.O
$priority
argumento é opcional, mas ao remover fechamentos, ele sempre deve ser usado; caso contrário, a função removerá qualquer fechamento adicionado ao filtro, independentemente da prioridade, porque quando$priority
omitido, todos os filtros que usam a classe / método ou o fechamento de destino são removido.Como usar
fonte
E se você adicionar seu filtro, com a prioridade 11, para continuar? Isso é feio, mas pode funcionar no seu caso.
fonte
Os filtros e ações anônimos podem ser removidos nativamente usando o seguinte:
Ao gerar o ID exclusivo usando
spl_object_hash()
, as funções anônimas são comparáveis entre si, portanto, o objeto de fechamento completo não precisa ser recriado novamente.Se vários filtros ou ações estiverem conectados à mesma tag com a mesma prioridade, removerá o filtro ou a ação mais recente adicionada. Se houver um que você precise manter, será necessário remover todos os filtros até o filtro necessário e depois adicionar novamente os outros, conforme necessário.
Geralmente, isso volta às melhores práticas. Somente utilizarei funções anônimas como parte de um tema personalizado que estou desenvolvendo para um cliente, onde não quero que o filtro seja substituído ou removido. Em qualquer tema público ou plug-in que eu desenvolva, usarei uma fábrica para inicializar uma classe, adicionar todos os meus filtros e ações e, em seguida, armazenar a instância como uma variável estática.
fonte