add_filter_once() и add_action_once() функции WordPress
Допустим мы хотим изменить (дополнить) заголовок записи и для этого на хуке loop_start мы создаем хук the_title и меняем заголовок записи. Но теперь добавленный нами хук будет срабатывать для каждого вызова the_title() после заголовка.
Т.е. нам нужно удалить наш хук сразу после его использования. Наш хук должен отработать всего один раз.
В WordPress нет функции, которая добавляла бы хук и удаляла его автоматически после выполнения.
Чтобы решить эту проблему, я написал свои функции add_filter_once() и add_action_once().
if( ! function_exists( 'add_filter_once' ) ) :
function add_filter_once( $hook_name, $hook_callback, $hook_priority = 10, $accepted_args = 1 ) {
$cb = static function () use ( $hook_name, $hook_callback, $hook_priority, & $cb ) {
remove_filter( $hook_name, $cb, $hook_priority );
unset( $cb );
return $hook_callback( ...func_get_args() );
};
return add_filter( $hook_name, $cb, $hook_priority, $accepted_args );
}
function add_action_once( $hook_name, $hook_callback, $hook_priority = 10, $accepted_args = 1 ){
return add_filter_once( $hook_name, $hook_callback, $hook_priority, $accepted_args );
}
endif;
Вставьте этот код в плагин или файл темы functions.php. И затем используйте эти функции также как обычные функции add_filter() или add_action():
add_filter_once( 'the_title', static function( $title ){
if( my_condition ){
return $title . ' some addition';
}
return $title;
} );