Кастомный метабокс таксономии при редактировании поста

Для удобства в работе решил создать для кастомной таксономии свой метабокс. Таксономия иерархическая, будет использоваться только два уровня: первый - "область", вторая - "группы". Пост может входить только в один термин. Каждый термин имеет свой код.
К примеру:
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, всё норм, но требуется именно иерархическая таксономия.

Подскажите, что исправить, чтобы термин нормально прикреплялся к посту?