Это чертовски плохая практика, я должен сказать. Потратил последние два часа на поиск решения для удаления действий и фильтров, добавленных через анонимные функции.
Это код, используемый в родительской теме, и мне нужно удалить его.
/**
* 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 );
});
Получил ответ Тошо , играл с ним тяжело, но без помощи. Итак, есть ли другая альтернатива, которая удалит действия / фильтры, добавленные через анонимные функции?
Спасибо
Ответы:
Проблема в том, что вы не можете отличить анонимную функцию от другой, так что да, можно удалить замыкание (то есть анонимную функцию), но если несколько фильтров замыкания действуют на один и тот же приоритет с одним и тем же приоритетом, вы должны сделать выбор , удалите их все, удалите только одну (не зная точно, какую).
Я покажу, как удалить их все, используя функцию, очень производную от функции в ответе @toscho, который вы разместили:
Я переименовал функцию,
remove_object_filter
потому что она может удалять все типы фильтров объектов: методы статических классов, методы динамических объектов и замыкания.$priority
Аргумент является необязательным, но при удалении замыкания следует всегда используются, в противном случае функция будет удалить любое замыкание добавленного к фильтру, независимо от того , на котором приоритет, потому что , когда$priority
опущено, все фильтры , использующие целевой класс / метод или замыкание являются удален.Как пользоваться
источник
Что, если вы добавите свой фильтр с приоритетом 11, чтобы он шел после? Это некрасиво, но может сработать в вашем случае.
источник
Анонимные фильтры и действия могут быть удалены с помощью следующего:
При генерации уникального идентификатора с использованием
spl_object_hash()
анонимные функции сравнимы друг с другом, поэтому объект полного замыкания не нужно заново создавать.Если несколько фильтров или действий связаны с одним и тем же тегом с одинаковым приоритетом, он удалит последний фильтр или действие, которое было добавлено. Если вам нужно сохранить один, вам нужно будет удалить все фильтры до того, который вам нужен, затем заново добавить остальные при необходимости.
Как правило, это вернется к лучшим практикам. Я буду использовать анонимные функции только как часть пользовательской темы, которую разрабатываю для клиента, где я не хочу, чтобы фильтр был перезаписан или удален. В любой общедоступной теме или плагине, который я разрабатываю, я буду использовать фабрику для инициализации класса, добавления всех своих фильтров и действий, а затем сохранять экземпляр как статическую переменную.
источник