Функционал редиректа для постов в WordPress реализован из коробки. При изменении slug записи блога через панель управления, WordPress добавляет новую запись в таблицу БД wp_postmeta. У этой записи поле meta_key равно _wp_old_slug, а поле meta_value равно старому slug поста. И когда запрашивается пост, WordPress выполняет запрос к этой таблице БД, чтобы проверить, есть ли посты, у которых изменился slug. И если есть — выполняет редирект.
Для страниц и такономий такой функционал еще не реализован (по крайней мере, не был реализован два года назад, когда я столкнулся с аналогичной проблемой). Так что это надо делать самому — повесить обработчик на хук wp_update_term_data. Событие происходит еще до того, как новые значения таксономии записаны в базу данных.
/**
* Filters term data before it is updated in the database.
*
* @since 4.7.0
*
* @param array $data Term data to be updated.
* @param int $term_id Term ID.
* @param string $taxonomy Taxonomy slug.
* @param array $args Arguments passed to wp_update_term().
*/
$data = apply_filters( 'wp_update_term_data', $data, $term_id, $taxonomy, $args );
`
Здесь есть массив $data, который содержит новый slug, и есть идентификатор таксономии $term_id — так что можно выполнить запрос к БД и получить старый slug (см. подходящие хуки в wp-includes/taxonomy.php). Если они не совпадают — нужно записать в БД старый slug, чтобы в будущем выполнять редирект.
У меня получилось примерно так https://tokmakov.msk.ru/blog/item/391, но там было массовое изменение slug для постов, рубрик и меток — не то, что нужно, но дает общее представление способа реализации.