Функционал произвольных полей плагина 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/