Há relatos de que remove_filter
não funciona sob algumas circunstâncias, e que devemos fornecer alternativas . No entanto, o artigo não deixa claro em que circunstâncias isso acontece.
Eu estou procurando exemplos de código que irão quebrar remove_filter
, com WordPress e PHP versão e, eventualmente, outras informações relevantes, fornecidas. Acho que o snippet a seguir deve ser um modelo útil:
<?php
include('wp-load.php');
function filtertest_function($value)
{
return 'Filtered';
}
var_dump(apply_filters('filtertest', 'Original value'));
add_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));
remove_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));
Isso retornará o esperado:
string(14) "Original value"
string(8) "Filtered"
string(14) "Original value"
Acredito que o erro apareça em alguns casos em que o filtro faz parte de uma classe ou vários filtros são usados. Eu entendo _wp_filter_build_unique_id
está envolvido . Por favor, indique onde está a fonte do erro.
Bem, isso é de alguma forma um tópico muito específico que está vinculado a um problema de desenvolvimento do Wordpress. Eu sugiro fortemente que você acompanhe o ticket do trac se você gostou do meu artigo. Essa é a melhor coisa que você pode fazer para descobrir quando os problemas entram em jogo, bem como contorná-los tecnicamente (se você não gosta do não use remove_filter()
- resposta).
Tome isso do ponto de vista teórico: é apenas que os tipos de dados usados não são tratados estritamente para garantir a mesma funcionalidade em todos os valores possíveis (f (n)! = F (n)). Em suma: um design quebrado.
Isso significa que sempre vai quebrar na prática? - Não! É só que isso pode acontecer às vezes. E então você fica preso quando precisa confiar em remove_filter()
.
Uma sugestão melhor pode ser esta: Se você desenvolver plugins que fazem uso de hooks como métodos de classe, certifique-se de que o plugin seja executado em instalações com PHP 5.2/5.3.
Por favor, mantenha a discussão técnica no bilhete do trac. E se você estiver seriamente interessado, por favor ajude a consertar as deficiências do design atual.
Como Denis comentou no blog de Hakre, esse é um exemplo muito básico da questão.
function run_me_once() {
remove_action( 'foobar', 'run_me_once' );
echo 'test....';
}
add_action( 'foobar', 'run_me_once' );
function run_me2() {
echo 'test2....';
}
add_action( 'foobar', 'run_me2', 11 );
echo '';
do_action( 'foobar' ); // test....
echo '';
echo '';
do_action( 'foobar' ); // test2....
echo '';
Antes de executar esse código, pergunte a si mesmo qual seria o resultado esperado. Depois de decidir qual deve ser o resultado, corra e veja o que acontece.