Das ist eine verdammt schlechte Praxis, muss ich sagen. Verbrachte die letzten zwei Stunden damit, eine Lösung zu finden, um Aktionen und Filter zu entfernen, die über anonyme Funktionen hinzugefügt wurden.
Dies ist der Code, der für ein übergeordnetes Thema verwendet wird, und ich muss ihn entfernen.
/**
* 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 );
});
Ich habe toschos Antwort bekommen , habe heftig damit gespielt, aber keine Hilfe. Gibt es also eine andere Alternative, mit der Aktionen / Filter entfernt werden, die über anonyme Funktionen hinzugefügt wurden?
Vielen Dank
Antworten:
Das Problem ist, dass Sie nicht zwischen einer anonymen und einer anderen Funktion unterscheiden können. Ja, es ist möglich, einen Abschluss (dh eine anonyme Funktion) zu entfernen. Wenn jedoch mehr als ein Abschluss mit derselben Priorität auf denselben Filter wirkt, müssen Sie eine Auswahl treffen , entferne sie alle, oder entferne nur eine (ohne genau zu wissen, welche).
Ich werde zeigen, wie Sie sie alle mit einer Funktion entfernen können, die stark von der in der von Ihnen geposteten @ toscho-Antwort abgeleiteten Funktion abweicht:
Ich habe die Funktion umbenannt,
remove_object_filter
weil sie alle Arten von Objektfiltern entfernen kann: statische Klassenmethoden, dynamische Objektmethoden und Schließungen.Das
$priority
Argument ist optional, sollte jedoch beim Entfernen von Closures immer verwendet werden. Andernfalls entfernt die Funktion$priority
alle dem Filter hinzugefügten Closures, unabhängig von der Priorität, da alle Filter, die die Zielklasse / Methode oder den Closure verwenden, verwendet werden , wenn sie weggelassen werden entfernt.Wie benutzt man
quelle
Was ist, wenn Sie Ihren Filter mit der Priorität 11 hinzufügen, damit er nachgeht? Das ist hässlich, könnte aber in Ihrem Fall funktionieren.
quelle
Anonyme Filter und Aktionen können nativ wie folgt entfernt werden:
Bei der Generierung der eindeutigen ID mit
spl_object_hash()
sind anonyme Funktionen miteinander vergleichbar, sodass das Objekt zum vollständigen Schließen nicht erneut erstellt werden muss.Wenn mehrere Filter oder Aktionen mit derselben Priorität mit demselben Tag verbunden sind, wird der zuletzt hinzugefügte Filter oder die zuletzt hinzugefügte Aktion entfernt. Wenn Sie einen behalten müssen, müssen Sie alle Filter bis zu dem Filter entfernen, den Sie entfernen müssen, und die anderen nach Bedarf erneut hinzufügen.
Dies wird im Allgemeinen zu Best Practices zurückkehren. Ich verwende immer nur anonyme Funktionen als Teil eines benutzerdefinierten Themas, das ich für einen Client entwickle, bei dem der Filter nicht überschrieben oder entfernt werden soll. In jedem öffentlichen Thema oder Plugin, das ich entwickle, initialisiere ich eine Klasse mithilfe einer Factory, füge alle meine Filter und Aktionen hinzu und speichere die Instanz als statische Variable.
quelle