Как добавить теги к произвольному типу записей?

19 авг. 2012 г., 01:24:44
Просмотры: 124K
Голосов: 46

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

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

@chifliiiii если я сделаю так, Категории и Метки будут такими же, как и для записей. Как мне получить Категории и Метки, которые будут исключительно для нового типа записи?

Troy Templeman Troy Templeman
8 мая 2014 г. 19:36:36

@chifliiiii Как отобразить метки в шаблоне?

Max Max
22 мар. 2017 г. 01:54:13
Все ответы на вопрос 9
1
102

Или просто добавьте:

'taxonomies' => array('post_tag')

Массив зарегистрированных таксономий, таких как category или post_tag, которые будут использоваться с этим типом записи. Это может быть использовано вместо прямого вызова register_taxonomy_for_object_type(). Пользовательские таксономии всё равно необходимо регистрировать с помощью register_taxonomy().

в массив $args в файле functions.php, где вы создаёте пользовательский тип записи с помощью register_post_type(). Это позволит пользовательскому типу записи использовать те же категории и/или метки, что и встроенные записи.

12 июл. 2013 г. 06:06:43
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу: почему это может решить проблему?

fuxia fuxia
12 июл. 2013 г. 06:54:48
7
27

Вот так: (Где указано "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' ),
  ));
}
?>
19 авг. 2012 г. 02:07:03
Комментарии

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

Stephen S. Stephen S.
8 мая 2014 г. 19:41:54

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

Jake Jake
28 июн. 2017 г. 20:53:05

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

Dinesh Dinesh
25 июн. 2018 г. 12:05:06

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

Craig Wayne Craig Wayne
13 июл. 2018 г. 00:20:09

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

emir emir
8 июн. 2021 г. 11:04:17

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

Fanky Fanky
29 июл. 2021 г. 14:10:43

Поле тегов на экране редактирования в админке появилось после добавления 'show_in_rest' => true, в параметры register_taxonomy()! 8-o

Fanky Fanky
29 июл. 2021 г. 14:37:49
Показать остальные 2 комментариев
0
10

Используйте этот код:

add_action( 'init', 'gp_register_taxonomy_for_object_type' );
function gp_register_taxonomy_for_object_type() {
    register_taxonomy_for_object_type( 'post_tag', 'portfolio' );
};
8 окт. 2014 г. 13:16:29
4

Метод 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

9 окт. 2018 г. 20:07:10
Комментарии

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

Kalnode Kalnode
12 янв. 2019 г. 02:23:24

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

P-S P-S
14 янв. 2019 г. 15:53:08

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

Kalnode Kalnode
15 янв. 2019 г. 03:15:46

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

P-S P-S
18 янв. 2019 г. 13:44:19
1

Просто используйте этот код, возможно, он вам поможет

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 // разрешить использование в запросах
            )  
        );
}
6 мар. 2018 г. 20:26:19
Комментарии

Упрощённая версия уже принятого ответа. Также, этот вариант добавляет совершенно новую таксономию вместо использования существующей таксономии 'post_tag'.

acidrums4 acidrums4
11 июл. 2018 г. 20:36:04
0

Это всегда работает корректно.
ссылка: 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 );
}
28 авг. 2020 г. 14:12:42
1

Вы можете просто добавить уже зарегистрированную таксономию к типу объекта, как показано в коде ниже.

/**
 * Функция для добавления выбора меток к пользовательскому типу записи
 */
function ns_reg_tag() {
   register_taxonomy_for_object_type('post_tag', 'Custom_Post_Type');
}
add_action('init', 'ns_reg_tag');
3 мар. 2021 г. 13:44:55
Комментарии

Это лучшее решение на данный момент.

Marcio Duarte Marcio Duarte
6 апр. 2022 г. 03:21:12
0

Хотя ответ 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);
  }
});
9 сент. 2020 г. 15:25:00
0

В моем случае следующий код сработал.

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',  
        )
    );
22 окт. 2022 г. 14:15:03