Как добавить элемент по умолчанию в пользовательскую таксономию?
В WordPress таксономия по умолчанию (Категории) имеет элемент "Без рубрики" по умолчанию. Как добавить элемент по умолчанию в новую пользовательскую таксономию?
functions.php:
// === ПОЛЬЗОВАТЕЛЬСКИЕ ТАКСОНОМИИ === //
function my_custom_taxonomies() {
register_taxonomy(
'block', // внутреннее имя = машиночитаемое имя таксономии
'static_content', // тип объекта = post, page, link или пользовательский тип записи
array(
'hierarchical' => true,
'labels' => array(
'name' => __( 'Блоки' ),
'singular_name' => __( 'Блок' ),
'add_new_item' => 'Добавить новый блок',
'edit_item' => 'Редактировать блок',
'new_item' => 'Новый блок',
'search_items' => 'Искать блок',
'not_found' => 'Блоки не найдены',
'not_found_in_trash' => 'В корзине блоки не найдены',
),
'query_var' => true, // включить специфичные запросы для таксономии
'rewrite' => array( 'slug' => 'block' ), // красивые постоянные ссылки для вашей таксономии?
)
);
}
add_action('init', 'my_custom_taxonomies', 0);
РЕДАКТИРОВАНИЕ: Я просто хочу, чтобы элемент таксономии был там при установке темы. Он не должен автоматически добавляться к пустому термину.

Обновление на 2020 год
Версия | Описание |
---|---|
5.5.0 |
Добавлен аргумент default_term . |
Начиная с версии 5.5.0 WordPress, вы можете указать термин по умолчанию при регистрации новой пользовательской таксономии, используя удобный аргумент default_term
.
$args = [
/...
'default_term' => [ //(string|array) Термин по умолчанию для таксономии.
'name' => 'Картофель', //(string) Название термина по умолчанию.
'slug' => 'potato', //(string) Слаг термина по умолчанию.
'description' => 'Вы можете провести ночь внутри картофеля, https://www.youtube.com/watch?v=h2mj-7-Zklw', //(string) Описание термина по умолчанию.
],
/...
];

Посмотрите здесь:
По сути, вам нужно использовать хук save_post для проверки терминов записи и добавления термина по умолчанию из вашей таксономии, если они пустые.
Если вы просто хотите установить начальный термин в своей пользовательской таксономии, то можете использовать wp_insert_term()
. Вероятно, проще всего добавить его в той же функции, которую вы используете для создания своей пользовательской таксономии. Как отмечает t3ios в комментариях, вам следует сначала вызвать get_term()
и вставлять термин только в том случае, если возвращаемое значение равно null (т.е. термин не существует).
Этот пример кода взят из Codex: http://codex.wordpress.org/Function_Reference/wp_insert_term
$parent_term = term_exists( 'fruits', 'product' ); // возвращается массив, если передана таксономия
$parent_term_id = $parent_term['term_id']; // получаем числовой ID термина
wp_insert_term(
'Apple', // термин
'product', // таксономия
array(
'description'=> 'Вкусное яблоко.',
'slug' => 'apple',
'parent'=> $parent_term_id
)
);

@anu Думаю, я не очень понятно объяснился, я просто хотел, чтобы эта таксономия была там при установке темы. Она может быть пустой, без терминов.

@anu Отлично, хотел бы я проголосовать за ваш ответ еще раз. Я отредактировал вопросы. Куда именно мне нужно поместить этот код, который вы написали выше?

Добавленный мной код — это просто пример (и он взят из кодекса WordPress) — так что вам нужно будет адаптировать его по необходимости. Лучшее место для его добавления — непосредственно перед закрывающей скобкой функции.

И если это работает, просто примите ответ, отметив его галочкой! Это лучше, чем дополнительные голоса ;)

Вы уверены, что хотите выполнять вставку в этой функции? Она выполняется при init, то есть на каждой странице. Не думаю, что вам нужно выполнять вставку каждый раз при загрузке страницы, верно? Возможно, функция вставки возвращает null/false, если термин с таким именем уже существует (я не проверял), но в любом случае это кажется немного излишним (почему бы не вызвать get_term(s) и не проверить существование, а затем вставить, если его нет).

Категория по умолчанию жестко прописана в функции wp_insert_post()
.
Поэтому точно воспроизвести это поведение невозможно, но можно реализовать похожий функционал другими способами. Я бы рекомендовал использовать хук post status transition для новых записей и назначать нужный термин по умолчанию, если во время создания записи не было назначено ни одного термина.

Мне нужно было заполнить пользовательскую таксономию "Days" днями недели. Я не хотел, чтобы клиенту приходилось вручную создавать дни, удалять их или допускать орфографические ошибки. Следуя приведенным выше рекомендациям, я пришел к этому решению, но мне интересно, можно ли написать код более лаконично:
/*************************************** Создаем пользовательскую таксономию для дней ******************************/
add_action( 'init', 'build_taxonomies', 0 );
function build_taxonomies() {
register_taxonomy(
'days',
'schedule',
array( 'hierarchical' => true,
'label' => 'Дни',
'query_var' => true,
'show_ui' => false, // удаляет меню из админ-панели и панели редактирования
'rewrite' => true ) );
/*---------------------------------------Проверяем, созданы ли дни.. если нет, создаем их----*/
$parent_term = term_exists( 'days', 'days' ); // возвращается массив, если указана таксономия
$parent_term_id = $parent_term['term_id']; // получаем числовой ID термина
wp_insert_term(// здесь, вероятно, лучше использовать массив, но у меня возникали ошибки..
'Понедельник', // термин
'days', // таксономия
array(
'slug' => 'monday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Вторник', // термин
'days', // таксономия
array(
'slug' => 'tuesday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Среда', // термин
'days', // таксономия
array(
'slug' => 'wednesday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Четверг', // термин
'days', // таксономия
array(
'slug' => 'thursday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Пятница', // термин
'days', // таксономия
array(
'slug' => 'friday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Суббота', // термин
'days', // таксономия
array(
'slug' => 'saturday',
'parent'=> $parent_term_id ));
wp_insert_term(
'Воскресенье', // термин
'days', // таксономия
array(
'slug' => 'sunday',
'parent'=> $parent_term_id ));
}
/************ Теперь добавляем свой метабокс для дней, чтобы убрать лишние элементы управления *************/
add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
add_meta_box('myrelateddiv', 'Дни*', 'ilc_post_related_meta_box', 'schedule', 'normal', 'low', array( 'taxonomy' => 'days' ));
}
function ilc_post_related_meta_box( $post, $box ) {
$defaults = array('taxonomy' => 'related');
if ( !isset($box['args']) || !is_array($box['args']) )
$args = array();
else
$args = $box['args'];
extract( wp_parse_args($args, $defaults), EXTR_SKIP );
$tax = get_taxonomy($taxonomy);
?>
<ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
<?php
wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids, 'checked_ontop' => FALSE ) )
?>
</ul>

С помощью плагина Default Term вы можете сделать следующее:
register_taxonomy( 'custom-tax', array('post'), array(
'label' => 'Пользовательский тег',
'public' => true,
'show_ui' => true,
'default_term' => 'Термин по умолчанию', // Добавьте эту строку в ваш код
// затем активируйте и деактивируйте плагин default term, чтобы сохранить установленные термины.
));
По умолчанию, когда запись публикуется, к ней будет автоматически добавлен термин по умолчанию, если не было выбрано других терминов. Работает как для иерархических, так и для неиерархических таксономий.
