web-development-kb-pt.site

Quando remove_filter não funciona?

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_idestá envolvido . Por favor, indique onde está a fonte do erro.

3
Jan Fabry

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.

3
hakre

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.

1
t31os