Как добавить дополнительные поля на страницу профиля WordPress

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

Для этого давайте создадим плагин (или можно добавить этот код в файл темы functions.php, но это не профессионально, потому что при смене темы поля пропадут) и назовем его "Дополнительные поля для профиля". Для этого создайте php файл и добавьте туда такой код:

<?php
/*
Plugin Name: Дополнительные поля для профиля
Description: Добавляет новые поля в профиль пользователя.
Version: 1.0
*/

Это основа плагина, в котором нет ни строки кода. перейдем к коду.

Для создания дополнительных полей в профиле пользователя нам понадобятся фильтры (события):

  1. show_user_profile - срабатывает в конце страницы профиля.
  2. edit_user_profile - срабатывает в конце страницы редактирования профиля.
  3. personal_options_update - срабатывает при обновлении профиля.
  4. edit_user_profile_update - срабатывает при обновлении редактирования профиля.

Также, нам нужны будут функции для получения/добавления данных в БД:

  1. get_user_meta() - Получает мета поле указанного пользователя.
  2. update_user_meta() - Обновляет мета поле указанного пользователя.

А сам код плагин будет выглядеть так:

<?php
/*
Plugin Name: Дополнительные поля для профиля
Description: Добавляет новые поля в профиль пользователя.
Version: 1.0
*/

### дополнительные данные на странице профиля
add_action('show_user_profile', 'my_profile_new_fields_add');
add_action('edit_user_profile', 'my_profile_new_fields_add');

add_action('personal_options_update', 'my_profile_new_fields_update');
add_action('edit_user_profile_update', 'my_profile_new_fields_update');

function my_profile_new_fields_add(){ 
	global $user_ID;
	
	$accaunt = get_user_meta( $user_ID, "user_accaunt", 1 );
	
	?>
	<h3>Дополнительные данные</h3>
	<table class="form-table">
		<tr>
			<th><label for="user_fb_txt">Банковский счет</label></th>
			<td>
				<input type="text" name="user_accaunt" value="<?php echo $accaunt ?>"><br>
			</td>
		</tr>
	</table>
	<?php            
}

// обновление
function my_profile_new_fields_update(){
	global $user_ID;
	
	update_user_meta( $user_ID, "user_accaunt", $_POST['user_accaunt'] );
}

Теперь небольшой разбор кода:

Функция my_profile_new_fields_add() подключается к двум фильтрам и выводит HTML код дополнительных полей.

Функция my_profile_new_fields_update() также подключается к двум фильтрам и обновляет метаполя пользователя, при обновлении страницы профиля.

А вот так это выглядит на странице профиля/редактирования профиля:
Дополнительные поля на странице профиля в  админке WordPress

Дополнительные контактные данные

Также, дополнительные поля на страницу профиля можно добавить через фильтр user_contactmethods, но там не все так гибко и предусмотрен он, чтобы добавлять контактые данные - только текстовые поля, в раздел Контакты.

function modify_contact_methods( $contact_fields ) {
	// Новые поля
	$contact_fields['twitter']  = 'Twitter Username';
	$contact_fields['facebook'] = 'Facebook URL';
	$contact_fields['gplus']    = 'Google+ URL';
	
	// удаляем имеющиеся
	unset( $contact_fields['jabber'] );

	return $contact_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

Заботиться об обновлении этих полей в БД не нужно, WordPress сделает все сам.

В результате на странице профиля у нас появятся 3 новых поля:

Дополнительные контактные данные в WordPress

Чтобы получить новые поля в шаблоне для вывода, используйте такую функцию get_the_author_meta():

$twitterHandle = get_the_author_meta('twitter');
Рубрика: Разное | 22 марта 2015

Предыдущие записи из рубрики `Разное`

3 комментария

Александр, 01.09.2015 в 18:30

Сделал, получилось! Спасибо вам за подробную инструкцию!

ОтветитьОтветить
Варвара, 08.05.2016 в 00:39

Все легко и просто. Вроде получилось. Спасибо

ОтветитьОтветить
Александр, 26.07.2017 в 10:59

Интересное решение. Как раз недавно искал такое.

ОтветитьОтветить

Комментировать

Новые комментарии