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

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

Предположим, что мы хотим запустить функцию 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. В целом этого уже будет достаточно, чтобы всё заработало.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал