C'est une mauvaise pratique effrayante, je dois dire. A passé deux heures à trouver une solution pour supprimer les actions et les filtres ajoutés via les fonctions anonymes.
C'est le code utilisé sur un thème parent, et je dois le supprimer.
/**
* Add custom columns to admin comments grid
* * Rate that user set.
*/
add_filter( 'manage_edit-comments_columns', function( $default ) {
$columns['smr_comment_rate'] = __( 'Rate', 'txtdmn' );
return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});
J'ai obtenu la réponse de toscho, j'ai beaucoup joué avec, mais sans aide. Alors, existe-t-il une autre alternative qui supprimera les actions / filtres ajoutés via des fonctions anonymes?
Merci
Réponses:
Le problème est que vous ne pouvez pas distinguer une fonction anonyme d'une autre, donc oui, il est possible de supprimer une fermeture (c'est-à-dire une fonction anonyme) mais si plus d'une fermeture agit sur le même filtre avec la même priorité, vous devez faire un choix , supprimez-les tous, ou n'en supprimez qu'un (sans savoir exactement lequel).
Je vais montrer comment les supprimer tous en utilisant une fonction très dérivée de celle de la réponse @toscho que vous avez publiée:
J'ai renommé la fonction
remove_object_filter
car elle peut supprimer tous les types de filtres d'objets: méthodes de classe statiques, méthodes d'objet dynamiques et fermetures.L'
$priority
argument est facultatif, mais lors de la suppression des fermetures, il doit toujours être utilisé, sinon la fonction supprimera toute fermeture ajoutée au filtre, quelle que soit la priorité, car lorsqu'elle$priority
est omise, tous les filtres utilisant la classe / méthode cible ou la fermeture sont supprimé.Comment utiliser
la source
Que se passe-t-il si vous ajoutez votre filtre, avec la priorité 11, pour qu'il se poursuive? C'est moche, mais ça pourrait marcher dans votre cas.
la source
Les filtres et actions anonymes peuvent être supprimés nativement à l'aide des éléments suivants:
Lors de la génération de l'identifiant unique à l'aide
spl_object_hash()
, les fonctions anonymes sont comparables les unes aux autres, de sorte que l'objet de fermeture complète n'a pas besoin d'être recréé à nouveau.Si plusieurs filtres ou actions sont connectés à la même balise avec la même priorité, cela supprimera le dernier filtre ou action qui a été ajouté. S'il y en a un que vous devez conserver, vous devrez supprimer tous les filtres jusqu'à celui dont vous avez besoin, puis rajouter les autres si nécessaire.
Cela reviendra généralement aux meilleures pratiques. Je n'utiliserai que des fonctions anonymes dans le cadre d'un thème personnalisé que je développe pour un client, où je ne veux pas que le filtre soit écrasé ou supprimé. Dans n'importe quel thème ou plugin public que je développe, je vais utiliser une fabrique pour initialiser une classe, ajouter tous mes filtres et actions, puis stocker l'instance en tant que variable statique.
la source