To cholernie zła praktyka, muszę powiedzieć. Ostatnie dwie godziny spędziłem na znalezieniu rozwiązania do usunięcia akcji i filtrów dodanych za pomocą funkcji anonimowych.
To jest kod użyty w motywie nadrzędnym i muszę go usunąć.
/**
* 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 );
});
Mam odpowiedź Toscho, bawiłem się nią intensywnie, ale bez pomocy. Czy jest więc jakaś alternatywa, która usunie akcje / filtry dodane za pomocą anonimowych funkcji?
Dzięki
Odpowiedzi:
Problem polega na tym, że nie można rozróżnić funkcji anonimowej od innej, więc tak, możliwe jest usunięcie zamknięcia (tj. Funkcji anonimowej), ale jeśli więcej niż jedno zamknięcie działa na tym samym filtrze z tym samym priorytetem, musisz dokonać wyboru , usuń je wszystkie, lub usuń tylko jeden (nie wiedząc dokładnie, które).
Pokażę, jak je wszystkie usunąć za pomocą funkcji pochodzącej z tej z odpowiedzi @toscho:
Zmieniłem nazwę funkcji,
remove_object_filter
ponieważ może ona usuwać wszystkie typy filtrów obiektów: metody klas statycznych, metody obiektów dynamicznych i zamknięcia.$priority
Argument jest opcjonalny, ale podczas zdejmowania zamknięć należy zawsze stosować, inaczej funkcja usunie wszelkie zamknięcie dodany do filtra, bez względu na to, w którym priorytetem, bo gdy$priority
zostanie pominięty, wszystkie filtry wykorzystujące klasę docelową / metody lub zamknięcie są oddalony.Jak używać
źródło
Co się stanie, jeśli dodasz filtr z priorytetem 11, więc będzie on realizowany? To brzydkie, ale może działać w twoim przypadku.
źródło
Anonimowe filtry i akcje można usunąć natywnie za pomocą:
Podczas generowania unikalnego identyfikatora za pomocą
spl_object_hash()
anonimowe funkcje są do siebie porównywalne, więc obiekt pełnego zamknięcia nie musi być ponownie tworzony.Jeśli wiele filtrów lub akcji jest połączonych z tym samym tagiem o tym samym priorytecie, usunie najnowszy filtr lub akcję, która została dodana. Jeśli jest taki, który musisz zachować, musisz usunąć wszystkie filtry aż do tego, który chcesz usunąć, a następnie ponownie dodać pozostałe, jeśli to konieczne.
Ogólnie powróci to do najlepszych praktyk. Będę kiedykolwiek używał anonimowych funkcji tylko jako część niestandardowego motywu, który tworzę dla klienta, w którym nie chcę, aby filtr został nadpisany lub usunięty. W każdym opracowanym przeze mnie publicznym motywie lub wtyczce użyję fabryki, aby zainicjować klasę, dodać wszystkie moje filtry i akcje, a następnie zapisać instancję jako zmienną statyczną.
źródło