Как изменить уже зарегистрированную таксономию
Сегодня мне нужно было изменить аргументы в пользовательской таксономии, которая уже была зарегистрирована сторонним плагином . В частности, я хотел установить аргумент show_admin_column
в true
и изменить значение rewrite
, чтобы это был не просто таксономический слаг. В данном случае это был тип записи "Люди" с пользовательской таксономией "Категория людей".
Я был удивлен, что об этом не спрашивали раньше, так что вот вопрос и ответ.
1 answers
register_taxonomy()
это инструмент для работы. Из Кодекса:
Эта функция добавляет или перезаписывает таксономию.
Одним из вариантов было бы скопировать register_taxonomy()
$args
и модифицируйте их. Однако это означало бы, что любые будущие изменения исходного кода register_taxonomy()
будут перезаписаны.
Поэтому, по крайней мере, в этом случае предпочтительнее получить исходные аргументы, изменить те, которые я хочу изменить, а затем повторно зарегистрировать таксономию. Вдохновение для это решение относится к @Otto в этом ответе на аналогичный вопрос о пользовательских типах сообщений.
Используя people
пользовательский тип записи и people_category
таксономию из примера, это сделает это:
function wpse_modify_taxonomy() {
// get the arguments of the already-registered taxonomy
$people_category_args = get_taxonomy( 'people_category' ); // returns an object
// make changes to the args
// in this example there are three changes
// again, note that it's an object
$people_category_args->show_admin_column = true;
$people_category_args->rewrite['slug'] = 'people';
$people_category_args->rewrite['with_front'] = false;
// re-register the taxonomy
register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// hook it up to 11 so that it overrides the original register_taxonomy function
add_action( 'init', 'wpse_modify_taxonomy', 11 );
Обратите внимание выше, что я ввожу третий аргумент register_taxonomy()
в ожидаемый тип массива. Это не является строго необходимым, так как register_taxonomy()
использует wp_parse_args()
который может обрабатывать object
или array
. Тем не менее, register_taxonomy()
$args
должны быть представлены как array
в соответствии с Кодексом, так что это мне кажется правильным.