Добавление поддержки таксономии категорий для произвольного типа записей
Я пишу код, который активно использует произвольные типы записей (custom post types), и ищу способ программно добавить категорию к определенному произвольному типу записей, а затем получить доступ к ID этой категории.
Я поискал информацию, но не смог найти надежный способ достижения этой цели - wp_create_category был бы очевидным выбором, но он, конечно, не поддерживает произвольные типы записей.

Внутри функции register_post_type
вы можете добавить параметр taxonomies
.
register_post_type('discography',
array(
'labels' => array(
//здесь указываются метки
),
'taxonomies' => array('recordings', 'category', 'whatever'), //добавьте эту строку....
'public' => true,
'show_ui' => true,
'exclude_from_search' => true,
'hierarchical' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'query_var' => true
)
);
Альтернативно вы можете использовать функцию register_taxonomy_for_object_type
, http://codex.wordpress.org/Function_Reference/register_taxonomy_for_object_type

Пожалуйста, поместите этот код в файл functions.php вашей темы
function post_type_discog() {
register_post_type('discography',
array(
'labels' => array(
'name' => __( 'Дискография' ),
'singular_name' => __( 'Дискография' ),
'add_new' => __( 'Добавить новую' ),
'add_new_item' => __( 'Добавить новую запись в дискографию' ),
'edit' => __( 'Редактировать' ),
'edit_item' => __( 'Редактировать запись дискографии' ),
'new_item' => __( 'Новая запись дискографии' ),
'view' => __( 'Просмотр дискографии' ),
'view_item' => __( 'Просмотр записи дискографии' ),
'search_items' => __( 'Поиск записей дискографии' ),
'not_found' => __( 'Записи дискографии не найдены' ),
'not_found_in_trash' => __( 'В корзине записей дискографии не найдено' ),
'parent' => __( 'Родительская запись дискографии' ),
),
'public' => true,
'show_ui' => true,
'exclude_from_search' => true,
'hierarchical' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'query_var' => true
)
);
}
add_action('init', 'post_type_discog');
add_action( 'init', 'create_discog_taxonomies', 0 );
function create_discog_taxonomies()
{
// Добавляем новую таксономию, делаем её иерархической (как категории)
$labels = array(
'name' => _x( 'Записи', 'taxonomy general name' ),
'singular_name' => _x( 'Запись', 'taxonomy singular name' ),
'search_items' => __( 'Искать записи' ),
'popular_items' => __( 'Популярные записи' ),
'all_items' => __( 'Все записи' ),
'parent_item' => __( 'Родительская запись' ),
'parent_item_colon' => __( 'Родительская запись:' ),
'edit_item' => __( 'Редактировать запись' ),
'update_item' => __( 'Обновить запись' ),
'add_new_item' => __( 'Добавить новую запись' ),
'new_item_name' => __( 'Название новой записи' ),
);
register_taxonomy('recordings',array('discography'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'recordings' ),
));
}
Этот код позволяет создать пользовательский тип записи и пользовательский тип таксономии. Надеюсь, этот код будет вам полезен.

Если вам нужно заранее создать некоторые термины, вы можете добавить следующий код в функцию init, которая регистрирует таксономию. Это создаст термин "foo" в таксономии "recordings".
if (!term_exists( 'foo', 'recordings') ){
wp_insert_term( 'foo', 'recordings' );
})

Это идеально! Есть ли способ получить ID созданного термина? Я не очень четко сформулировал вопрос, так что большое спасибо.

Функция wp_insert_term возвращает ID термина и таксономии, см.: http://codex.wordpress.org/Function_Reference/wp_insert_term#Return_Values Также можно использовать get_term_by: http://codex.wordpress.org/Function_Reference/get_term_by
