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

10

Таксономия Wordpress по умолчанию (Категории) имеет элемент Без категории по умолчанию. Как добавить элемент по умолчанию в новую пользовательскую таксономию?

functions.php:

// === CUSTOM TAXONOMIES === //
function my_custom_taxonomies() {
    register_taxonomy(
        'block',        // internal name = machine-readable taxonomy name
        'static_content',       // object type = post, page, link, or custom post-type
        array(
            'hierarchical' => true,
            'labels' => array(
                'name' => __( 'Blocks' ),
                'singular_name' => __( 'Block' ),
                'add_new_item' => 'Add New Block',
                'edit_item' => 'Edit Block',
                'new_item' => 'New Block',
                'search_items' => 'Search Block',
                'not_found' => 'No Block found',
                'not_found_in_trash' => 'No Block found in trash',
            ),
            'query_var' => true,    // enable taxonomy-specific querying
            'rewrite' => array( 'slug' => 'block' ),    // pretty permalinks for your taxonomy?
        )
    );
}
add_action('init', 'my_custom_taxonomies', 0);

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

janoChen
источник

Ответы:

8

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

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()сначала вызвать и вставить термин, только если возвращаемое значение равно нулю (то есть термин не существует).

Этот пример кода взят из Кодекса: http://codex.wordpress.org/Function_Reference/wp_insert_term

$parent_term = term_exists( 'fruits', 'product' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
wp_insert_term(
  'Apple', // the term 
  'product', // the taxonomy
  array(
    'description'=> 'A yummy apple.', 
    'slug' => 'apple', 
    'parent'=> $parent_term_id
  )
);
ана
источник
@anu Думаю, я не очень хорошо себя объяснил, я просто хотел, чтобы эта таксономия была там, когда тема установлена. Это не имеет никакого значения, если оно пустое.
Январь
@janoChen - Я обновил ответ
Ана
@anu Отлично, я бы хотел больше проголосовать за твой ответ. Я редактировал вопросы. Где именно я должен разместить код, который вы написали выше?
Январь
Код, который я добавил, является лишь примером (и это из кодекса WordPress) - так что вам нужно будет изменить его по мере необходимости. Лучшее место, чтобы добавить это было бы перед закрывающей скобкой для функции.
ана
1
Вы уверены, что хотите запустить вставку в этой функции, она запускается по init, т.е. каждую страницу, я не думаю, что вы хотите запускать вставку каждый раз, когда страница вызывается, не так ли? Может быть, функция вставки возвращает ноль / ложь, если соответствующий термин уже существует с этим именем (я не смотрел), но все же это кажется немного ненужным (почему бы не вызвать get_term (s) и посмотреть, существует ли он, тогда вставить если нет).
t31os
4

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

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

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

Используя плагин Default Term, вы можете сделать это

register_taxonomy( 'custom-tax', array('post'), array(
    'label'              => 'Custom Tag',
    'public'             => true,
    'show_ui'            => true,
    'default_term'       => 'Some Default Term', // Add this line to your code 
// then activate and deactivate the default term plugin to save the terms you set.
));

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

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

Мне нужно было заполнить пользовательские таксономические «Дни» днями недели. Я не хотел, чтобы клиенту приходилось возиться с созданием дней или входить туда и удалять дни или дни с ошибками. Следуя приведенному выше совету, я придумал это, но мне интересно, есть ли более краткий способ его кодирования:

 /*************************************** ...Create a Custom Taxonomy for days ******************************/
add_action( 'init', 'build_taxonomies', 0 );  
function build_taxonomies() {  
    register_taxonomy( 
    'days', 
    'schedule',
   array( 'hierarchical' => true, 
    'label' => 'Days',
    'query_var' => true, 
    'show_ui' => false, //removes the menus from admin menu and edit panel  
    'rewrite' => true ) );  

/*---------------------------------------Check to see if the days are created..if not, create them----*/
$parent_term = term_exists( 'days', 'days' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id

wp_insert_term(//this should probably be an array, but I kept getting errors..
        'Monday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'monday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Tuesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'tuesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Wednesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'wednesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Thursday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'thursday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Friday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'friday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Saturday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'saturday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Sunday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'sunday',
        'parent'=> $parent_term_id ));
}
/************ now I add my own meta box for days to get rid of extra controls *************/

add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
 add_meta_box('myrelateddiv', 'Days*', '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>   
endle.winters
источник