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