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.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 ); }