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


13

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

   function my_custom_userfields( $contactmethods ) {
    //Adds customer contact details
    $contactmethods['company_name'] = 'Company Name';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

Но больше ни на что не играем.


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

Ответы:


17

user_new_form это крюк, который может творить чудеса здесь.

function custom_user_profile_fields($user){
  ?>
    <h3>Extra profile information</h3>
    <table class="form-table">
        <tr>
            <th><label for="company">Company Name</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">Where are you?</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){
    # again do this only if you can
    if(!current_user_can('manage_options'))
        return false;

    # save my custom field
    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/


13

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

<?php
function hack_add_custom_user_profile_fields(){
    global $pagenow;

    # do this only in page user-new.php
    if($pagenow !== 'user-new.php')
        return;

    # do this only if you can
    if(!current_user_can('manage_options'))
        return false;

?>
<table id="table_my_custom_field" style="display:none;">
<!-- My Custom Code { -->
    <tr>
        <th><label for="my_custom_field">My Custom Field</label></th>
        <td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
    </tr>
<!-- } -->
</table>
<script>
jQuery(function($){
    //Move my HTML code below user's role
    $('#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){
    # again do this only if you can
    if(!current_user_can('manage_options'))
        return false;

    # save my custom field
    update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');

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

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

3
Почему вы не используете user_new_formдействие?
itazzad

@SazzadTusharKhan TX для указателя
Алекс

3

Вам нужно сделать 2 вещи.

  1. Зарегистрировать поля
  2. Сохранить поля

Примечание: приведенный ниже пример работает только для administratorроли пользователя.


1. Зарегистрируйте поля

Для добавления нового пользователя используйте действиеuser_new_form

Для профилей пользователей используйте действия show_user_profile,edit_user_profile

Зарегистрировать поля Фрагмент:

/**
 * Add fields to user profile screen, add new user screen
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_new_form', 'm_register_profile_fields' );

    //  This actions for 'User Profile' screen
    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>Client Portal</h3>
        <table class="form-table">
            <tr>
                <th><label for="dropdown">Portal Category</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

Сохранить поля Snippet:

/**
 *  Save portal category field to user profile page, add new profile page etc
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_register', 'cp_save_profile_fields' );

    //  This actions for 'User Profile' screen
    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'] );
    }
}

Полный фрагмент кода:

/**
 * Add fields to user profile screen, add new user screen
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_new_form', 'm_register_profile_fields' );

    //  This actions for 'User Profile' screen
    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>Client Portal</h3>
        <table class="form-table">
            <tr>
                <th><label for="dropdown">Portal Category</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 }
}


/**
 *  Save portal category field to user profile page, add new profile page etc
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_register', 'cp_save_profile_fields' );

    //  This actions for 'User Profile' screen
    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'] );
    }
}

2

Я могу найти обходной путь, используя тот, user_new_form_tagкоторый находится внутри user-new.phpстартового тега формы страницы. В конце концов, так что если вы выводите HTML после этого, вам просто нужно начать вывод >и удалить последний вывод >вашего собственного кода. Как в:

function add_new_field_to_useradd()
{
    echo "><div>"; // Note the first '>' here. We wrap our own output to a 'div' element.

    // Your wanted output code should be here here.

    echo "</div"; // Note the missing '>' here.
}

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.


2

Хуки важны, независимо от того, как мы сортировали поля формы внутри функции. Следуйте моим комментариям. Начиная с WordPress 4.2.2, у нас есть множество хуков:

<?php
/**
 * Declaring the form fields
 */
function 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('Field Name') ?> </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', 'show_my_fields' ); //show in my profile.php page
add_action( 'edit_user_profile', 'show_my_fields' ); //show in my profile.php page

//add_action( 'user_new_form_tag', 'show_my_fields' ); //to add the fields before the user-new.php form
add_action( 'user_new_form', 'show_my_fields' ); //to add the fields after the user-new.php form

/**
 * Saving my form fields
 */
function save_my_form_fields( $user_id ) {
    update_user_meta( $user_id, 'my_field', $_POST['my_field'] );
}
add_action( 'personal_options_update', 'save_my_form_fields' ); //for profile page update
add_action( 'edit_user_profile_update', 'save_my_form_fields' ); //for profile page update

add_action( 'user_register', 'save_my_form_fields' ); //for user-new.php page new user addition

1

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

Так что это может быть сделано только путем изменения основных файлов (БОЛЬШОЙ НЕТ НЕТ) или добавления полей с использованием JavaScript или jQuery и перехвата полей.

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


К сожалению, чтобы заставить его работать временно, я был вынужден изменить user-new.php. Это нет нет нет. Но, надеюсь, это временно.
Зак Шелбеттер

1

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


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


Ответ только для кода - плохой ответ. Попробуйте связать соответствующую статью Кодекса и объяснить код здесь.
Mayeenul Islam

0

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

я добавил

<tr class="form-field">
    <th scope="row"><label for="company_name"><?php _e('Company Name') ?> </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']             = 'Company Name';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

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>Extra profile information</h3>
    <table class="form-table">
        <tr>
            <th><label for="companyname">Company Name</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">Where are you?</span>
            </td>
        </tr>
    </table>
<?php }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.