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