Как изменить уже зарегистрированную таксономию

18

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

Я был удивлен, что об этом раньше не спрашивали, так что вот вопрос и ответ.

mrwweb
источник
Просто примечание для тех, кто застрял, не забудьте очистить постоянные ссылки, прежде чем проверять результат.
un.pez.vivo

Ответы:

22

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()«s $argsдолжны быть представлены как в arrayсоответствии с Кодексом, так что чувствует себя хорошо для меня.

mrwweb
источник
Я пытаюсь сделать это, чтобы изменить плоскую таксономию на иерархическую таксономию. Я просто изменяю иерархическое свойство на true. Это приводит к появлению двух мета-полей для таксономии справа от экрана редактирования записи, и я не могу фактически добавить таксономии ...
Джоэл Уоршам,
Убедитесь, что вы используете тот же слаг (например 'people_category'), что и исходная таксономия, чтобы перезаписать его.
mrwweb
1
Genius! Чистый гений! Работал отлично!
DaveyJake
1
Я обнаружил проблему с этим решением: capabilitiesпараметр хранится внутри, capтак что он не будет передан новой зарегистрированной таксономии. Смотрите мой ответ на подобный вопрос здесь
Fabien Quatravaux
1
Это замечательно, я использовал его для добавления иерархических URL-адресов в пользовательскую таксономию.
Брайан Пит