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

18 сент. 2014 г., 02:20:02
Просмотры: 25.6K
Голосов: 23

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

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

1
Комментарии

Небольшое примечание для тех, кто застрял: не забудьте сбросить постоянные ссылки перед проверкой результата.

un.pez.vivo un.pez.vivo
10 дек. 2017 г. 14:30:36
Все ответы на вопрос 2
9
29

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, поэтому такой подход кажется мне правильным.

18 сент. 2014 г. 02:20:02
Комментарии

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

Joel Worsham Joel Worsham
8 апр. 2015 г. 19:48:32

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

mrwweb mrwweb
8 апр. 2015 г. 20:21:29

Гениально! Абсолютно гениально! Сработало идеально!

DaveyJake DaveyJake
31 мая 2015 г. 13:02:30

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

Fabien Quatravaux Fabien Quatravaux
14 дек. 2015 г. 10:37:40

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

Sajjad Ziaenezhad Shirazi Sajjad Ziaenezhad Shirazi
30 апр. 2018 г. 17:57:35

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

mrwweb mrwweb
2 мая 2018 г. 19:51:41

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

Brian Peat Brian Peat
3 дек. 2018 г. 01:36:00

Это сладко, как шоколад. Спасибо, хорошего дня.

Davey Davey
22 янв. 2020 г. 13:21:51

Я использовал это, чтобы сделать постоянные ссылки моей пользовательской таксономии иерархическими. Но теперь эти URL с иерархической таксономией возвращают ошибку 404 (Страница не найдена). Я также пересохранил постоянные ссылки. Есть идеи?

Laurent Laurent
30 апр. 2021 г. 14:31:27
Показать остальные 4 комментариев
1
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);
12 янв. 2023 г. 10:53:53
Комментарии

Это правильный способ сделать это в наше время. Не забудьте пересохранить постоянные ссылки в Настройках.

dev_masta dev_masta
25 авг. 2023 г. 04:41:53