1

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

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

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