doing_filter()
Проверяет обрабатывается ли в текущий момент указанный хук (фильтр, событие).
Позволяет определить хук, который выполняется в текущий момент (момент вызова этой функции). Функция не выведет ничего, если в текущий момент выполняется последний хук.
Функция может «хранить» для проверки сразу несколько названий хуков, когда например, один хук вызывается из другого. См. примеры.
Аналогичные функции:
- current_filter() — получает название текущего события или фильтра.
- current_action() — копия функции current_filter().
- doing_filter() — проверяет обрабатывается ли в текущий момент указанный хук.
- doing_action() — копия функции doing_filter().
- did_action() — получает число, сколько раз сработал указанный хук.
- did_filter() — C WP 6.1. Получает число, сколько раз сработал указанный хук.
Хуков нет.
Возвращает
true|false. true, если указанных хук совпадает с текущим выполняемым, false в противном случае.
Использование
if( doing_filter( $filter_name ) ){
// ...
}
- $filter(строка/null)
- Название хука, который нужно проверить. Если указать null (ничего не указать) то функция проверит выполняется ли в текущий момент хоть какой-нибудь хук.
По умолчанию: null
Примеры
#1 Демонстрация
add_filter( 'wp_head', function(){
var_dump( doing_filter('wp_head') );
die;
});
/* Результат:
В момент срабатывания события wp_head, работа WP прервется и на экран будет выведено bool(true)
*/ #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' ); #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'.
Заметки
- Смотрите: current_filter()
- Смотрите: did_filter()
- Global. Строка[]. $wp_current_filter Current filter.
Список изменений
| С версии 3.9.0 | Введена. |
Код doing_filter() doing filter WP 6.9
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 );
}