it-swarm-es.com

¿Cuándo no funciona remove_filter?

Hay informes de que remove_filter no funciona en algunas circunstancias, y que deberíamos proporcionar alternativas . Sin embargo, el artículo no deja claro en qué circunstancias ocurre esto.

Estoy buscando ejemplos de código que romperán remove_filter, con WordPress y PHP versión, y, finalmente, otra información relevante, proporcionada. Creo que el siguiente fragmento de código debería ser una plantilla utilizable:

<?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'));

Esto devolverá lo esperado:

string(14) "Original value"
string(8) "Filtered"
string(14) "Original value"

Creo que el error aparece en algunos casos en los que el filtro forma parte de una clase o se usan varios filtros. Entiendo que _wp_filter_build_unique_idestá involucrado . Indique en qué punto del código se encuentra la fuente del error.

3
Jan Fabry

Bueno, este es de alguna manera un tema muy específico que está vinculado a un problema de desarrollo de Wordpress. Le sugiero encarecidamente que realice un seguimiento del ticket de trac si le gustó mi artículo. Supongo que es lo mejor que puede hacer para descubrir cuándo entran en juego los problemas y cómo sortearlos técnicamente (si no le gusta el no use remove_filter() - respuesta).

Tómelo desde un punto de vista teórico: es solo que los tipos de datos utilizados no se tratan estrictamente para garantizar la misma funcionalidad en todos los valores posibles (f (n)! = F (n)). En definitiva: un diseño roto.

¿Significa esto que siempre se romperá en la práctica? - ¡No! Es solo que a veces puede pasar. Y luego queda atrapado cuando necesita confiar en remove_filter().

Una sugerencia mejor podría ser esta: si desarrolla complementos que utilicen enganches como métodos de clase, asegúrese de que el complemento se ejecute en instalaciones con PHP 5.2/5.3.

Por favor, mantenga la discusión técnica en el boleto trac. Y si está seriamente interesado, por favor ayude a solucionar las deficiencias del diseño actual.

3
hakre

Como Denis comentó en el blog de Hakre, este es un ejemplo muy básico del problema.

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 '';

Sin embargo, antes de ejecutar ese código, pregúntese cuál esperaría que fuera el resultado. Una vez que haya decidido cuál será el resultado, ejecútelo y vea qué sucede.

1
t31os