Публикация в группе: Плагин WP-Recall - Личный кабинет на WordPress

Категории группы: Полезное

Функционал произвольных полей плагина WP-Recall хоть и предлагает широкие возможности внутри административной части, но все-таки не раскрывается там полностью и вполне способен удивить нестандартными вариантами применения. Предлагаю рассмотреть, как мне кажется, интересную реализацию, где формирование отдельной группы произвольных полей профиля производится за пределами вкладки "Профиль".

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

Как можно поступить используя текущий функционал плагина:

  1. Создать произвольное поле профиля с нужным типом и вывести его в списке полей профиля для заполнения
  2. Создать произвольную вкладку и вывести в ней значение этого произвольного поля

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

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

Порядок работы будет следующим:

  1. Зарегистрировать вкладку
  2. Сформировать и вывести хозяину личного кабинета для заполнения форму
  3. Сохранять указанные хозяином личного кабинета через форму данные
  4. Сформировать и вывести гостю личного кабинета данные указанные его хозяином через форму

Регистрация вкладки

Вполне обычно регистрируем публичную вкладку личного кабинета "Подробно обо мне" через функцию rcl_tab():

add_action('init','init_master_data_tab');
function init_master_data_tab(){
    
    rcl_tab(
        array(
            'id'=>'user-data',
            'supports' => array(),
            'name'=>__('Подробно обо мне'),
            'public'=>1,
            'icon'=>'fa-user',
            'output'=>'menu',
            'content'=>array(
                array(
                    'callback' => array(
                        'name'=>'master_data_tab'
                    )
                )
            )
        )
    );
    
}

Контент вкладки будет формироваться через функцию master_data_tab(), где для хозяина личного кабинета мы будем выводить форму с нужными полями для заполнения, а гостю данные с этих полей.

Указываем данные полей формы

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

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

function get_master_form_fields(){

    $fields = array(
        array(
            'type' => 'select',
            'slug' => 'user-smoke',
            'title' => 'Отношение к курению',
            'values' => array(
                'Нейтральное' => 'Нейтральное',
                'Негативное' => 'Негативное',
                'Положительное' => 'Положительное'
            )
        ),
        array(
            'type' => 'runner',
            'slug' => 'user-years',
            'title' => 'Количество полных лет',
            'value_min' => 10,
            'value_max' => 100
        ),
        array(
            'type' => 'editor',
            'slug' => 'user-description',
            'title' => 'О себе',
            'tinymce' => true
        )
    );
	
    return $fields;
}

Как можно заметить, в функции get_master_form_fields() формируются данные полей профиля, которые мы и будем выводить в форме для заполнения, а гостю будем выводить сохраненные значения этих полей. Рассмотрим пример с данными трех полей различного типа.

Формируем контент произвольной вкладки

А теперь все-таки напишем функцию master_data_tab(), которая будет формировать контент вкладки:

function master_data_tab($master_id){
    global $user_ID;

    //получаем все поля формы
    $fields = get_master_form_fields();
	
    //указываем для полей текущие значения метаданных пользователя
    foreach($fields as $k => $field){
        $fields[$k]['default'] = get_user_meta($master_id, $field['slug'], 1);
    }
    
    $CF = new Rcl_Custom_Fields();
    
    $content = '<div class="master-data">';

    if($user_ID == $master_id){
	//если хозяин кабинета, то выводим форму для заполнения
        
        $content .= '<form method="post" class="rcl-form">';
		
            foreach($fields as $field){

                $required = ($field['required'] == 1)? '<span class="required">*</span>': '';

                $content .= '<label>'.$CF->get_title($field).' '.$required.'</label>';
                $content .= $CF->get_input($field);

            }
		
        $content .= '<div class="submit-box">';
        $content .= '<input type="submit" class="recall-button" value="'.__('Сохранить данные').'">';
        $content .= '</div>';
        $content .= '<input type="hidden" name="action" value="update_master_data">';
        $content .= '</form>';
		
    }else{
        //если гость, то выводим указанные значения полей

        foreach($fields as $field){

            if(!$field['default']){
                $content .= 'ничего не указано';
            }else{
                $content .= $CF->get_field_value($field, $field['default']);
            }

        }

    }

    $content .= '</div>';

    return $content;
}

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

.master-data label{
    font-weight:bold;
}
.master-data .rcl-field-input{
    margin-bottom: 15px;
}
.master-data .submit-box{
    text-align:right;
}

будет выглядеть вот так:

 

Нам осталось лишь написать свой обработчик для сохранения данных с этой формы.

Сохраняем указанные данные

Так как все данные с полей формы будут сохраняться в пользовательские метаданные, то мы можем сохранить их с помощью функции плагина rcl_update_profile_fields(), ее и будем использовать. Обратим внимание, что в нашей форме присутствует скрытое поле 'action' со значением 'update_master_data', по этому значению мы и будем отлавливать отправляемые данные с формы при сохранении. Итак, внимание:

add_action('wp','init_update_master_fields');
function init_update_master_fields(){
    global $user_ID;

    if(!isset($_POST['action']) || $_POST['action'] != 'update_master_data') return false;
    //если идет запрос с update_master_data, то
    
    //получаем текущие поля формы
    $fields = get_master_form_fields();

    //передаем их в функцию сохранения полей 
    //профиля для указанного пользователя
    rcl_update_profile_fields($user_ID, $fields);

}

Таким нехитрым способом данные заполненные в форме будут сохраняться в метаданные хозяина текущего личного кабинета. После сохранения все значения этих полей можно будет получить через стандартную функцию get_user_meta() и применить их там где требуется. Нужно лишь верно указать значение 'meta_key поля профиля', он будет соответствовать значению 'slug' поля формы. Например, значения полей из нашей формы мы сможем получить так:

  • get_user_meta($user_id, 'user-smoke', 1);
  • get_user_meta($user_id, 'user-years', 1);
  • get_user_meta($user_id, 'user-description', 1);

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

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

Что же мы получили в результате?

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

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

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

Буду рад, если этот опыт кто то решит применить в своих проектах, на мой взгляд, это очень удобный и гибкий вариант заполнения пользовательских данных профиля.

6

Автор публикации

не в сети 2 часа

Андрей CS

12K
рассматриваю задания
Комментарии: 2744Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0