Добавление полей на экран "Добавить нового пользователя" в панели управления

23 июл. 2011 г., 01:22:26
Просмотры: 36.8K
Голосов: 16

Я хочу добавить поле "Название компании" на страницу добавления нового пользователя в панели администратора. Я много искал, но не смог найти информацию о том, как это сделать. Я легко могу добавить информацию на страницу профиля и регистрации с помощью..

   function my_custom_userfields( $contactmethods ) {
    //Добавляет контактные данные клиента
    $contactmethods['company_name'] = 'Название компании';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

Но больше ничего не получается.

1
Комментарии

Вы можете использовать плагин ACF (Advanced Custom Fields) для реализации этой функции.

Linish Linish
11 сент. 2017 г. 19:56:50
Все ответы на вопрос 10
0
26

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/

12 нояб. 2014 г. 16:08:06
4
13

У меня была такая же потребность, и я создал следующий хак:

<?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');
9 янв. 2013 г. 21:57:05
Комментарии

Теперь мы ждем вашего объяснения.

fuxia fuxia
9 янв. 2013 г. 23:19:02

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

Теперь я закомментировал этот хак, чтобы объяснить код.

NkR NkR
10 янв. 2013 г. 13:41:23

Почему вы не используете action user_new_form?

itsazzad itsazzad
7 мая 2014 г. 03:11:50

@SazzadTusharKhan спасибо за подсказку

alex alex
23 сент. 2014 г. 23:02:16
2

Вам необходимо выполнить 2 действия.

  1. Зарегистрировать поля
  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'] );
    }
}
22 авг. 2016 г. 14:47:14
Комментарии

Привет, это не сохраняется в user_meta

sanjeev shetty sanjeev shetty
5 июн. 2020 г. 04:01:08

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

maheshwaghmare maheshwaghmare
5 июн. 2020 г. 09:57:12
0

Хуки важны, независимо от того, как мы отсортировали поля формы внутри функции. Обратите внимание на мои комментарии в коде. Начиная с 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
17 июн. 2015 г. 15:02:18
1

user_contactmethods фильтр не вызывается на странице user-new.php, поэтому этот способ не сработает, и, к сожалению, если вы посмотрите исходный код, то увидите, что там нет хука, который можно использовать для добавления дополнительных полей в форму добавления нового пользователя.

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

Или вы можете создать тикет в Trac

23 июл. 2011 г. 12:32:31
Комментарии

К сожалению, чтобы заставить это работать временно, мне пришлось изменить user-new.php. Это нежелательно. Но, надеюсь, это временно.

Zach Shallbetter Zach Shallbetter
25 июл. 2011 г. 23:55:23
0

Обходное решение доступно с использованием 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.

19 июн. 2013 г. 15:22:33
1

Следующий код выводит поле "Биографическая информация" в форме "Добавить пользователя"


function display_bio_field() {
  echo "The field html";
}
add_action('user_new_form', 'display_bio_field');

6 февр. 2014 г. 10:31:03
Комментарии

Ответ, содержащий только код, является плохим ответом. Попробуйте добавить ссылку на соответствующую статью в Codex и объясните код здесь.

Mayeenul Islam Mayeenul Islam
6 февр. 2014 г. 11:56:49
1

Для этого вам придется вручную изменить страницу 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);
3 авг. 2011 г. 21:01:38
Комментарии

Это рабочий ответ.

sanjeev shetty sanjeev shetty
5 июн. 2020 г. 04:07:46
0

Это не сработает для страницы добавления нового пользователя, но если вы хотите реализовать это на странице "Ваш профиль" (где пользователи могут редактировать свой профиль), то вы можете попробовать добавить этот код в 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 }
9 янв. 2013 г. 23:50:51
0

(для ответа Mc-Gee) Большое спасибо за этот код! Ещё один вопрос: как добавить функцию в этот код для проверки корректности полей? Например, я хочу, чтобы название компании было только в верхнем регистре... как написать такую функцию, пожалуйста?

6 дек. 2024 г. 11:39:36