Доброго времени суток. Возникла такая необходимость выбора таксономий в профиле пользователя.
Я создал таксономию в профиле, связал с пользователями и с кастомным пост тайпом. Все отлично работает.
Но вот именно в ЛК, в профиле не подгружает доступные таксономии, пробовал добавить поле кастом тайп, все тщетно.
Может есть какое то решение. За ранее благодареню.
Taxonomy
// Регистрируем таксономию function lessons_taxonomy() { $labels = array( 'name' => _x( 'Предметы', 'Названия предметов', 'unihelp' ), 'singular_name' => _x( 'Предмет', 'Название предмета', 'unihelp' ), 'menu_name' => __( 'Предметы', 'unihelp' ), 'all_items' => __( 'Все предметы', 'unihelp' ), 'parent_item' => __( 'Родитель', 'unihelp' ), 'parent_item_colon' => __( 'Родитель:', 'unihelp' ), 'new_item_name' => __( 'Новый предмет', 'unihelp' ), 'add_new_item' => __( 'Добавить', 'unihelp' ), 'edit_item' => __( 'Изменить', 'unihelp' ), 'update_item' => __( 'Обновить', 'unihelp' ), 'view_item' => __( 'Просмотреть', 'unihelp' ), 'separate_items_with_commas' => __( 'Каждый предмет через запятую', 'unihelp' ), 'add_or_remove_items' => __( 'Добавление или Удаление', 'unihelp' ), 'choose_from_most_used' => __( 'Часто используемые', 'unihelp' ), 'popular_items' => __( 'Популярные предметы', 'unihelp' ), 'search_items' => __( 'Поиск предметов', 'unihelp' ), 'not_found' => __( 'Не найдено', 'unihelp' ), 'no_terms' => __( 'Нет предметов', 'unihelp' ), 'items_list' => __( 'Список предметов', 'unihelp' ), 'items_list_navigation' => __( 'Навигация по списку предметов', 'unihelp' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => true, ); register_taxonomy( 'lessons_cat', 'user', $args ); } add_action( 'init', 'lessons_taxonomy', 0 ); /** * Страница администратора для таксономии "предметы" */ function cb_add_lessons_cat_taxonomy_admin_page() { $tax = get_taxonomy( 'lessons_cat' ); add_users_page( esc_attr( $tax->labels->menu_name ), esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, 'edit-tags.php?taxonomy=' . $tax->name ); } add_action( 'admin_menu', 'cb_add_lessons_cat_taxonomy_admin_page' ); /** * Отключает столбец "сообщения" и добавляет столбец "пользователи" * на странице администратора "Управления предметами". */ function cb_manage_lessons_cat_user_column( $columns ) { unset( $columns['posts'] ); $columns['users'] = __( 'Пользоватеи', 'unihelp' ); return $columns; } add_filter( 'manage_edit-lessons_cat_columns', 'cb_manage_lessons_cat_user_column' ); /** * @param string $display WP just passes an empty string here. * @param string $column The name of the custom column. * @param int $term_id The ID of the term being displayed in the table. */ function cb_manage_lessons_cat_column( $display, $column, $term_id ) { if ( 'users' === $column ) { $term = get_term( $term_id, 'lessons_cat' ); echo $term->count; } } add_filter( 'manage_lessons_cat_custom_column', 'cb_manage_lessons_cat_column', 10, 3 ); /** * @param object $user The user object currently being edited. */ function cb_edit_user_lesson_cat_section( $user ) { global $pagenow; $tax = get_taxonomy( 'lessons_cat' ); /* Make sure the user can assign terms of the lessons_cat taxonomy before proceeding. */ if ( !current_user_can( $tax->cap->assign_terms ) ) return; /* Get the terms of the 'lessons_cat' taxonomy. */ $terms = get_terms( 'lessons_cat', array( 'hide_empty' => false ) ); ?> <h3></h3> <table class="form-table"> <tr> <th><label for="lessons_cat"></label></th> <td>ID); } /* If there are no lessons_cat terms, display a message. */ else { _e( 'Нет доступных предметов' ); } ?></td> </tr> </table> <label for="lessons_cat-slug ); ?>"> <input type="checkbox" name="lessons_cat[]" id="lessons_cat-slug ); ?>" value="slug; ?>" slug ) ); ?>> name; ?> </label><br /> term_id] = $term->name; } // get all terms linked with the user $usrTerms = get_the_terms( $userId, 'lessons_cat'); $usrTermsArr = []; if(!empty($usrTerms)) { foreach ( $usrTerms as $term ) { $usrTermsArr[] = (int) $term->term_id; } } // Dropdown echo ""; echo "-Select-"; foreach( $selectTerms as $options_value => $options_label ) { $selected = ( in_array($options_value, array_values($usrTermsArr)) ) ? " selected='selected'" : ""; echo "{$options_label}"; } echo ""; break; } } /** * @param int $user_id The ID of the user to save the terms for. */ function cb_save_user_lesson_cat_terms( $user_id ) { $tax = get_taxonomy( 'lessons_cat' ); /* Make sure the current user can edit the user and assign terms before proceeding. */ if ( !current_user_can( 'edit_user', $user_id ) && current_user_can( $tax->cap->assign_terms ) ) return false; $term = $_POST['lessons_cat']; $terms = is_array($term) ? $term : (int) $term; // fix for checkbox and select input field /* Sets the terms (we're just using a single term) for the user. */ wp_set_object_terms( $user_id, $terms, 'lessons_cat', false); clean_object_term_cache( $user_id, 'lessons_cat' ); } add_action( 'personal_options_update', 'cb_save_user_lesson_cat_terms' ); add_action( 'edit_user_profile_update', 'cb_save_user_lesson_cat_terms' ); add_action( 'user_register', 'cb_save_user_lesson_cat_terms' ); /** * @param string $username The username of the user before registration is complete. */ function cb_disable_lessons_cat_username( $username ) { if ( 'lessons_cat' === $username ) $username = ''; return $username; } add_filter( 'sanitize_user', 'cb_disable_lessons_cat_username' ); /** * Update parent file name to fix the selected menu issue */ function cb_change_parent_file($parent_file) { global $submenu_file; if ( isset($_GET['taxonomy']) && $_GET['taxonomy'] == 'lessons_cat' && $submenu_file == 'edit-tags.php?taxonomy=lessons_cat' ) $parent_file = 'users.php'; return $parent_file; } add_filter('parent_file', 'cb_change_parent_file');
Post Type
add_action( 'init', 'register_post_types' ); function register_post_types(){ register_post_type( 'lessons', [ 'label' => null, 'labels' => [ 'name' => 'Занятия', // основное название для типа записи 'singular_name' => 'Занятие', // название для одной записи этого типа 'add_new' => 'Добавить занятие', // для добавления новой записи 'add_new_item' => 'Добавление занятия', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование занятия', // для редактирования типа записи 'new_item' => 'Новое занятие', // текст новой записи 'view_item' => 'Смотреть занятие', // для просмотра записи этого типа. 'search_items' => 'Искать занятие', // для поиска по этим типам записи 'not_found' => 'Не найдено', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Занятия', // название меню ], 'description' => '', 'public' => true, // 'publicly_queryable' => null, // зависит от public // 'exclude_from_search' => null, // зависит от public // 'show_ui' => null, // зависит от public // 'show_in_nav_menus' => null, // зависит от public 'show_in_menu' => true, // показывать ли в меню адмнки // 'show_in_admin_bar' => null, // зависит от show_in_menu 'show_in_rest' => null, // добавить в REST API. C WP 4.7 'rest_base' => null, // $post_type. C WP 4.7 'menu_position' => 1, 'menu_icon' => null, //'capability_type' => 'post', //'capabilities' => 'post', // массив дополнительных прав для этого типа записи //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав 'hierarchical' => true, 'supports' => [ 'title', 'editor','author','thumbnail','comments' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => ['lessons_cat'], 'has_archive' => true, 'rewrite' => true, 'query_var' => true, ] ); }
Скрины
Насколько я понял, вам необходимо вывести в ЛК поле, где пользователь смог бы выбирать предложенные таксономии из списка или чекбоксами.
Думаю, можно зарегистрировать дефолтное произвольное поле профиля, пример:
add_filter('rcl_default_profile_fields', 'add_default_profile_fields', 10); function add_default_profile_fields($fields){ $fields[] = array( 'type' => 'checkbox', 'slug' => 'my-taxonomy', 'title' => __('Таксономии'), 'values' => array( __('Клиент'), __('Мастер') ) ); return $fields; }
в свойство values передайте перечень созданных терминов таксономии массивом, где ключ будет идентификатором термина, а значение наименованием
Вот кстати пример рабочего кода с выбором специализации на основе терминов таксономии:
add_filter( 'rcl_default_profile_fields', 'fng_add_default_profile_fields', 10 ); function fng_add_default_profile_fields( $fields ) { $terms = get_terms( array( 'taxonomy' => 'task-subject', 'hide_empty' => false, 'parent' => 0 ) ); if ( $terms ) { $values = array(); foreach ( $terms as $term ) { $values[$term->term_id] = $term->name; } $fields[] = array( 'slug' => 'fng-specialization', 'type' => 'custom', 'title' => __( 'Специализация', 'fng' ), 'register' => 1 ); } return $fields; } add_filter( 'rcl_profile_fields', 'fng_add_specialization_field', 10, 2 ); function fng_add_specialization_field( $fields, $args ) { foreach ( $fields as $k => $field ) { if ( $field['slug'] != 'fng-specialization' ) continue; $terms = get_terms( array( 'taxonomy' => 'task-subject', 'hide_empty' => false, 'parent' => 0 ) ); if ( ! $terms ) break; $values = array(); foreach ( $terms as $term ) { $values[$term->term_id] = $term->name; } $fields[$k]['type'] = 'select'; $fields[$k]['values'] = $values; $fields[$k]['value_in_key'] = false; } return $fields; }
Андрей CS сказал(а)
Насколько я понял, вам необходимо вывести в ЛК поле, где пользователь смог бы выбирать предложенные таксономии из списка или чекбоксами.
Вот готовый вариант прям то что нужно, огромное спасибо.
В профиле выводит таксономии, но не отмечает которые уже выбраны, и при выборе новых, не сохраняет (я поставил checkbox type).
Вот то что нужно. Огромное спасибо.
Теперь вот такая проблема, выбрал категорию в профиле, сохранилось все отлично, и при изменении все сохраняется отлично.
Но пользователь не сохраняется в нужную категорию, и в профиле пользователя в админ-панели два варианта таксономий.
Я разобрался в чем проблема.
А конкретнее меня сбил с толку slug поля (fng-specialization) и таксономии (task-subject).
В моем случае должно быть оба значения одинаковы (lessons_cat).
Огромное вам спасибо за помощь по данному вопросу. Я взглянул на WP Recall совсем по новому. У данного плагина огромнейший потенциал.