Вопрос или проблема
Недавно я столкнулся с проблемой, и мне нужно было удалить обратный вызов из хука, который был реализован сторонним плагином, но экземпляр, переданный с функцией, был приватным. Как я могу удалить обратный вызов из хука?
if(!class_exists('Test_Ad')){
class Test_Ad{
private function init(){
$admin_ins = new Test_Admin($this->get_name(), $this->version());
add_filter( 'manage_edit-product_columns',array($admin_ins,'mv_test_adding') );
add_action( 'manage_product_posts_custom_column', array($admin_ins,'populate_columns'), 10, 2 );
}
public function __construct(){
$this->init();
}
public function get_name(){
return 'admin';
}
public function version(){
return '1.0.0';
}
}
$test = new Test_Ad();
}
Ответ или решение
Удаление фильтра, который использует объект с приватным методом, может представлять собой определенные сложности. В вашем случае мы видим, что класс Test_Ad
создает экземпляр класса Test_Admin
, у которого есть метод mv_test_adding
, зарегистрированный через add_filter
. Поскольку экземпляр класса Test_Admin
является приватным, сначала необходимо получить доступ к нему.
Вот как вы можете решить эту проблему:
-
Использовать хук для удаления фильтра: Вам нужно зарегистрировать свой собственный фильтр или хук, который позволит вам удалить ранее добавленный фильтр. Это можно сделать в функции, которая выполняется после инициализации плагина, чтобы убедиться, что вы выполняете код после того, как фильтр был добавлен.
-
Получить доступ к приватному методу: К сожалению, вы не сможете получить доступ к приватному методу или экземпляру непосредственно снаружи класса. Однако, если у вас есть возможность изменить код плагина, рассмотрите возможность изменить видимость экземпляра класса либо на protected, либо на public.
-
Пример удаления фильтра: Ниже приведен пример кода, который показывает, как можно попытаться удалить фильтр, если у вас есть доступ к экземпляру:
add_action('init', function() {
// Дождаться, пока будет создан экземпляр класса Test_Ad
remove_filter('manage_edit-product_columns', array($GLOBALS['admin_ins'], 'mv_test_adding'));
});
Однако, если доступ к экземпляру класса невозможен, вам, возможно, придется рассмотреть альтернативные способы, такие как:
- Или изменить код плагина, чтобы экземпляр
Test_Admin
был доступен через статический метод или глобальную переменную. - Или полностью отключить/заменить плагин, который вызывает эту конечную логику, если это возможно.
Заключение
Удаление фильтров, использующих приватные экземпляры, требует тщательного подхода. Если у вас нет доступа к приватным данным класса, вам, возможно, придется рассмотреть возможность модификации класса или искать другие способы решения вашей задачи. Понимание структуры вашего кода и механики работы WordPress Hooks обязательно поможет вам в этом.