Поддержка Проблемы и решения Кастомный метабокс таксономии при редактировании поста

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

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

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Yuri

    (@yube)

    если при регистрации таксономии добавить ‘hierarchical’ => true, всё норм, но требуется именно иерархическая таксономия.

    Ничего не понял. Нужна иерархическая, но явно указывать это не хотите?

    Ничего не понял. Нужна иерархическая, но явно указывать это не хотите?

    При регистрации я явно указываю, что таксономия должна быть иерархическая.

    
    register_taxonomy(
    			$this->name,
    			$this->object_type,
    			array(
    				'label'                 => '',
    				'labels'                => array(
    'name' => __( 'Конкурсные предложения', 'pstu-enrollee' ),
    'singular_name' => __( 'Конкурсные предложения', 'pstu-enrollee' ),
    'search_items' => __( 'Найти запись', 'pstu-enrollee' ),
    'all_items' => __( 'Все записи', 'pstu-enrollee' ),
    'view_item' => __( 'Просмотр списка записей', 'pstu-enrollee' ),
    'parent_item' => __( 'Родительская запись', 'pstu-enrollee' ),
    'parent_item_colon' => __( 'Родительская запись:', 'pstu-enrollee' ),
    'edit_item' => __( 'Редактировать запись', 'pstu-enrollee' ),
    'update_item' => __( 'Обновить запись', 'pstu-enrollee' ),
    'add_new_item' => __( 'Добавить новое конкурсное предложение', 'pstu-enrollee' ),
    'new_item_name' => __( 'Добавить конкурсное предложение', 'pstu-enrollee' ),
    'menu_name' =>__( 'Конкурсные предложения', 'pstu-enrollee' ),
    				),
    				'description'           => '',
    				'public'                => true,
    				'publicly_queryable'    => null,
    				'show_in_nav_menus'     => true,
    				'show_ui'               => true,
    				'show_in_menu'          => true,
    				'show_tagcloud'         => true,
    				'show_in_rest'          => null,
    				'rest_base'             => null,
    				'hierarchical'          => true,
    				'update_count_callback' => '',
    				'rewrite'               => true,
    				'capabilities'          => array(),
    				'meta_box_cb'           => array( $this, 'meta_box_select' ), 
    				'show_admin_column'     => false,
    				'_builtin'              => false,
    				'show_in_quick_edit'    => null,
    			) );
    

    Когда искал ошибку выяснил что если при регистрации указать ‘hierarchical’ => false — термины сохранятся. Поэтому и обратился на форум, нужна именно иерархическая таксономия, которая «сохраняется»)

    • Ответ изменён 5 лет, 6 месяцев назад пользователем chomovva.
    • Ответ изменён 5 лет, 6 месяцев назад пользователем chomovva.
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Кастомный метабокс таксономии при редактировании поста» закрыта для новых ответов.