В моем functions.php
файле я хотел бы удалить приведенный ниже фильтр, но я не уверен, как это сделать, поскольку он в классе. Как должно remove_filter()
выглядеть?
add_filter('comments_array',array( &$this, 'FbComments' ));
Это на линии 88 здесь .
&
из своего&$this
, это PHP 4 вещьОтветы:
Это очень хороший вопрос. Это относится к темному сердцу API плагинов и лучших практик программирования.
Для следующего ответа я создал простой плагин, чтобы проиллюстрировать проблему с легким для чтения кодом.
Теперь мы видим это:
WordPress нужно имя для фильтра. Мы не предоставили его, поэтому WordPress вызывает
_wp_filter_build_unique_id()
и создает его. Это имя не предсказуемо, потому что оно используетspl_object_hash()
.Если запустить
var_export()
на$GLOBALS['wp_filter'][ 'wp_footer' ]
мы получаем что - то вроде этого сейчас:Чтобы найти и удалить наше злое действие, мы должны пройти через соответствующие фильтры для ловушки (действие - это очень простой фильтр), проверить, является ли он массивом и является ли объект экземпляром класса. Затем мы берем приоритет и удаляем фильтр, даже не видя реального идентификатора .
Хорошо, давайте поместим это в функцию:
Когда мы вызываем эту функцию? Невозможно точно знать, когда создается исходный объект. Может быть, иногда раньше
'plugins_loaded'
? Может быть позже?Мы используем тот же хук, с которым связан объект, и прыгаем очень рано с приоритетом
0
. Это единственный способ быть уверенным. Вот как мы могли бы удалить методprint_message_3()
:Результат:
И это должно удалить действие из вашего вопроса (не проверено):
Заключение
'plugins_loaded'
. Не только когда ваш плагин вызывается из WordPress.источник
plugins_loaded
вызове, и это именно тоplugins_loaded
, для чего. Конечно, экземпляр класса все еще должен быть доступен, возможно, через шаблон синглтона.remove_action()
Я не уверен, но вы можете попробовать использовать синглтон.
Вы должны сохранить ссылку на объект в статическом свойстве вашего класса, а затем вернуть эту статическую переменную из статического метода. Что-то вроде этого:
источник
Если вы знаете объект (и используете PHP 5.2 или выше - текущая стабильная версия PHP - 5.5, 5.4 все еще поддерживается, 5.3 - это конец срока службы), вы можете просто удалить его с помощью
remove_filter()
метода. Все, что вам нужно запомнить, это объект, имя метода и приоритет (если используется):Однако вы делаете небольшую ошибку в своем коде. Не ставьте префикс
$this
перед амперсандом&
, который был необходим в PHP 4 (!), И он давно просрочен. Это может затруднить работу с вашими хуками, так что просто оставьте это в стороне:Вот и все.
источник
$this
извне (другой плагин / тема).