13ответ(ов) в теме
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
1
08:25
Версия WP-Recall: 16.26.1

Доброго времени суток. Возникла такая необходимость выбора таксономий в профиле пользователя.
Я создал таксономию в профиле, связал с пользователями и с кастомным пост тайпом. Все отлично работает.
Но вот именно в ЛК, в профиле не подгружает доступные таксономии, пробовал добавить поле кастом тайп, все тщетно.
Может есть какое то решение. За ранее благодареню.

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
2
08:56

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

0
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
3
09:30

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,
	] );
}

Скрины

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
4
18:35

Насколько я понял, вам необходимо вывести в ЛК поле, где пользователь смог бы выбирать предложенные таксономии из списка или чекбоксами.
Думаю, можно зарегистрировать дефолтное произвольное поле профиля, пример:

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;
}

1
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
5
18:53

Андрей CS сказал(а)
Насколько я понял, вам необходимо вывести в ЛК поле, где пользователь смог бы выбирать предложенные таксономии из списка или чекбоксами.

Вот готовый вариант прям то что нужно, огромное спасибо.
В профиле выводит таксономии, но не отмечает которые уже выбраны, и при выборе новых, не сохраняет (я поставил checkbox type).

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
6
19:55

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

0
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
7
19:58

Весьма благодарен.

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
8
10:12

добавьте также

add_filter('rcl_pre_update_profile_field', function($field){
	if($field['slug'] != 'fng-specialization'){
		return $field;
	}
	$field['values'] = array_flip($field['values']);
	return $field;
});

1
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
9
10:41

Андрей CS сказал(а)
добавьте также

add_filter('rcl_pre_update_profile_field', function($field){
	if($field['slug'] != 'fng-specialization'){
		return $field;
	}
	$field['values'] = array_flip($field['values']);
	return $field;
});

Это дополнительно к коду выше?

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
10
10:44

да

0
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
11
11:08

Вот то что нужно. Огромное спасибо.
Теперь вот такая проблема, выбрал категорию в профиле, сохранилось все отлично, и при изменении все сохраняется отлично.
Но пользователь не сохраняется в нужную категорию, и в профиле пользователя в админ-панели два варианта таксономий.

0
Андрей CS
не в сети 35 минут
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16934
12
11:14

я не знаю как должны сохраняться данные в БД при работе с таксономиями у пользователей, тут вам надо убедиться, что все сохраняется верно и при необходимости изменить скрипт под себя

0
Владимир
не в сети 1 месяц
На сайте с 29.11.2021
Участник
Тем 10
Сообщения 60
13
11:42

Я разобрался в чем проблема.
А конкретнее меня сбил с толку slug поля (fng-specialization) и таксономии (task-subject).
В моем случае должно быть оба значения одинаковы (lessons_cat).
Огромное вам спасибо за помощь по данному вопросу. Я взглянул на WP Recall совсем по новому. У данного плагина огромнейший потенциал.

1
Тема закрыта. Публикация новых сообщений запрещена.