На самом деле такой момент, для многих из вас он может быть очевиден, но для не менее многих людей он будет едва ли понятен. Именно поэтому я решил о нём рассказать, чтобы он стал понятен всем сразу.
Предположим, что мы хотим запустить функцию remove_action() к какому-то методу класса. Окей, предположим, что вот так ваш класс выглядит:
class MishaClass{ public function __construct() { add_action( 'save_post', array( $this, 'save' ), 20 ); } public function save() { // эту штуку мы и будем отключать } } new MishaClass;
И вот вам по какой-либо причине нужно отключить этот хук действия из другого места. И вы запускаете что-то в духе:
remove_action( 'save_post', array( 'MishaClass', 'save' ) );
Типо как делаете всё по документации, но ничего не срабатывает. В итоге вы юзаете remove_all_actions() вместо этого (хотя на save_post
это максимально сомнительное действие), всё у вас начинает работать и вы забиваете.
Но вместо этого вам нужно сделать следующую последовательность действий.
Как видите в моём классе, приоритет хука выставлен на 20, а в коде, где мы его отключаем – ничего нет! Это значит по умолчанию приоритет 10!
Стоп, непонятно? Смотрим видеоурок про хуки и фильтры срочно.
В итоге мы меняем наш отключающий код на:
remove_action( 'save_post', array( 'MishaClass', 'save' ), 20 );
Уже лучше, но всё равно не робит.
Казалось бы, очевидно, но не всегда. В итоге мы переделываем слегка наш класс.
class MishaClass{ public function __construct() { add_action( 'save_post', array( __CLASS__, 'save' ), 20 ); } public static function save() { // эту штуку мы и будем отключать } } new MishaClass;
Когда мы меняем $this
на константу __CLASS__
, это означает, что к хуку подключается статичный метод класса. Само собой надо в определении метода дописать static
. В целом этого уже будет достаточно, чтобы всё заработало.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.