Как изменить уже зарегистрированную таксономию
Сегодня мне потребовалось изменить аргументы пользовательской таксономии, которая уже была зарегистрирована сторонним плагином. В частности, я хотел установить аргумент show_admin_column
в значение true
и изменить rewrite
slug так, чтобы он не совпадал со слагом таксономии. В данном случае это был тип записи "People" с пользовательской таксономией "People Category".
Я был удивлен, что этот вопрос раньше не задавался, поэтому вот вопрос и ответ.

register_taxonomy()
— это инструмент для данной задачи. Из Codex:
Эта функция добавляет или перезаписывает таксономию.
Один из вариантов — скопировать аргументы $args
из register_taxonomy()
и изменить их. Однако это означает, что любые будущие изменения в исходном коде register_taxonomy()
будут перезаписаны.
Поэтому, по крайней мере в данном случае, предпочтительнее получить исходные аргументы, изменить нужные параметры, а затем перерегистрировать таксономию. Вдохновение для этого решения пришло от @Otto в этом ответе на похожий вопрос о пользовательских типах записей.
Используя пользовательский тип записи people
и таксономию people_category
из примера, вот как это можно сделать:
function wpse_modify_taxonomy() {
// получаем аргументы уже зарегистрированной таксономии
$people_category_args = get_taxonomy( 'people_category' ); // возвращает объект
// вносим изменения в аргументы
// в этом примере три изменения
// обратите внимание, что это объект
$people_category_args->show_admin_column = true;
$people_category_args->rewrite['slug'] = 'people';
$people_category_args->rewrite['with_front'] = false;
// перерегистрируем таксономию
register_taxonomy( 'people_category', 'people', (array) $people_category_args );
}
// подключаем на хуке с приоритетом 11, чтобы переопределить оригинальную функцию register_taxonomy
add_action( 'init', 'wpse_modify_taxonomy', 11 );
Обратите внимание, что я привожу третий аргумент register_taxonomy()
к ожидаемому типу массива. Это не строго обязательно, так как register_taxonomy()
использует wp_parse_args()
, который может работать как с object
, так и с array
. Тем не менее, согласно Codex, аргументы $args
для register_taxonomy()
должны передаваться в виде array
, поэтому такой подход кажется мне правильным.

Я пытаюсь сделать это, чтобы изменить плоскую таксономию на иерархическую. Я просто меняю свойство hierarchical на true. При этом справа на экране редактирования записи появляются два метабокса для таксономии, и я не могу добавить таксономии...

Убедитесь, что вы используете тот же слаг (например, 'people_category'
), что и оригинальная таксономия, чтобы перезаписать её.

Я обнаружил проблему с этим решением: параметр capabilities
сохраняется внутри как cap
, поэтому он не будет передан вновь зарегистрированной таксономии. Смотрите мой ответ на похожий вопрос здесь

похоже, что добавление flush_rewrite_rules();
после register_taxonomy
необходимо для применения правил перезаписи нового слага

@SajjadShirazy Это не рекомендуется, так как это будет сбрасывать правила перезаписи при каждой загрузке страницы. Лучше перейти в Настройки > Постоянные ссылки и вручную сбросить их один раз.

Это замечательно, я использовал это для добавления иерархических URL к пользовательской таксономии.

add_filter( 'register_taxonomy_args', function( $args, $taxonomy, $object_type ) {
// Фильтр для изменения параметров регистрации таксономии
if( $taxonomy !== 'people_category' || ! $object_type || $object_type[0] !== 'people' ) return $args;
// Показывать колонку в админке и изменять slug для ЧПУ
$args['show_admin_column'] = true;
$args['rewrite']['slug'] = 'people';
return $args;
}, 10, 3);
