doing_filter()WP 3.9.0

Проверяет обрабатывается ли в текущий момент указанный хук (фильтр, событие).

Позволяет определить хук, который выполняется в текущий момент (момент вызова этой функции). Функция не выведет ничего, если в текущий момент выполняется последний хук.

Функция может «хранить» для проверки сразу несколько названий хуков, когда например, один хук вызывается из другого. См. примеры.

Аналогичные функции:

  • current_filter() — получает название текущего события или фильтра.
  • current_action() — копия функции current_filter().
  • doing_filter() — проверяет обрабатывается ли в текущий момент указанный хук.
  • doing_action() — копия функции doing_filter().
  • did_action() — получает число, сколько раз сработал указанный хук.
  • did_filter() — C WP 6.1. Получает число, сколько раз сработал указанный хук.
Основа для: doing_action()
1 раз — 0.000012 сек (очень быстро) | 50000 раз — 0.01 сек (скорость света) | PHP 7.0.8, WP 4.5.3

Хуков нет.

Возвращает

true|false. true, если указанных хук совпадает с текущим выполняемым, false в противном случае.

Использование

if( doing_filter( $filter_name ) ){
	// ...
}
$filter(строка/null)
Название хука, который нужно проверить. Если указать null (ничего не указать) то функция проверит выполняется ли в текущий момент хоть какой-нибудь хук.
По умолчанию: null

Примеры

0

#1 Демонстрация

add_filter( 'wp_head', function(){
	var_dump( doing_filter('wp_head') );
	die;
});

/* Результат:
В момент срабатывания события wp_head, работа WP прервется и на экран будет выведено bool(true)
*/
0

#2 Разные действия в разных хуках, у которых одна функция обработчик

Пример показывает, как можно динамически изменить заголовок письма, в зависимости от того с какого фильтра срабатывает одна и та же функция (filter_system_from_mail).

function filter_system_from_mail(){
	if( doing_filter('wp_mail_from') )
		$opt_name = 'admin_email';
	else
		$opt_name = 'blogname';

	return get_option( $opt_name );
}

add_filter( 'wp_mail_from',      'filter_system_from_mail' );
add_filter( 'wp_mail_from_name', 'filter_system_from_mail' );
0

#3 Проверка родительского хука

doing_filter() умеет проверь выполняемый хук "по цепочке"...

Допустим, функция прикреплена к хуку foo_filter и она вызывает хук bar_filter. Внутри функции прикрепленной к хуку bar_filter нужно проверить, выполняется ли в текущий момент хук foo_filter.

add_filter('foo_filter', 'foo_filter_function');
add_filter('bar_filter', 'bar_filter_function');

function foo_filter_function($text){
	$text = apply_filters( 'bar_filter', $text );

	return $text . '!';
}

function bar_filter_function($text){
	// проверим выполнение сразу двух хуков, текущего (bar_filter) к которому прикреплена функция
	// и родительского (foo_filter) к которому прикреплена функция, которая вызвала текущий хук 'bar_filter'
	// т.е. на данный момент выполняются сразу 2 хука: 'foo_filter' и 'bar_filter' и функция
	// doing_filter() может проверить любой из выполняемых в данный момент хуков
	if( doing_filter('foo_filter') && doing_filter('bar_filter') )
		return $text . ' мир';

	return ''; // не сработает...
}

echo apply_filters( 'foo_filter', 'Привет' ); //> Привет мир!

Как видно из кода, в функции которая прикреплена к хуку bar_filter сработали оба условия:
doing_filter('foo_filter') и doing_filter('bar_filter'). Что значит что в текущий момент выполняются сразу 2 хука: 'foo_filter' и 'bar_filter'.

Заметки

Список изменений

С версии 3.9.0 Введена.

Код doing_filter() WP 6.7.1

function doing_filter( $hook_name = null ) {
	global $wp_current_filter;

	if ( null === $hook_name ) {
		return ! empty( $wp_current_filter );
	}

	return in_array( $hook_name, $wp_current_filter, true );
}