Дополнительная информация в профиле пользователя WordPress. Произвольные поля WordPress

Продолжаем говорить на тему «Произвольных полей WordPress», а точнее «Произвольных полей в профиле пользователя WordPress». В данной статье рассмотрим вариант как вывести подробную дополнительную информацию в профиле пользователя WordPress в виде таблицы с дальнейшим выводом информации, например, в архивах автора. При этом дадим возможность пользователю управлять публичностью этих данных, а так же с возможностью разрешать администраторам, либо запрещать управлять публичностью этих данных.

Как обычно для вывода нужных Нам полей будем использовать два события: show_user_profile и edit_user_profile. А для обработки данных personal_options_update и edit_user_profile_update.

Начало будет уже привычным

if(!function_exists('VAB_user_fields')){
 function VAB_user_fields($user){
  global $pagenow;//обращаемся к глобальной переменной pagenow
  if($pagenow=='profile.php'||$pagenow=='user-edit.php'){//проверяем, находимся ли Мы в своем профиле(profile.php), либо зашли как админ редактировать чей-то профиль(user-edit.php)
  wp_nonce_field('VAB_mode_ufields_nonce','VAB_ufields_nonce');//добавляем нонс поля
  $id=$user->ID;//получаем айди пользователя, на странице которого находимся

...

Далее создадим переменную «$meta» и получим в неё мета данные текущего пользователя с ключом «admEdit». Это будет чек бокс для разрешения, либо запрета админам управлять публичностью данных.

$meta=get_the_author_meta('admEdit',$id);

После создадим ещё одну переменную «$Cek», в которой, при наличии данных в «$meta», будет лежать атрибут checked=»checked», либо пусто при отсутствии данных.

$Cek=isset($meta['1'])?'checked="checked"':'';

Переменная «$plh» — просто текст для placeholder`ов

$plh=__('Поле для ввода текста','VAB');

Далее напишим немного стилей для чек боксов в каждой строке таблицы (для возможности перевода на любой язык)

 echo '<style type="text/css">.VAB_user_fields input[type="checkbox"]:before{content:"'.__('Открытый','VAB').'";}.VAB_user_fields input[type="checkbox"]:after{content:"'.__('Закрытый','VAB').'";}</style>';

А остальные стили для них можно закинуть в какой-нибудь файл css

стили для файл.css

.VAB_user_fields th{text-align:center;}
.VAB_user_fields .VAB_FH th,.VAB_user_fields td,.VAB_fBottom{border:1px dotted #A8A8A8;}
.VAB_user_fields input[type="checkbox"]{position:relative;width:100%;min-width:220px;height:28px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;float:right;display:block;overflow:hidden;cursor:pointer;border:2px solid #ddd;border-radius:20px;padding:0;margin:0;font-size:13px;}
.VAB_user_fields input[type="checkbox"]{display:inline-block;}
.VAB_user_fields input[type="checkbox"]:before,.VAB_user_fields input[type="checkbox"]:after{width:50%;height:28px;text-align:center;display:inline-block;font:inherit;}
.VAB_user_fields input[type="checkbox"]:before{background-color:#EEEEEE;color:#999999;padding-top:12px;}
.VAB_user_fields input[type="checkbox"]:after{background-color:#2885bb;color:#FFFFFF;padding-top:12px;}
.VAB_user_fields input[type="checkbox"]:checked:before{width:50%;background-color:#2885bb;color:#FFFFFF;padding-top:14px;}
.VAB_user_fields input[type="checkbox"]:checked:after{width:51%;background-color:#EEEEEE;color:#999999;padding-top:10px;}
.VAB_user_fields input::placeholder{color:#A8A8A8;}

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

$Ed=$pagenow=='profile.php'||($pagenow=='user-edit.php'&&isset($meta['1']))?'<table><tr><td><label for="admEdit"><input type="checkbox" name="admEdit" id="admEdit" '.$Cek.'/> '.__('Разрешить администраторам управлять публичностью данных','VAB').'</label></td></tr></table>':'';
$TH=$pagenow=='profile.php'||($pagenow=='user-edit.php'&&isset($meta['1']))?'<th>'.__('Публичный доступ','VAB').'</th>':'';
echo'<h3>'.__('Дополнительная информация','VAB').'</h3>'.$Ed.'<table class="VAB_user_fields form-table"><tr class="VAB_FH"><th>'.__('Наименование','VAB').'</th><th>'.__('Информация','VAB').'</th>'.$TH.'</tr>';

Таблица в переменной «$Ed» с чек боксом «admEdit» будет отображаться только в личном профиле $pagenow==’profile.php’, либо так же у админов, но при условии, что в базе метаданные с ключом «admEdit» будут в наличии ($pagenow==’user-edit.php’&&isset($meta[‘1’])), т.е. пользователь разрешил управлять публичностью.

Переменная «$TH» — заголовочная ячейка в основной таблице с информацией. Это третий столбик с чек боксами для управления публичностью, который так же не должен отображаться, если нет разрешения на управление публичностью.

Далее необходимо выводить сами строки таблицы с той или иной информацией и чек боксами для управления публичностью. Я решил выводить их через небольшой «шаблон» ООП

Создаем class VAB_UPrFields

class VAB_UPrFields{
 function __construct($opt,$id,$text,$type,$place){
  global $pagenow;
  $meta=get_the_author_meta('admEdit',$id);
  $optV=get_the_author_meta(''.$opt.'',$id);
  $VaL=isset($optV['0'])?$optV['0']:'';
  $Cek=isset($optV['1'])?'checked="checked"':'';
  $place=$place?'placeholder="'.$place.'"':'';
  $Type=$type=='area'?'<textarea cols="22" '.$place.' name="'.$opt.'[]" id="'.$opt.'" value="">'.esc_textarea($VaL).'</textarea>':($type=='date'?'<input name="'.$opt.'[]" id="'.$opt.'" type="date" '.$place.' value="'.esc_attr($VaL).'">':'<input type="text" '.$place.' size="44" name="'.$opt.'[]" id="'.$opt.'" value="'.esc_attr($VaL).'"/>');
  $kbox=$pagenow=='profile.php'||($pagenow=='user-edit.php'&&isset($meta['1']))?'<td width="20%"><label for="'.$opt.'Show"><input type="checkbox" name="'.$opt.'[]" id="'.$opt.'Show" '.$Cek.'/><br></label></td>':'';
echo'<tr><td width="20%"><label for="'.$opt.'">'.$text.'</label></td><td>'.$Type.'</td>'.$kbox.'</tr>';}}/*$VABField=new VAB_UPrFields('',id,__('','VAB'),'','');*/

Все довольно просто и скромно. Создаем class VAB_UPrFields, передаем в конструктор данные и через него же выводим строку на экран с помощью echo.

Переданные данные:

  • $opt — ключевой идентификатор для атрибута «name», который будет хранить в себе (в базе данных) массив (с ключом 0 — конкретная информация о пользователе, с ключом 1 — чек бокс разрешающий публичность этих данных)
  • $id — идентификатор пользователя для получения данных из базы
  • $text — какой-либо текст рядом с информационным полем (например: «Дата рождения», «Мой мобильный», «Улица», «Дом/квартира»)
  • $type — какое поле будет отображаться (textarea, либо type=»date» для выбора даты рождения через календарик, либо просто текстовое поле type=»text»)
  • $place — placeholder

Переменная «$kbox» это таже третья ячейка с чек боксами, которая не должна по умолчанию отображаться у администраторов.

Наполняем таблицу строками

$VABField=new VAB_UPrFields('birth',$id,__('Дата рождения','VAB'),'date','');
$VABField=new VAB_UPrFields('phone',$id,__('Мой мобильный','VAB'),'phone',__('формат','VAB').': +7 xxxxxxxxxx');
$VABField=new VAB_UPrFields('region',$id,__('Область','VAB'),'',$plh);
$VABField=new VAB_UPrFields('city',$id,__('Город (населенный пунк)','VAB'),'',$plh);
$VABField=new VAB_UPrFields('street',$id,__('Улица','VAB'),'',$plh);
$VABField=new VAB_UPrFields('home',$id,__('Дом/квартира','VAB'),'',$plh);
$VABField=new VAB_UPrFields('index',$id,__('Почтовый индекс','VAB'),'',$plh);
$VABField=new VAB_UPrFields('education',$id,__('Уровень образования','VAB'),'',$plh);
$VABField=new VAB_UPrFields('qualification',$id,__('Квалификация','VAB'),'',$plh);
$VABField=new VAB_UPrFields('specialty',$id,__('Специальность','VAB'),'area',$plh);
$VABField=new VAB_UPrFields('schools',$id,__('Учебные заведения','VAB'),'area',$plh);
$VABField=new VAB_UPrFields('hobby',$id,__('Мое хобби','VAB'),'area',$plh);
echo'<tr><th colspan=3>'.__('Мои социальные сети','VAB').'</th></tr>';
$VABField=new VAB_UPrFields('Facebook',$id,__('Фейсбук','VAB'),'',$plh);
$VABField=new VAB_UPrFields('discord',$id,__('Дискорд','VAB'),'','Invite '.__('ссылка','VAB'));
$VABField=new VAB_UPrFields('Twitter',$id,__('Твиттер','VAB'),'',$plh);
$VABField=new VAB_UPrFields('vk',$id,__('ВКонтакте','VAB'),'',$plh);
$VABField=new VAB_UPrFields('instagram',$id,__('Инстаграм','VAB'),'',$plh);
$VABField=new VAB_UPrFields('ok',$id,__('Одноклассники','VAB'),'',$plh);
$VABField=new VAB_UPrFields('YouTube',$id,__('Ютубе','VAB'),'',$plh);
$VABField=new VAB_UPrFields('mymail',$id,__('Мой Мир','VAB'),'',$plh);
echo'<tr><th colspan=3>'.__('Мои визитки для поддержки','VAB').'</th></tr>';
$VABField=new VAB_UPrFields('paypal',$id,__('PayPal','VAB').' '.__('визитка','VAB'),'',$plh);
$VABField=new VAB_UPrFields('yandex',$id,__('Яндекс','VAB').' '.__('визитка','VAB'),'',$plh);
echo('<tr class="VAB_fBottom"></tr></table>');

 

Код вывода на экран полностью

if(!function_exists('VAB_user_fields')){
 function VAB_user_fields($user){
  global $pagenow;
  if($pagenow=='profile.php'||$pagenow=='user-edit.php'){
   wp_nonce_field('VAB_mode_ufields_nonce','VAB_ufields_nonce');
   $id=$user->ID;
   $meta=get_the_author_meta('admEdit',$id);
   $Cek=isset($meta['1'])?'checked="checked"':'';
   $plh=__('Поле для ввода текста','VAB');
   echo('<style type="text/css">.VAB_user_fields input[type="checkbox"]:before{content:"'.__('Открытый','VAB').'";}.VAB_user_fields input[type="checkbox"]:after{content:"'.__('Закрытый','VAB').'";}</style>');
   $Ed=$pagenow=='profile.php'||($pagenow=='user-edit.php'&&isset($meta['1']))?'<table><tr><td><label for="admEdit"><input type="checkbox" name="admEdit" id="admEdit" '.$Cek.'/> '.__('Разрешить администраторам управлять публичностью данных','VAB').'</label></td></tr></table>':'';
   $TH=$pagenow=='profile.php'||($pagenow=='user-edit.php'&&isset($meta['1']))?'<th>'.__('Публичный доступ','VAB').'</th>':'';
   echo('<h3>'.__('Дополнительная информация','VAB').'</h3>'.$Ed.'<table class="VAB_user_fields form-table"><tr class="VAB_FH"><th>'.__('Наименование','VAB').'</th><th>'.__('Информация','VAB').'</th>'.$TH.'</tr>');

   $VABField=new VAB_UPrFields('birth',$id,__('Дата рождения','VAB'),'date','');
   $VABField=new VAB_UPrFields('phone',$id,__('Мой мобильный','VAB'),'phone',__('формат','VAB').': +7 xxxxxxxxxx');
   $VABField=new VAB_UPrFields('region',$id,__('Область','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('city',$id,__('Город (населенный пунк)','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('street',$id,__('Улица','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('home',$id,__('Дом/квартира','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('index',$id,__('Почтовый индекс','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('education',$id,__('Уровень образования','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('qualification',$id,__('Квалификация','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('specialty',$id,__('Специальность','VAB'),'area',$plh);
   $VABField=new VAB_UPrFields('schools',$id,__('Учебные заведения','VAB'),'area',$plh);
   $VABField=new VAB_UPrFields('hobby',$id,__('Мое хобби','VAB'),'area',$plh);
   echo'<tr><th colspan=3>'.__('Мои социальные сети','VAB').'</th></tr>';
   $VABField=new VAB_UPrFields('Facebook',$id,__('Фейсбук','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('discord',$id,__('Дискорд','VAB'),'','Invite '.__('ссылка','VAB'));
   $VABField=new VAB_UPrFields('Twitter',$id,__('Твиттер','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('vk',$id,__('ВКонтакте','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('instagram',$id,__('Инстаграм','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('ok',$id,__('Одноклассники','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('YouTube',$id,__('Ютубе','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('mymail',$id,__('Мой Мир','VAB'),'',$plh);
   echo'<tr><th colspan=3>'.__('Мои визитки для поддержки','VAB').'</th></tr>';
   $VABField=new VAB_UPrFields('paypal',$id,__('PayPal','VAB').' '.__('визитка','VAB'),'',$plh);
   $VABField=new VAB_UPrFields('yandex',$id,__('Яндекс','VAB').' '.__('визитка','VAB'),'',$plh);
   echo('<tr class="VAB_fBottom"></tr></table>');

}}}
add_action('show_user_profile','VAB_user_fields');
add_action('edit_user_profile','VAB_user_fields');

Далее по сценарию идет обработка данных. Обработка данных будет начинаться по аналогии с предыдущими статьями. Будем проверять в первую очередь нонс поля.

Начало обработки

if(!function_exists('save_VAB_user_fields')){
 function save_VAB_user_fields($user_id){
  $nonce=filter_input(INPUT_POST,'VAB_ufields_nonce',FILTER_SANITIZE_STRING);
  if(!$nonce){return;}//проверяем наши nonce поля
  if(!wp_verify_nonce($nonce,'VAB_mode_ufields_nonce')){return;}//проверяем наши nonce поля

...

В переменную «$admEdit» будем получать данные из базы о нашем чек боксе «admEdit», который разрешает, либо запрещает управление публичностью администраторами. Если пост данные будут пустыми и в базе будут данные, то будем удалять их, используя функцию delete_user_meta(), в противном случае используем функцию update_user_meta(), которая обновляет, либо создает запись в базе при ееё отсутствии.

Проверяем переменную «$admEdit»

...

$admEdit=get_the_author_meta('admEdit',$user_id);
if(empty($_POST['admEdit'])&&isset($admEdit)){
 delete_user_meta($user_id,'admEdit');
 }else{
  update_user_meta($user_id,'admEdit',$_POST['admEdit']);}

...

Далее вновь обратимся к глобальной переменной pagenow, создадим пустую переменную «$erR» для ошибки на случай не корректно введенных данных, а так же создадим массив «$optArray», в который поместим все наши ключевые идентификаторы для атрибутов «name». По сле чего через цикл foreach проверим все наши данные.

Цикл foreach

...

global $pagenow;$erR='';
$optArray=array('birth','phone','region','city','street','home','index','education','qualification','specialty','schools','hobby','Facebook','discord','Twitter','vk','instagram','ok','YouTube','mymail','paypal','yandex');
 foreach($optArray as $k){
  $meta=get_the_author_meta($k,$user_id);$Pmeta=$_POST[$k];
  if(empty($_POST['admEdit'])&&$pagenow=='user-edit.php'&&isset($meta[1])=='on'){$Pmeta[1]=$meta[1];}
  if(empty($Pmeta[0])&&empty($Pmeta[1])&&isset($meta)){delete_user_meta($user_id,$k);}
  if(!empty($Pmeta[0])||!empty($Pmeta[1])){
   if(!empty($Pmeta[0])&&$k=='phone'){
    if(!preg_match("/^\+(79)[\d]{9}$/m",$Pmeta[0])){
     $erR='<div class="notice notice-error is-dismissible"><p><strong>'.__('Ошибка','VAB').'</strong>: '.__('Поле','VAB').' «'.__('Мой мобильный','VAB').'» '.__('не обновлено','VAB').' - '.__('Телефон задан в неверном формате','VAB').'</p></div>';
     set_transient('erRorUser',array('nonce'=>$erR),10);
    }else{update_user_meta($user_id,$k,$Pmeta);}
   }else{update_user_meta($user_id,$k,$Pmeta);}}}

...

Первым делом проверяем наличие в базе данных по ключу и сохраняем в переменной «$meta». Рядом создаем переменную «$Pmeta», в которую будут ложиться переданные $_POST данные, при нажатой кнопке «Обновить профиль». Переменная «$Pmeta» должна быть массивом с ключами 0 и 1. Под нулевым ключом будет храниться сама информация о пользователе, а под единицей чек бокс, при его наличии, который открывает к информации публичность, либо закрывает.

Очень важный момент: если чей-либо профиль редактирует админ ($pagenow==’user-edit.php’) и ему не разрешено управлять публичностью данных, то при нажатии кнопки «Обновить профиль» установленные юзером чек боксы слетят, т.к. их не будет в разметке у админа. Поэтому надо у админа проверить наличие этих данных (чек боксов) в базе и при их наличии подставить в $_POST данные с ключом 1

if(empty($_POST['admEdit'])&&$pagenow=='user-edit.php'&&isset($meta[1])=='on'){$Pmeta[1]=$meta[1];}

Далее проверяем, если переданных данных нет, то подчищаем базу

if(empty($Pmeta[0])&&empty($Pmeta[1])&&isset($meta)){delete_user_meta($user_id,$k);}

Если данные есть, то проверяем ключ и, если это телефон (phone), проверяем его через preg_match(). Если проверка не будет пройдена, формируем ошибку «$erR» и сохраняем в базе через временную опцию set_transient(), для дальнейшего вывода на экран с помощью admin_notices. Ну а далее по обработчику остается только сохранить данные в базе с помощью функции update_user_meta().

Код обработки целиком

if(!function_exists('save_VAB_user_fields')){
 function save_VAB_user_fields($user_id){
  $nonce=filter_input(INPUT_POST,'VAB_ufields_nonce',FILTER_SANITIZE_STRING);
  if(!$nonce){return;}//проверяем наши nonce поля
  if(!wp_verify_nonce($nonce,'VAB_mode_ufields_nonce')){return;}//проверяем наши nonce поля
  $admEdit=get_the_author_meta('admEdit',$user_id);
  if(empty($_POST['admEdit'])&&isset($admEdit)){
   delete_user_meta($user_id,'admEdit');
   }else{
    update_user_meta($user_id,'admEdit',$_POST['admEdit']);}
  global $pagenow;$erR='';
  $optArray=array('birth','phone','region','city','street','home','index','education','qualification','specialty','schools','hobby','Facebook','discord','Twitter','vk','instagram','ok','YouTube','mymail','paypal','yandex');
  foreach($optArray as $k){
   $meta=get_the_author_meta($k,$user_id);$Pmeta=$_POST[$k];
   if(empty($_POST['admEdit'])&&$pagenow=='user-edit.php'&&isset($meta[1])=='on'){$Pmeta[1]=$meta[1];}
   if(empty($Pmeta[0])&&empty($Pmeta[1])&&isset($meta)){delete_user_meta($user_id,$k);}
   if(!empty($Pmeta[0])||!empty($Pmeta[1])){
    if(!empty($Pmeta[0])&&$k=='phone'){
     if(!preg_match("/^\+(79)[\d]{9}$/m",$Pmeta[0])){
      $erR='<div class="notice notice-error is-dismissible"><p><strong>'.__('Ошибка','VAB').'</strong>: '.__('Поле','VAB').' «'.__('Мой мобильный','VAB').'» '.__('не обновлено','VAB').' - '.__('Телефон задан в неверном формате','VAB').'</p></div>';
      set_transient('erRorUser',array('nonce'=>$erR),10);
     }else{update_user_meta($user_id,$k,$Pmeta);}
    }else{update_user_meta($user_id,$k,$Pmeta);}}}
}}
add_action('personal_options_update','save_VAB_user_fields');
add_action('edit_user_profile_update','save_VAB_user_fields');

О Выводе заметок (сообщений, ошибок) в верхней части страницы админ-панели WordPress мы говорили ранее, поэтому заострять внимание не будем. Код по выводу уже знакомый.

Обработка ошибок - admin_notices

if(!function_exists('VAB_add_error')){
 function VAB_add_error(){
  $data=get_transient('erRorUser');//проверяем в базе наличие временной опции
  if($data&&$data['nonce']){//проверяем ее содержимое
   add_action('admin_notices','VAB_show_error');}}}//запускаем событие admin_notices
add_action('load-user-edit.php','VAB_add_error');
add_action('load-profile.php','VAB_add_error');
if(!function_exists('VAB_show_error')){
 function VAB_show_error(){
  $data=get_transient('erRorUser');$erRorMessage='';
  if($data&&$data['nonce']){$erRorMessage=$data['nonce'];}
echo$erRorMessage;}}//выводим на экран содержимое временной опции

Далее Мы создадим функцию «vab_arhive_author_info», соберем в ней все данные из базы и оформим в какой-либо разметке, а затем создадим событие «vab_author_info» и прикрепим к нему созданную функцию «vab_arhive_author_info»

add_action vab_author_info

if(!function_exists('vab_arhive_author_info')){
 function vab_arhive_author_info(){
  $author=get_user_by('id',get_query_var('author'));//Данные о пользователе...//получаем параметры текущей страницы
  $author_id=$author->ID;
  $author_name=get_the_author_meta('display_name',$author_id);
  $author_avatar=get_avatar(get_the_author_meta('email',$author_id),'82');
  $author_description=get_the_author_meta('description',$author_id);
  $count_user_posts=sprintf(__('В настоящее время','VAB').', %s '.__('создал(а)','VAB').' %s '.__('запись(ей)в блоге','VAB').'.',$author_name,count_user_posts($author_id,array('post','qanda')));
  $u_birth=get_the_author_meta('birth',$author_id);
  $u_birth_out=!empty($u_birth['0'])&&isset($u_birth['1'])?'<tr><td>'.__('Дата рождения','VAB').'</td><td>'.esc_attr($u_birth['0']).'</td></tr>':'';
  $u_phone=get_the_author_meta('phone',$author_id);
  $u_phone_out=!empty($u_phone['0'])&&isset($u_phone['1'])?'<tr><td>'.__('Мобильный','VAB').'</td><td>'.esc_attr($u_phone['0']).'</td></tr>':'';
  $u_region=get_the_author_meta('region',$author_id);
  $u_city=get_the_author_meta('city',$author_id);
  $u_street=get_the_author_meta('street',$author_id);
  $u_home=get_the_author_meta('home',$author_id);
  $u_index=get_the_author_meta('index',$author_id);
  $u_region_out=!empty($u_region['0'])&&isset($u_region['1'])?esc_attr($u_region['0']).' '.__('область','VAB').', ':'';
  $u_city_out=!empty($u_city['0'])&&isset($u_city['1'])?esc_attr($u_city['0']).', ':'';
  $u_street_out=!empty($u_street['0'])&&isset($u_street['1'])?__('Улица','VAB').' '.esc_attr($u_street['0']).', ':'';
  $u_home_out=!empty($u_home['0'])&&isset($u_home['1'])?esc_attr($u_home['0']).', ':'';
  $u_index_out=!empty($u_index['0'])&&isset($u_index['1'])?__('Почтовый индекс','VAB').' '.esc_attr($u_index['0']).', ':'';
  $u_address_out=!empty($u_region_out)||!empty($u_city_out)||!empty($u_street_out)||!empty($u_home_out)||!empty($u_index_out)?'<tr><td>'.__('Адрес проживания','VAB').'</td><td>'.$u_region_out.$u_city_out.$u_street_out.$u_home_out.$u_index_out.'</td></tr>':'';
  $u_education=get_the_author_meta('education',$author_id);
  $u_qualification=get_the_author_meta('qualification',$author_id);
  $u_specialty=get_the_author_meta('specialty',$author_id);
  $u_schools=get_the_author_meta('schools',$author_id);
  $u_education_out=!empty($u_education['0'])&&isset($u_education['1'])?esc_attr($u_education['0']).', ':'';
  $u_qualification_out=!empty($u_qualification['0'])&&isset($u_qualification['1'])?__('Квалификация','VAB').' - '.esc_attr($u_qualification['0']).' ':'';
  $u_specialty_out=!empty($u_specialty['0'])&&isset($u_specialty['1'])?__('по специальности','VAB').' «'.esc_attr($u_specialty['0']).'» ':'';
  $u_schools_out=!empty($u_schools['0'])&&isset($u_schools['1'])?__('Учебные заведения','VAB').': '.esc_attr($u_schools['0']):'';
  $u_education_all_out=!empty($u_education_out)||!empty($u_qualification_out)||!empty($u_specialty_out)||!empty($u_schools_out)?'<tr><td>'.__('Уровень образования','VAB').'</td><td>'.$u_education_out.$u_qualification_out.$u_specialty_out.$u_schools_out.'</td></tr>':'';
  $u_hobby=get_the_author_meta('hobby',$author_id);
  $u_hobby_out=isset($u_hobby['0'])&&isset($u_hobby['1'])&&!empty($u_hobby['0'])?'<tr><td>'.__('Хобби','VAB').'</td><td>'.esc_attr($u_hobby['0']).'</td></tr>':'';
  $socialsArray=array('vk'=>__('ВКонтакте','VAB'),'discord'=>__('Дискорд','VAB'),'instagram'=>__('Инстаграм','VAB'),'mymail'=>__('Мой Мир','VAB'),'ok'=>__('Одноклассники','VAB'),'Twitter'=>__('Твиттер','VAB'),'Facebook'=>__('Фейсбук','VAB'),'YouTube'=>__('Ютубе','VAB'),);$socvariable='';
  foreach($socialsArray as $k=>$v){$u_k=get_the_author_meta($k,$author_id);$socvariable.=!empty($u_k['0'])&&isset($u_k['1'])?' <a href="'.esc_attr($u_k['0']).'" target="_blank">«'.esc_attr($v).'»</a> ':'';}
  $u_socials_out=!empty($socvariable)?'<tr><td>'.__('Социальные сети автора','VAB').'</td><td>'.$socvariable.'</td></tr>':'';
  $u_paypal=get_the_author_meta('paypal',$author_id);$u_yandex=get_the_author_meta('yandex',$author_id);
  $u_paypal_out=!empty($u_paypal['0'])&&isset($u_paypal['1'])?' <a href="'.esc_attr($u_paypal['0']).'" target="_blank">«'.__('PayPal','VAB').' '.__('визитка','VAB').'»</a> ':'';
  $u_yandex_out=!empty($u_yandex['0'])&&isset($u_yandex['1'])?' <a href="'.esc_attr($u_yandex['0']).'" target="_blank">«'.__('Яндекс','VAB').' '.__('визитка','VAB').'»</a> ':'';
  $u_vizitki_out=!empty($u_paypal_out)||!empty($u_yandex_out)?'<tr><td>'.__('Визитные карты автора','VAB').'</td><td>'.$u_paypal_out.$u_yandex_out.'</td></tr>':'';
  $bodyTable=$u_birth_out.$u_phone_out.$u_address_out.$u_education_all_out.$u_hobby_out.$u_socials_out.$u_vizitki_out;
  $TableInfo=$bodyTable?$bodyTable:__('Дополнительная информация','VAB').' '.__('отсутствует, либо закрыта от публичного просмотра','VAB');
  if(empty($author_description)){$author_description=__('Этот автор еще не заполнил Биографию.','VAB').'<br />'.$count_user_posts;
  }else{$author_description=$author_description.'<br />'.$count_user_posts;}?>
  <div class="VAB_author_Info">
   <div class="VAB_author_avatar"><?php echo $author_avatar;?></div>
   <div class="VAB_author_Info_Detail">
    <h3 class="VAB_author_title"><?php echo __('О авторе','VAB').' '.$author_name.' ';if(current_user_can('edit_users')||get_current_user_id()==$author_id):?>
     <span class="VAB_edit_profile">(<a href="<?php echo admin_url('profile.php?user_id='.$author_id);?>"><?php _e('Редактировать профиль','VAB');?></a>)</span><?php endif;?>
    </h3><?php echo $author_description;?>
   </div>
   <div style="clear:both;"></div>
   <div class="VAB_author_social clearfix">
    <div class="VAB_author_tagline"><?php echo('<table><tbody>'.$TableInfo.'</tbody></table>');?></div>
   </div>
  </div><?php }}
add_action('vab_author_info','vab_arhive_author_info',10);

Осталось только эти данные вывести где-то. Это может быть по умолчанию индексный файл (index.php), либо архивная страница (archive.php), либо страница автора (author.php). Код может отличаться в зависимости от поставленной задачи, но примерно будет следующим:

Выводим данные пользователя

...

if(is_author()){
 if(have_posts()){
  the_post();
  printf('<span class="VABKategoriya">'.esc_html__('Архив Автора','VAB').': %s</span>','<a class="url fn n" href="'.esc_url(get_author_posts_url(get_the_author_meta('ID'))).'" title="'.esc_attr(get_the_author()).'" rel="me">'.get_the_author().'</a>');
  rewind_posts();//Перематываем цикл в начало, чтобы еще раз использовать have_posts()
  do_action('vab_author_info');}}

...

 if(have_posts()):
  while(have_posts()):
   the_post();?>
    <div id="PostPage" <?php post_class();?>>
     <?php the_title();
      the_content();
     ?>
    </div><!-- <div id="PostPage"> -->
  <?php endwhile;
 endif;

...

Ну вот и все. Благодарю за внимание!

Смотреть видео на ютуб канале «Дополнительная информация в профиле пользователя WordPress. Произвольные поля WordPress»


Кастомные поля