web-dev-qa-db-fra.com

Quand remove_filter ne fonctionne pas?

Des rapports indiquent que remove_filter ne fonctionne pas dans certaines circonstances et que nous devrions proposer des alternatives . Cependant, l'article n'indique pas vraiment dans quelles circonstances cela se produit.

Je suis à la recherche d'exemples de code qui rompront remove_filter, avec WordPress et la version PHP, et éventuellement d'autres informations pertinentes, fournies. Je pense que l'extrait suivant devrait être un modèle utilisable:

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

Cela retournera le prévu:

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

Je crois que l'erreur survient dans certains cas où le filtre fait partie d'une classe ou utilise plusieurs filtres. Je comprends _wp_filter_build_unique_idest impliqué . Veuillez indiquer où se trouve dans ce code la source de l'erreur.

3
Jan Fabry

En fait, il s’agit d’un sujet très spécifique lié à un problème de développement Wordpress. Je vous suggère fortement de garder une trace du ticket de trac si vous avez aimé mon article. Je suppose que c’est la meilleure chose à faire pour savoir quand les problèmes entrent en jeu et comment les résoudre techniquement (si vous n’aimez pas le n’utilisez pas remove_filter() - réponse).

Du point de vue théorique, considérons que les types de données utilisés ne sont pas traités de manière stricte pour assurer la même fonctionnalité sur toutes les valeurs possibles (f (n)! = F (n)). En bref: un design cassé.

Est-ce que cela signifie que ça va toujours casser dans la pratique? - Non! C'est juste que ça peut arriver parfois. Et puis vous êtes pris au piège lorsque vous devez vous fier à remove_filter().

Une meilleure suggestion pourrait être celle-ci: Si vous développez des plugins qui utilisent des hooks comme méthodes de classe, assurez-vous que le plugin est exécuté sur les installations avec PHP 5.2/5.3.

Veuillez conserver la discussion technique dans le ticket de train. Et si vous êtes sérieusement intéressé, aidez-nous à corriger les faiblesses de la conception actuelle.

3
hakre

Comme Denis a commenté sur le blog de Hakre, il s'agit d'un exemple très simple du problème.

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

Avant d'exécuter ce code, demandez-vous ce que vous attendez du résultat. Une fois que vous avez décidé du résultat, lancez-le et voyez ce qui se passe.

1
t31os