Dans mon functions.php
fichier, j'aimerais supprimer le filtre ci-dessous, mais je ne sais pas comment le faire car il est dans une classe. À quoi devrait remove_filter()
ressembler?
add_filter('comments_array',array( &$this, 'FbComments' ));
C'est à la ligne 88 ici .
&
de votre&$this
, c'est une chose de PHP 4Réponses:
C'est une très bonne question. Cela va au cœur sombre de l'API du plugin et aux meilleures pratiques de programmation.
Pour la réponse suivante, j'ai créé un plugin simple pour illustrer le problème avec du code facile à lire.
Maintenant nous voyons ceci:
WordPress a besoin d'un nom pour le filtre. Nous n'en avons pas fourni, donc WordPress appelle
_wp_filter_build_unique_id()
et en crée un. Ce nom n'est pas prévisible car il utilisespl_object_hash()
.Si nous courons un
var_export()
sur$GLOBALS['wp_filter'][ 'wp_footer' ]
nous obtenons quelque chose comme ça maintenant:Pour trouver et supprimer notre action maléfique, nous devons passer en revue les filtres associés au point d'ancrage (une action est simplement un filtre très simple), vérifiez si c'est un tableau et si l'objet est une instance de la classe. Ensuite, nous prenons la priorité et retirons le filtre, sans jamais voir l'identifiant réel .
Ok, mettons cela dans une fonction:
Quand appelons-nous cette fonction? Il n'y a aucun moyen de savoir avec certitude quand l'objet original est créé. Peut-être parfois avant
'plugins_loaded'
? Peut-être plus tard?Nous utilisons le même point auquel l'objet est associé et nous y allons très tôt avec priorité
0
. C'est le seul moyen d'être vraiment sûr. Voici comment nous supprimerions la méthodeprint_message_3()
:Résultat:
Et cela devrait supprimer l'action de votre question (non testée):
Conclusion
'plugins_loaded'
. Pas seulement lorsque votre plugin est appelé par WordPress.la source
plugins_loaded
appelle, ce qui est exactement ce à quoi ils serventplugins_loaded
. Bien entendu, l’instance de classe doit toujours être accessible, éventuellement via un modèle singleton.remove_action()
Je ne suis pas sûr, mais vous pouvez utiliser un singleton.
Vous devez stocker la référence de l'objet dans une propriété statique de votre classe, puis renvoyer cette variable statique à partir d'une méthode statique. Quelque chose comme ça:
la source
Tant que vous connaissez l'objet (et que vous utilisez PHP 5.2 ou une version ultérieure - la version stable actuelle de PHP est 5.5, la version 5.4 est toujours prise en charge, la version 5.3 est en fin de vie), vous pouvez simplement le supprimer à l'aide de la
remove_filter()
méthode. Tout ce dont vous devez vous souvenir est l'objet, le nom de la méthode et la priorité (si utilisée):Cependant, vous faites une petite erreur dans votre code. Ne préfixez pas
$this
l'esperluette&
, cela était nécessaire en PHP 4 (!) Et il est en retard depuis longtemps. Cela peut rendre la gestion de vos hooks problématique, alors laissez-le de côté:Et c'est tout.
la source
$this
de l'extérieur (un autre plugin / thème).