Добавление полей на экран "Добавить нового пользователя" в панели управления
Я хочу добавить поле "Название компании" на страницу добавления нового пользователя в панели администратора. Я много искал, но не смог найти информацию о том, как это сделать. Я легко могу добавить информацию на страницу профиля и регистрации с помощью..
function my_custom_userfields( $contactmethods ) {
//Добавляет контактные данные клиента
$contactmethods['company_name'] = 'Название компании';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Но больше ничего не получается.

user_new_form
— это хук, который поможет решить задачу.
function custom_user_profile_fields($user){
?>
<h3>Дополнительная информация профиля</h3>
<table class="form-table">
<tr>
<th><label for="company">Название компании</label></th>
<td>
<input type="text" class="regular-text" name="company" value="<?php echo esc_attr( get_the_author_meta( 'company', $user->ID ) ); ?>" id="company" /><br />
<span class="description">Где вы работаете?</span>
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'custom_user_profile_fields' );
add_action( 'edit_user_profile', 'custom_user_profile_fields' );
add_action( "user_new_form", "custom_user_profile_fields" );
function save_custom_user_profile_fields($user_id){
# выполняем только при наличии прав
if(!current_user_can('manage_options'))
return false;
# сохраняем кастомное поле
update_usermeta($user_id, 'company', $_POST['company']);
}
add_action('user_register', 'save_custom_user_profile_fields');
add_action('profile_update', 'save_custom_user_profile_fields');
Подробнее в моей статье: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

У меня была такая же потребность, и я создал следующий хак:
<?php
function hack_add_custom_user_profile_fields(){
global $pagenow;
# выполняем только на странице user-new.php
if($pagenow !== 'user-new.php')
return;
# выполняем только при наличии прав
if(!current_user_can('manage_options'))
return false;
?>
<table id="table_my_custom_field" style="display:none;">
<!-- Мой пользовательский код { -->
<tr>
<th><label for="my_custom_field">Мое пользовательское поле</label></th>
<td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
</tr>
<!-- } -->
</table>
<script>
jQuery(function($){
// Перемещаем мой HTML-код ниже роли пользователя
$('#table_my_custom_field tr').insertAfter($('#role').parentsUntil('tr').parent());
});
</script>
<?php
}
add_action('admin_footer_text', 'hack_add_custom_user_profile_fields');
function save_custom_user_profile_fields($user_id){
# снова проверяем права
if(!current_user_can('manage_options'))
return false;
# сохраняем мое пользовательское поле
update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');

Я посмотрел исходный код в файле user-new.php и не нашел action hook типа "add_user_profile", поэтому я имитировал его с помощью action "admin_footer_text" и фильтрации по $pagenow == "user-new.php".
Теперь я закомментировал этот хак, чтобы объяснить код.

Вам необходимо выполнить 2 действия.
- Зарегистрировать поля
- Сохранить поля
Примечание: Приведённый ниже пример работает только для роли пользователя administrator
.
1. Регистрация полей
Для Добавления нового пользователя используйте действие user_new_form
Для Профиля пользователя используйте действия show_user_profile
, edit_user_profile
Фрагмент кода для регистрации полей:
/**
* Добавляем поля на экран профиля пользователя и экран добавления нового пользователя
*/
if( !function_exists('m_register_profile_fields') ) {
// Это действие для экрана 'Добавить нового пользователя'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Эти действия для экрана 'Профиль пользователя'
add_action( 'show_user_profile', 'm_register_profile_fields' );
add_action( 'edit_user_profile', 'm_register_profile_fields' );
function m_register_profile_fields( $user ) {
if ( !current_user_can( 'administrator', $user_id ) )
return false;
?>
<h3>Клиентский портал</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Категория портала</label></th>
<td>
<input type="text" class="regular-text" name="portal_cat" value="<?php echo esc_attr( get_the_author_meta( 'portal_cat', $user->ID ) ); ?>" id="portal_cat" /><br />
</td>
</tr>
</table>
<?php }
}
2. Сохранение полей
Для Добавления нового пользователя используйте действие user_register
Для Профиля пользователя используйте действия personal_options_update
, edit_user_profile_update
Фрагмент кода для сохранения полей:
/**
* Сохраняем поле категории портала на странице профиля пользователя, странице добавления профиля и т.д.
*/
if( !function_exists('m_register_profile_fields') ) {
// Это действие для экрана 'Добавить нового пользователя'
add_action( 'user_register', 'cp_save_profile_fields' );
// Эти действия для экрана 'Профиль пользователя'
add_action( 'personal_options_update', 'cp_save_profile_fields' );
add_action( 'edit_user_profile_update', 'cp_save_profile_fields' );
function cp_save_profile_fields( $user_id ) {
if ( !current_user_can( 'administrator', $user_id ) )
return false;
update_usermeta( $user_id, 'portal_cat', $_POST['portal_cat'] );
}
}
Полный фрагмент кода:
/**
* Добавляем поля на экран профиля пользователя и экран добавления нового пользователя
*/
if( !function_exists('m_register_profile_fields') ) {
// Это действие для экрана 'Добавить нового пользователя'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Эти действия для экрана 'Профиль пользователя'
add_action( 'show_user_profile', 'm_register_profile_fields' );
add_action( 'edit_user_profile', 'm_register_profile_fields' );
function m_register_profile_fields( $user ) {
if ( !current_user_can( 'administrator', $user_id ) )
return false;
?>
<h3>Клиентский портал</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Категория портала</label></th>
<td>
<input type="text" class="regular-text" name="portal_cat" value="<?php echo esc_attr( get_the_author_meta( 'portal_cat', $user->ID ) ); ?>" id="portal_cat" /><br />
</td>
</tr>
</table>
<?php }
}
/**
* Сохраняем поле категории портала на странице профиля пользователя, странице добавления профиля и т.д.
*/
if( !function_exists('m_register_profile_fields') ) {
// Это действие для экрана 'Добавить нового пользователя'
add_action( 'user_register', 'cp_save_profile_fields' );
// Эти действия для экрана 'Профиль пользователя'
add_action( 'personal_options_update', 'cp_save_profile_fields' );
add_action( 'edit_user_profile_update', 'cp_save_profile_fields' );
function cp_save_profile_fields( $user_id ) {
if ( !current_user_can( 'administrator', $user_id ) )
return false;
update_usermeta( $user_id, 'portal_cat', $_POST['portal_cat'] );
}
}

Вместо if ( !current_user_can( 'administrator', $user_id ) )
используйте if ( !current_user_can( 'administrator' ) )
. Параметры функции current_user_can() были обновлены - https://developer.wordpress.org/reference/functions/current_user_can/

Хуки важны, независимо от того, как мы отсортировали поля формы внутри функции. Обратите внимание на мои комментарии в коде. Начиная с WordPress 4.2.2 у нас есть множество хуков:
<?php
/**
* Объявление полей формы
*/
function wpse23813_show_my_fields( $user ) {
$fetched_field = get_user_meta( $user->ID, 'my_field', true ); ?>
<tr class="form-field">
<th scope="row"><label for="my-field"><?php _e('Название поля') ?> </label></th>
<td><input name="my_field" type="text" id="my-field" value="<?php echo esc_attr($fetched_field); ?>" /></td>
</tr>
<?php
}
add_action( 'show_user_profile', 'wpse23813_show_my_fields' ); //показывать на странице profile.php
add_action( 'edit_user_profile', 'wpse23813_show_my_fields' ); //показывать на странице profile.php
//add_action( 'user_new_form_tag', 'wpse23813_show_my_fields' ); //добавить поля перед формой user-new.php
add_action( 'user_new_form', 'wpse23813_show_my_fields' ); //добавить поля после формы user-new.php
/**
* Сохранение полей формы
*/
function wpse23813_save_my_form_fields( $user_id ) {
update_user_meta( $user_id, 'my_field', $_POST['my_field'] );
}
add_action( 'personal_options_update', 'wpse23813_save_my_form_fields' ); //для обновления страницы профиля
add_action( 'edit_user_profile_update', 'wpse23813_save_my_form_fields' ); //для обновления страницы профиля
add_action( 'user_register', 'wpse23813_save_my_form_fields' ); //для добавления нового пользователя на странице user-new.php

user_contactmethods
фильтр не вызывается на странице user-new.php
, поэтому этот способ не сработает, и, к сожалению, если вы посмотрите исходный код, то увидите, что там нет хука, который можно использовать для добавления дополнительных полей в форму добавления нового пользователя.
Поэтому это можно сделать только либо путем изменения файлов ядра (ОЧЕНЬ НЕ РЕКОМЕНДУЕТСЯ), либо добавлением полей с использованием JavaScript или jQuery с последующей их обработкой.
Или вы можете создать тикет в Trac

Обходное решение доступно с использованием user_new_form_tag
, который находится внутри открывающего тега формы на странице user-new.php
. Он расположен в конце, поэтому если вы выводите HTML после него, вам нужно начать вывод с >
и убрать последний >
из вашего собственного кода. Пример:
function add_new_field_to_useradd()
{
echo "><div>"; // Обратите внимание на первый '>' здесь. Мы оборачиваем наш вывод в элемент 'div'.
// Здесь должен быть ваш желаемый код вывода.
echo "</div"; // Обратите внимание на отсутствие '>' здесь.
}
add_action( "user_new_form_tag", "add_new_field_to_useradd" );
user_new_form_tag
расположен в user-new.php
примерно на строке 303 (по крайней мере, в WP3.5.1):
...
<p><?php _e('Create a brand new user and add it to this site.'); ?></p>
<form action="" method="post" name="createuser" id="createuser" class="validate"<?php do_action('user_new_form_tag');?>>
<input name="action" type="hidden" value="createuser" />
...
Конечно, недостаток здесь в том, что все ваши пользовательские поля должны появляться первыми в форме, до полей, объявленных в ядре WP.

Для этого вам придется вручную изменить страницу user-new.php. Это не самый правильный способ, но если вам срочно нужно решение, вот как это делается.
Я добавил:
<tr class="form-field">
<th scope="row"><label for="company_name"><?php _e('Название компании') ?> </label></th>
<td><input name="company_name" type="text" id="company_name" value="<?php echo esc_attr($new_user_companyname); ?>" /></td>
</tr>
Также я добавил информацию в functions.php
function my_custom_userfields( $contactmethods ) {
$contactmethods['company_name'] = 'Название компании';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);

Это не сработает для страницы добавления нового пользователя, но если вы хотите реализовать это на странице "Ваш профиль" (где пользователи могут редактировать свой профиль), то вы можете попробовать добавить этот код в functions.php:
add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );
function my_show_extra_profile_fields( $user ) { ?>
<h3>Дополнительная информация профиля</h3>
<table class="form-table">
<tr>
<th><label for="companyname">Название компании</label></th>
<td>
<input type="text" name="companyname" id="companyname" value="<?php echo esc_attr( get_the_author_meta( 'companyname', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description">Где вы находитесь?</span>
</td>
</tr>
</table>
<?php }
