Добавить выбор категории в настраиваемый тип сообщения (плагин)

Я взял чей-то старый проект в компании, в которой я работаю. Они создали плагин для добавления курсов на сайт (включая даты, местоположение и т. Д.), Но они не добавили возможности выбора категории для курса.

Я хочу добавить эту функцию, которую я попробовал, посмотрев на их другой код и скопировав / вставив в нее и адаптировав его, чтобы он соответствовал моим потребностям.

Он отображается в правой части страницы, но независимо от того, что я делаю, он никогда не помнит категорию. Отображение категорий

Я также адаптировал функцию «POST» ниже в файле, но, по-моему, мне все еще не хватает части кода, которая фактически активирует выбор категории, поскольку она также не отображается в обзоре всех курсов:

Не отображается категория

Предыдущий разработчик работал с add_meta_box для создания боксов на стороне. Я создал следующее:

 add_meta_box( 'course_category_box', // Unique ID esc_html__( 'Category', 'Category Box' ), // Title 'render_course_category_box', // Callback function 'course', // Admin page (or post type) 'side', // Context 'default' // Priority ); 

Который я вызвал, используя

 <?php function render_course_category_box( $object, $box ) { wp_nonce_field( basename( __FILE__ ), 'course_category_box_nonce' ); ?> <p> <?php wp_dropdown_categories( $args ); ?> </p> <?php } ?> 

А также добавили его в функцию save_course_meta_boxes .

 if ( !isset( $_POST['course_category_box_nonce'] ) || !wp_verify_nonce( $_POST['course_category_box_nonce'], basename( __FILE__ ) ) ) return $post_id; 

Теперь я, вероятно, делаю что-то слишком сложное, так как WordPress часто имеет гораздо более простой способ добавить такие функции.

Надеюсь, что моя проблема достаточно ясна. Если нет, не стесняйтесь обращаться за дополнительной информацией!

В качестве альтернативы отвечу Кайзера, когда вы регистрируете тип сообщения, просто используйте атрибут taxonomies :

 register_post_type( 'my-cpt', array( ... 'taxonomies' => array( 'category' ), ... ) ); 

Подробные сведения о register_post_type() можно найти здесь, в Codex .

Когда ваша таксономия уже зарегистрирована (или является встроенной, такой как теги, категории и т. Д.), Вы можете просто приклеить ее к типу post, используя register_taxonomy_for_object_type() :

 register_taxonomy_for_object_type( 'category', 'course' ); 

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

Дополнительная информация для @StephenHarris:

Когда вы регистрируете таксономию и тип сообщения и хотите их соединить, существует одно важное правило:

Всегда сначала регистрируйте таксономию. Затем зарегистрируйте тип сообщения.

Причина проста: взгляните на источник register_taxonomy() :

 // Adds the 2nd argument ($object_type) to the arguments: $args['object_type'] = array_unique( (array) $object_type ); // ... // Then the taxonomy gets added the complete Array $args as object $wp_taxonomies[ $taxonomy ] = (object) $args; 

И когда вы смотрите на источник register_post_type() :

 foreach ( $args->taxonomies as $taxonomy ) { register_taxonomy_for_object_type( $taxonomy, $post_type ); } 

Таким образом, это вызывает register_taxonomy_for_object_type() и это не удастся, если не будет зарегистрирована таксономия по всему миру, а тип сообщения будет установлен. Если вы делаете это наоборот и сначала регистрируете CPT, это просто провалится.