Почему remove_action() или remove_filter() не срабатывают на классы?

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

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

Предположим, что мы хотим запустить функцию 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 );

Уже лучше, но всё равно не робит.

Второе, не забывайте, что remove_action() и remove_filter() применяются только к статичным методам за пределами класса

Казалось бы, очевидно, но не всегда. В итоге мы переделываем слегка наш класс.

class MishaClass{
 
	public function __construct() {
		add_action( 'save_post', array( __CLASS__, 'save' ), 20 );
	}
	public static function save() {
		// эту штуку мы и будем отключать
	}
 
}
new MishaClass;

Когда мы меняем $this на константу __CLASS__, это означает, что к хуку подключается статичный метод класса. Само собой надо в определении метода дописать static. В целом этого уже будет достаточно, чтобы всё заработало.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии