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

Вопрос или проблема

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

   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');

Вам нужно сделать 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'] );
    }
}

Крючки важны, независимо от того, как мы упорядочили поля формы внутри функции. Следуйте моим встроенным комментариям. На данный момент, начиная с 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('Создайте нового пользователя и добавьте его на этот сайт.'); ?></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.

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


function display_bio_field() {
  echo "HTML поля";
}
add_action('user_new_form', 'display_bio_field');

Чтобы сделать это, вам нужно будет вручную изменить страницу 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 }

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

Ответ или решение

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

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

1. Регистрация полей

Для того чтобы добавить поле "Название компании", мы будем использовать хук user_new_form. Этот хук позволяет реализовать вывод полей на странице создания нового пользователя.

Код для добавления поля "Название компании" может выглядеть следующим образом:

function add_company_name_field() {
    ?>
    <h3><?php _e('Дополнительная информация'); ?></h3>
    <table class="form-table">
        <tr>
            <th><label for="company_name"><?php _e('Название компании'); ?></label></th>
            <td>
                <input type="text" class="regular-text" name="company_name" id="company_name" value="" />
                <br />
                <span class="description"><?php _e('Введите название компании'); ?></span>
            </td>
        </tr>
    </table>
    <?php
}
add_action('user_new_form', 'add_company_name_field');

2. Сохранение данных

Следующим шагом будет сохранение введенных данных. Для этого мы воспользуемся хуком user_register, который срабатывает при регистрации нового пользователя.

Код для сохранения поля "Название компании" может выглядеть следующим образом:

function save_company_name_field($user_id) {
    if (!current_user_can('manage_options')) {
        return false; // Убедитесь, что пользователем с правами администратора
    }
    // Сохраните значение поля
    update_user_meta($user_id, 'company_name', sanitize_text_field($_POST['company_name']));
}
add_action('user_register', 'save_company_name_field');

3. Завершение интеграции

Теперь, когда вы добавили поле на форму создания нового пользователя и реализовали его сохранение, ваше поле "Название компании" будет отображаться на странице "Добавить нового пользователя" и сохраняться в метаданных пользователя.

Советы по улучшению пользовательского опыта

  • Валидация данных: Чтобы улучшить пользовательский опыт, вы можете добавить валидацию данных. Например, проверка на ввод только заглавных букв для названия компании может быть реализована с помощью JavaScript.
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function(){
    document.getElementById('createuser').onsubmit = function() {
        var companyField = document.getElementById('company_name').value;
        if (companyField !== companyField.toUpperCase()) {
            alert('Название компании должно быть в верхнем регистре!');
            return false;
        }
        return true;
    };
});
</script>
  • Производительность: Будьте осторожны с добавлением слишком большого количества пользовательских полей. Это может повлиять на производительность страниц администрирования.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...