Кастомный метабокс таксономии при редактировании поста
Для удобства в работе решил создать для кастомной таксономии свой метабокс. Таксономия иерархическая, будет использоваться только два уровня: первый - "область", вторая - "группы". Пост может входить только в один термин. Каждый термин имеет свой код.
К примеру:
030 Гуманитарные науки
- 032 История и археология
- 034 Культурология
.......
Написал функцию вывода метабокса и при регистрации таксономии (register_taxonomy) добавил её имя в параметре meta_box_cb
Код функции:
public function meta_box_select( $post, $box ) { wp_enqueue_script( 'select2' ); wp_add_inline_script( "select2", "jQuery( '#taxonomy-{$this->name} select' ).select2();", "after" ); wp_enqueue_style( 'select2' ); $terms = get_terms( array( 'taxonomy' => $this->name, 'orderby' => 'name', 'order' => 'ASC', 'get' => 'all', 'hierarchical' => true, 'hide_empty' => false, ) ); if ( ( $terms ) && ( ! empty( $terms ) ) && ( ! is_wp_error( $terms ) ) ) { $optgroups = wp_list_filter( $terms, array( 'parent' => 0 ) ); $result[] = "<div id=\"taxonomy-{$this->name}\" class=\"categorydiv\">"; $result[] = " <input type=\"hidden\" value=\"0\" name=\"tax_input[{$this->name}][]\">"; $result[] = " <select name=\"tax_input[{$this->name}][]\" class=\"widefat\"><option value=\"\"></option>"; foreach ( $optgroups as $optgroup ) { $options = wp_list_filter( $terms, array( 'parent' => $optgroup->term_id ) ); if ( ( ! $options ) && ( empty( $options ) ) ) continue; $optgroup_code = get_term_meta( $optgroup->term_id, "{$this->slug}_code", true ); $result[] = sprintf( '<optgroup label="%1$02d - %2$s">', $optgroup_code, $optgroup->name ); foreach ( $options as $option ) { $option_code = get_term_meta( $option->term_id, "{$this->slug}_code", true ); $result[] = sprintf( '<option id="taxonomy_term_%1$s" value="%2$s" %3$s>%5$s - %4$s</option>', $option->term_id, $option->slug, selected( is_object_in_term( $post->ID, $this->name, $option->term_id ), true, false ), $option->name, $option_code ); } $result[] = "</optgroup>"; } $result[] = " </select>"; $result[] = "</div>"; } else { $result[] = __( 'Термины не найдены', 'pstu-enrollee' ); } echo implode( "\r\n", $result ); }
Метабокс выводится нормально, но выбранный не сохраняется. Опытным путём понял, что если при регистрации таксономии добавить 'hierarchical' => true, всё норм, но требуется именно иерархическая таксономия.
Подскажите, что исправить, чтобы термин нормально прикреплялся к посту?