Для удобства в работе решил создать для кастомной таксономии свой метабокс. Таксономия иерархическая, будет использоваться только два уровня: первый – "область", вторая – "группы". Пост может входить только в один термин. Каждый термин имеет свой код.
К примеру:
030 Гуманитарные науки
032 История и археология
034 Культурология
…….
Написал функцию вывода метабокса и при регистрации таксономии (register_taxonomy) добавил её имя в параметре meta_box_cb
Код функции:
[code-
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 );
}
[/code]
Метабокс выводится нормально, но выбранный термин не сохраняется. Опытным путём понял, что если при регистрации таксономии добавить ‘hierarchical’ => true, всё норм, но требуется именно иерархическая таксономия.
Подскажите, что исправить, чтобы термин нормально прикреплялся к посту?