1. Регистрация кастомных типов записей и прочих плюшек происходит на init, т.к. иначе их просто не будет в системе (хотя относящиеся к ним записи могут быть при этом в бд). Так,
register_custom_post_type и
register_taxonomy просто изменяют глобальные переменные.
2. А вот
wp_insert_term нужно вызывать только один раз. Надлежит понимать, что он отличается от всех этих
register_taxonomy и прочего тем, что пишет данные не в глобальную переменную для нужд ядра, а в базу, и соответственно повторные вызовы приведут в лучшем случае к дублированию данных. Событие? Тот же init сгодится, только не забудьте поставить какой-нибудь флаг или банальную проверку на существование таксономий \ терминов. Какой-нибудь is_terms_added в
wp_options.