Функционал произвольных полей плагина WP-Recall хоть и предлагает широкие возможности внутри административной части, но все-таки не раскрывается там полностью и вполне способен удивить нестандартными вариантами применения. Предлагаю рассмотреть, как мне кажется, интересную реализацию, где формирование отдельной группы произвольных полей профиля производится за пределами вкладки "Профиль".
Итак, задача - дать пользователю возможность указывать произвольные данные, сохраняемые в пользовательских метаданных, которые будут выводится для стороннего посетителя для ознакомления внутри отдельной произвольной вкладки.
Как можно поступить используя текущий функционал плагина:
- Создать произвольное поле профиля с нужным типом и вывести его в списке полей профиля для заполнения
- Создать произвольную вкладку и вывести в ней значение этого произвольного поля
Так все получится, но, на мой взгляд не очень удобно делить один и тот же контент на две вкладки: прописывать значения во вкладке профиля, а выводить их в совершенно другой произвольной вкладке.
Гораздо удобнее будет не трогать вкладку профиля, а работать только с той вкладкой, где и будет выводится контент этого поля, только для автора личного кабинета выводить там форму для заполнения, а гостю - уже заполненные автором кабинета данные!
Порядок работы будет следующим:
- Зарегистрировать вкладку
- Сформировать и вывести хозяину личного кабинета для заполнения форму
- Сохранять указанные хозяином личного кабинета через форму данные
- Сформировать и вывести гостю личного кабинета данные указанные его хозяином через форму
Регистрация вкладки
Вполне обычно регистрируем публичную вкладку личного кабинета "Подробно обо мне" через функцию 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);
Ну а нам требуется, чтобы гость личного кабинета видел в этой вкладке установленные хозяином личного кабинета значения полей формы и он их увидит:
Хозяин личного кабинета будет видеть форму с указанными данными, которые он может изменить в любой момент, а сторонний посетитель - текущие значения полей формы. Ну а если мы не хотим демонстрировать данные с этой формы гостям личного кабинета, то просто установите соответствующую приватность вкладке.
Что же мы получили в результате?
Во-первых, мы по сути вынесли некоторые поля профиля из вкладки "Профиль" в другую вкладку, избежав переполнение формы заполнения профиля множеством слабосвязанных друг с другом полей профиля.
Во-вторых, мы использовали одну вкладку личного кабинета и для заполнения полей профиля и для их вывода, оптимально использовав пространство личного кабинета.
Таким образом, можно создавать самые разные формы различного предназначения и группировать пользовательские поля профиля по предназначению, размещая эти группы в разных вкладках личного кабинета.
Буду рад, если этот опыт кто то решит применить в своих проектах, на мой взгляд, это очень удобный и гибкий вариант заполнения пользовательских данных профиля.


А я хотел по другому сделать чуть чуть. Где то, где выводится значение поля, автор мог навести на нужное поле и нажать "отредактировать" и изменить его.
Но хз где это применять. Например отшельник делал какой-то плагин где выводится информация о юзере - там вот можно. А больше не придумал где )
А если это дочерняя вкладка, то принципиального различия нет?
верно, принципиального различия нет, можно создать несколько подобных форм и раскидать их по дочерним вкладкам какой то одной вкладки и все будет работать также
Очень интересно, сразу идеи повалили))
Получилось сделать таким способом, спасибо, только у меня все вкладки переключаются аяксом, а эта перезагружается, как добавить к ней аякс?
тогда для массива "supports" прописывайте поддержку ajax, подробное описание функции регистрации вкладки: https://codeseller.ru/api-rcl/rcl_tab/
Всё замечательно написано. Но куда в какие папки и файлы вставлять этот код ?
Какие пути этим файлам и их название ?
код можно вставлять, например, в файл функций текущей темы, но лучше всего оформить все в отдельное дополнение https://codeseller.ru/post-group/sozdaem-svoe-dopolnenie-dlya-wp-recall-vyvodim-svoyu-vkladku-v-lichnom-kabinete/
Да. Спасибо большое что подсказали. Я и дополнение своё создал и всё как бы работает и выводится, но как мне эти get_user_meta() вывести ? Это где то в шаблонах темы всё прописывается ? Вы уж меня извините за надоедливость ) Но я не программист )
Подобные вопросы решаем на форуме поддержки. Описываем что делали и что не получается
В примере есть массив с типом: редактор
"array(
'type' => 'editor',
'slug' => 'user-description',
'title' => 'О себе',
'tinymce' => true
)"
В данном типе поля все введенные данные после сохранения остаются в форме редактора.Как сделать так что бы введенные данные выносились на саму страницу а не оставались отображаться в редакторе?
редактор выводится только для того, кто имеет право на редактирование, другие его не видят
"редактор выводится только для того, кто имеет право на редактирование" Логично) Но вопрос не о том кто его видит, а в том как отображаются данные которые вводит владелец кабинета.Как вывести сохраненные данные вне формы редактора? Владелец своего кабинета вводит данные в редактор и при сохранении что бы данные не в редакторе оставались а к примеру выше него на той же странице.
а зачем дублировать один и тот же текст и в редакторе и над ним? бесполезная трата пространства на странице
К примеру в редакторе пользователь вводит шорткод, нажимает сохранить и видит не просто текст [shortcode] а данные которые привязаны к этом шорткоду.
Подобные вопросы стоит задавать на форуме поддержки плагина, в разделе кастомизаций https://codeseller.ru/forum/print-his-add-on/ так как общение может быть затянутым, выходить из веток общения и мало интересным другим пользователям. Просто там давайте ссылку на тот материал, по урокам которого вы делали что-то.
Здравствуйте. Подскажите, а Дополнение Users Filter будет искать по произвольным полям созданным таким образом, а не через админку?
Добрый день, нет, указанное дополнение ищет только по полям профиля созданным через админку
Посмотрел код дополнения, думаю, также можно встроить поля созданные php-кодом через имеющийся фильтр usf_form_fields, должно сработать. Если интересно, то создайте тему на форуме, попробуем разобраться там.
Благодарю. Сейчас сделаюсь випом и создам тему на форуме дополнения юзерс фильтра
Всё сделал по инструкции, всё работает кроме чекбокса. При создании поля типа чекбокс, значение поля не сохраняется а после обновления страницы становится снова пустым. На форуме уже разбиралась подобная проблема но по произвольным полям формы публикации. А как исправить это дело в произвольных полях созданных как в этой статье?
Все проблемы решаем на форуме.
По тому что вы ничего не привели - подсказать нечего
Не могли бы вы мне подсказать, я не очень понимаю инструкцию, где в каких файлах это писать и куда это вставлять. Я хочу создать произвольную вкладку, в которой пользователь сам вводит информацию о чем либо. Буду благодарен. Можно в ЛС.
Туда же куда и все сниппеты вордпресс: "Куда мне вставить этот код? (и стили)" https://codeseller.ru/post-group/kuda-mne-vstavit-etot-kod-i-stili/
Возникнут еще вопросы - стоит их решать только на форуме поддержки https://codeseller.ru/forum/