Как добавить элемент по умолчанию в пользовательскую таксономию?

18 янв. 2011 г., 13:14:41
Просмотры: 27.6K
Голосов: 12

В 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);

РЕДАКТИРОВАНИЕ: Я просто хочу, чтобы элемент таксономии был там при установке темы. Он не должен автоматически добавляться к пустому термину.

0
Все ответы на вопрос 5
2
14

Обновление на 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) Описание термина по умолчанию.
    ],
    /...
];
7 мар. 2021 г. 20:52:49
Комментарии

Есть идеи, как добавить несколько терминов по умолчанию?

Loosie94 Loosie94
18 окт. 2022 г. 22:12:28

Он принимает массив, так что ... array( array( 'name' => 'Potato', 'slug' => 'potato', 'description' => '', ), array( 'name' => 'Chicken', 'slug' => 'chicken', 'description' => '', ), ) ...

amarinediary amarinediary
18 окт. 2022 г. 22:20:39
7

Посмотрите здесь:

https://web.archive.org/web/20150403012347/http://wordpress.mfields.org/2010/set-default-terms-for-your-custom-taxonomies-in-wordpress-3-0/

По сути, вам нужно использовать хук 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
  )
);
18 янв. 2011 г. 13:46:07
Комментарии

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

wyc wyc
18 янв. 2011 г. 14:00:53

@janoChen - Я обновил ответ

anu anu
18 янв. 2011 г. 14:09:47

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

wyc wyc
18 янв. 2011 г. 14:13:19

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

anu anu
18 янв. 2011 г. 14:15:29

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

anu anu
18 янв. 2011 г. 14:16:54

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

t31os t31os
18 янв. 2011 г. 18:30:29

да, полностью согласен, что перед вставкой нужно проверить существование термина - это был просто пример кода из Codex. Я обновлю ответ

anu anu
18 янв. 2011 г. 19:56:20
Показать остальные 2 комментариев
1

Категория по умолчанию жестко прописана в функции wp_insert_post().

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

18 янв. 2011 г. 13:41:28
Комментарии

+1 за ссылку на хук статуса записи, это именно то, что я искал.

Matt Matt
25 февр. 2016 г. 15:28:23
0

Мне нужно было заполнить пользовательскую таксономию "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>   
11 окт. 2011 г. 20:57:07
1

С помощью плагина Default Term вы можете сделать следующее:

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

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

7 авг. 2016 г. 07:38:37
Комментарии

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

Garconis Garconis
12 сент. 2017 г. 20:11:04