Как добавить теги к произвольному типу записей?
У меня есть произвольный тип записей portfolio
, и я пытаюсь добавить к нему таксономию тегов, как это сделать?

Или просто добавьте:
'taxonomies' => array('post_tag')
Массив зарегистрированных таксономий, таких как
category
илиpost_tag
, которые будут использоваться с этим типом записи. Это может быть использовано вместо прямого вызоваregister_taxonomy_for_object_type()
. Пользовательские таксономии всё равно необходимо регистрировать с помощьюregister_taxonomy()
.
в массив $args
в файле functions.php
, где вы создаёте пользовательский тип записи с помощью register_post_type()
. Это позволит пользовательскому типу записи использовать те же категории и/или метки, что и встроенные записи.

Вот так: (Где указано "portfolio" — это место, где регистрируется таксономия для типа записи)
add_action( 'init', 'create_tag_taxonomies', 0 );
// Создаем две таксономии, жанры и метки для типа записи "tag"
function create_tag_taxonomies()
{
// Добавляем новую таксономию, НЕ иерархическую (как метки)
$labels = array(
'name' => _x( 'Метки', 'общее название таксономии' ),
'singular_name' => _x( 'Метка', 'единственное число таксономии' ),
'search_items' => __( 'Искать метки' ),
'popular_items' => __( 'Популярные метки' ),
'all_items' => __( 'Все метки' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Редактировать метку' ),
'update_item' => __( 'Обновить метку' ),
'add_new_item' => __( 'Добавить новую метку' ),
'new_item_name' => __( 'Название новой метки' ),
'separate_items_with_commas' => __( 'Разделяйте метки запятыми' ),
'add_or_remove_items' => __( 'Добавить или удалить метки' ),
'choose_from_most_used' => __( 'Выбрать из наиболее часто используемых меток' ),
'menu_name' => __( 'Метки' ),
);
register_taxonomy('tag','portfolio',array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'update_count_callback' => '_update_post_term_count',
'query_var' => true,
'rewrite' => array( 'slug' => 'tag' ),
));
}
?>

@JoeBobby вероятно стоит ознакомиться со страницей WordPress Codex о регистрации таксономий, чтобы лучше понять все доступные опции: http://codex.wordpress.org/Function_Reference/register_taxonomy

Заметка: это создаёт совершенно новую таксономию с названием 'tag', вместо того чтобы добавить существующую таксономию 'post_tag' к пользовательскому типу записи.

@chifliiiii как получить эти теги на странице отдельной записи со ссылками на теги, как создать шаблон для страницы тега

Я согласен с Джейком, мне кажется, это не решает проблему. Ответ @Marcus должен быть отмечен как принятый.

как получить доступ к шаблону для таксономии 'tag'? Какое у него название?

У меня всё ещё не отображается блок тегов на экране редактирования CPT

Метод 1 (из ответов выше: https://wordpress.stackexchange.com/a/106211/38771)
Разные типы записей будут использовать одни и те же данные "Меток" (Tags) из стандартного типа "post".
Преимущества
Все (должно) работать "из коробки" одной строчкой кода
Все ваши метки собраны в одном месте в админке
Недостатки
- Забудьте о хорошо структурированном/удобном интерфейсе админки — список Меток на странице пользовательского типа записей будет показывать все метки (не только те, что используются в этом типе записей) с некорректным счетчиком...
- Изменения в Метке затронут как стандартные записи "post", так и пользовательские типы записей (удаление Метки удалит ее в обоих типах)
- Сложнее (возможно невозможно) настроить разную функциональность для Меток: разные описания, произвольные поля, изображения и т.д. (по крайней мере, без большого объема кастомного кода поверх ядра WordPress)...
Метод 2 (из ответов выше: https://wordpress.stackexchange.com/a/62263/38771)
Разные типы записей используют разные настройки/данные "Меток".
Преимущества
- Создание различной/четко разграниченной функциональности для Меток: шаблоны на фронтенде, права доступа, фильтры запросов, действия)
- Назначение разных данных для Меток: поля данных или даже произвольные поля
- Удобное управление Метками в админке
- Пример: Редактирование/удаление Метки для "post" не затронет (одноименную/с таким же ярлыком) Метку для других типов записей
Компромисс
Необходимо написать немного больше кода для настройки
По сути, они чрезвычайно мощный способ группировки различных элементов всевозможными способами. https://codex.wordpress.org/Taxonomies#Custom_Taxonomies

Пример для Метода 1: Большой спортивный сайт, охватывающий множество тем/лиг/видов спорта с тегами, например "NBA", "NHL", "Баскетбол", "Олимпиада", "Стероиды", "Колледж" и т.д. Нет никакого смысла дублировать и управлять тем, что может быть +100 тегами и 4 типами записей (стандартный тип записи и 3 пользовательских типа записей). Что касается недостатков, если данные о количестве тегов настолько важны, то для этого можно создать кастомное представление. А что касается похожих пользовательских тегов для каждого типа записей, пока не видно очевидной необходимости (стараюсь придумать... нужны примеры).

Да, но автоматически не будет разных постоянных ссылок для тегов в разных типах записей. Тег "playoffs" будет иметь "/tag/playoffs" для всех типов записей. Затем вам придется настраивать правила перезаписи или использовать GET-параметры для создания разных постоянных ссылок... С разными таксономиями для каждого типа записей, каждый тег "playoffs" для каждого типа записей будет иметь свою собственную постоянную ссылку, которую можно кастомизировать с использованием Иерархии шаблонов WordPress. Это хорошо, если страницы "playoffs" различаются для NBA, NHL... Я работал над сайтом с таким уровнем кастомизации таксономий (пользовательские поля, изображение таксономии, описание)

Я понимаю, о чем вы. Итак, если использовать разные таксономии тегов для каждого CPT, как насчет того, чтобы сделать так, чтобы при добавлении/редактировании термина в одной таксономии он изменялся и в других, т.е. синхронизировал уникальные термины между таксономиями. Например, определить "Баскетбол" один раз, допустим, в таксономии тегов записей, затем после сохранения "Баскетбол" также создается уникально в других таксономиях для CPT. Таким образом, вводите/редактируете тег один раз, и изменение отражается в нескольких таксономиях тегов. В итоге вы получаете управление тегами в одном месте плюс более желаемую ситуацию с постоянными ссылками.

Да, это действительно был бы отличный метод, если сайт использует одну и ту же базовую таксономическую информацию (название) для нескольких CPT, а также предоставляет возможность дополнительной настройки этих таксономий (произвольные поля, изображения и т.д.) для разных CPT. Отлично!

Просто используйте этот код, возможно, он вам поможет
add_action( 'init', 'create_client_tax' );
function create_client_tax() {
register_taxonomy(
'client_tag', // ваша таксономия для меток
'client', // Ваш тип записи
array(
'hierarchical' => false, // не иерархическая таксономия
'label' => __( 'Метки', CURRENT_THEME ),
'singular_name' => __( 'Метка', CURRENT_THEME ),
'rewrite' => true, // разрешить перезапись URL
'query_var' => true // разрешить использование в запросах
)
);
}

Это всегда работает корректно.
ссылка: https://developer.wordpress.org/plugins/post-types/registering-custom-post-types/
/**
* Создание таксономии метки для пользовательского типа записи portfolio
*/
if ( ! function_exists( 'ns_register_team_category' ) ) {
function ns_register_team_category() {
$labels = array(
'name' => __( 'Метки', 'ns' ),
'singular_name' => __( 'Метка', 'ns' ),
'search_items' => __( 'Поиск меток' ),
'popular_items' => __( 'Популярные метки' ),
'all_items' => __( 'Все метки' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Редактировать метку' ),
'update_item' => __( 'Обновить метку' ),
'add_new_item' => __( 'Добавить новую метку' ),
'new_item_name' => __( 'Название новой метки' ),
'separate_items_with_commas' => __( 'Разделяйте метки запятыми' ),
'add_or_remove_items' => __( 'Добавить или удалить метки' ),
'choose_from_most_used' => __( 'Выбрать из наиболее используемых меток' ),
'menu_name' => __( 'Метки' ),
);
$args = array(
'label' => __( 'Метка', 'ns' ),
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'tag', 'with_front' => false, ),
'show_admin_column' => false,
'show_in_rest' => true,
'rest_base' => 'tag',
'rest_controller_class' => 'WP_REST_Terms_Controller',
'show_in_quick_edit' => true,
'update_count_callback' => '_update_post_term_count',
);
register_taxonomy( 'tag', array( 'portfolio' ), $args );
}
add_action( 'init', 'ns_register_team_category', 0 );
}

Вы можете просто добавить уже зарегистрированную таксономию к типу объекта, как показано в коде ниже.
/**
* Функция для добавления выбора меток к пользовательскому типу записи
*/
function ns_reg_tag() {
register_taxonomy_for_object_type('post_tag', 'Custom_Post_Type');
}
add_action('init', 'ns_reg_tag');

Хотя ответ Marcus решает большую часть проблемы, учтите, что это не полное решение. Ответ chifliiiii более полный, но, как упоминалось в комментариях, он не переиспользует уже существующую таксономию тегов.
Согласно исходному вопросу (OP), решение должно использовать "именно таксономию тегов", а не "какую-то таксономию тегов". Поэтому я считаю ответ chifliiiii некорректным.
С другой стороны, я считаю, что ответ Marcus частично верен, как и похожие ответы, например, ответ Giovanni Putignano. Ниже я объясню почему.
Полное решение
При регистрации вашего пользовательского типа записи в таксономии post_tag
с использованием метода, предложенного Marcus или Giovanni, записи вашего пользовательского типа не будут отображаться на странице архива тегов. Будут отображаться только записи типа post
, потому что встроенный шаблон тегов формируется с запросом, который включает только тип записи post
. Чтобы это исправить, вам нужно изменить запрос с помощью хука pre_get_posts
.
Вот универсальный способ решения этой проблемы (не спрашивайте меня, почему это не реализовано в ядре WordPress):
add_action('pre_get_posts', function($query) {
// Этот код будет воздействовать на запросы, используемые для генерации шаблона архива тегов.
// Вы можете убрать условие `is_main_query()`, если хотите получать записи
// по тегу вне основного цикла.
if (!is_admin() && is_tag() && $query->is_main_query()) {
// Установит что-то вроде: Array( 'post', 'portfolio' )
$types = get_taxonomy('post_tag')->object_type;
// Изменяем запрос, чтобы использовать только типы записей, зарегистрированные в
// таксономии `post_tag`.
$query->set('post_type', $types);
}
});

В моем случае следующий код сработал.
register_taxonomy( 'events_tag',array('events'), array(
'hierarchical' => false,
'label' => 'Метка',
'show_admin_column' => true,
'singular_label' => 'Метка вашего типа записи',
'query_var' => true,
'rewrite' => array( 'slug' => 'events_tag' ),
'show_in_rest' => true,
'rest_base' => 'events_tag',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
