Доброго времени суток. Возникла такая необходимость выбора таксономий в профиле пользователя.
Я создал таксономию в профиле, связал с пользователями и с кастомным пост тайпом. Все отлично работает.
Но вот именно в ЛК, в профиле не подгружает доступные таксономии, пробовал добавить поле кастом тайп, все тщетно.
Может есть какое то решение. За ранее благодареню.
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 совсем по новому. У данного плагина огромнейший потенциал.




