Как удалить фильтр, который вызывает функцию с приватным экземпляром.

Вопрос или проблема

Недавно я столкнулся с проблемой, и мне нужно было удалить обратный вызов из хука, который был реализован сторонним плагином, но экземпляр, переданный с функцией, был приватным. Как я могу удалить обратный вызов из хука?

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 является приватным, сначала необходимо получить доступ к нему.

Вот как вы можете решить эту проблему:

  1. Использовать хук для удаления фильтра: Вам нужно зарегистрировать свой собственный фильтр или хук, который позволит вам удалить ранее добавленный фильтр. Это можно сделать в функции, которая выполняется после инициализации плагина, чтобы убедиться, что вы выполняете код после того, как фильтр был добавлен.

  2. Получить доступ к приватному методу: К сожалению, вы не сможете получить доступ к приватному методу или экземпляру непосредственно снаружи класса. Однако, если у вас есть возможность изменить код плагина, рассмотрите возможность изменить видимость экземпляра класса либо на protected, либо на public.

  3. Пример удаления фильтра: Ниже приведен пример кода, который показывает, как можно попытаться удалить фильтр, если у вас есть доступ к экземпляру:

add_action('init', function() {
    // Дождаться, пока будет создан экземпляр класса Test_Ad
    remove_filter('manage_edit-product_columns', array($GLOBALS['admin_ins'], 'mv_test_adding'));
});

Однако, если доступ к экземпляру класса невозможен, вам, возможно, придется рассмотреть альтернативные способы, такие как:

  • Или изменить код плагина, чтобы экземпляр Test_Admin был доступен через статический метод или глобальную переменную.
  • Или полностью отключить/заменить плагин, который вызывает эту конечную логику, если это возможно.

Заключение

Удаление фильтров, использующих приватные экземпляры, требует тщательного подхода. Если у вас нет доступа к приватным данным класса, вам, возможно, придется рассмотреть возможность модификации класса или искать другие способы решения вашей задачи. Понимание структуры вашего кода и механики работы WordPress Hooks обязательно поможет вам в этом.

Оцените материал
Добавить комментарий

Капча загружается...