При программировании в WP мы очень часто добавляем какие то фильтры и действия. А если посмотреть в код любого плагина — это сборники реализаций зацепок.
Не всегда авторы дают возможность гибко управлять поведением их плагина через настройки. Тогда приходится делать это программно, например, отменяя фильтры. Но здесь есть одна проблема.
Текущие рекомендации по конструированию плагинов к WP советуют создавать плагин в виде класса. Это как минимум помогает избежать конфликтов имен методов. При этом функция API remove_filter() морально устарела и позволяет использовать её только для процедурного варианта объявленных фильтров.
Поделюсь вариантом функции remove_filter(), позволяющим удалять фильтры, объявленные плагинами-классами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function remove_object_filter( $filterName, $className, $methodName ) { global $wp_filter; if (!isset($wp_filter[ $filterName ])) return; $filters = &$wp_filter[ $filterName ]; if ( empty($filters)) return; foreach ( $filters as $weight => $filter) { foreach ( $filter as $id => $func) { if ( is_array($func) && is_a( $func['function'][0], $className ) && $methodName === $func['function'][1]) { remove_filter( $filterName, array( $func['function'][0], $methodName ), $weight); } } } } |
Функция сканирует глобальный массив фильтров и вызывает встроенную remove_filter() с требуемыми параметрами.
Для вызова нужно знать имя фильтра (например, ‘the_content’), имя класса, и название метода, используемого как callback функция фильтрации.