Adicionando campos à tela "Adicionar novo usuário" no painel

13

Gostaria de adicionar o campo "Nome da empresa" à página de adição de novo usuário no painel de administração. Pesquisei bastante e não consegui encontrar detalhes sobre como fazer isso. Posso adicionar facilmente informações à página de perfil e registrar-me com ..

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

Mas não há dados em mais nada.

Zach Shallbetter
fonte
Você pode usar o plug - in ACF (Advanced Custom Fields) para implementar esse recurso.
Linish

Respostas:

17

user_new_form é o gancho que pode fazer a mágica aqui.

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

Para obter mais detalhes, visite minha postagem no blog: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Tahir Yasin
fonte
13

Eu tive a mesma necessidade e criei o seguinte hack:

<?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');
NkR
fonte
3
Agora estamos aguardando sua explicação.
fuxia
Eu vi o código-fonte no arquivo user-new.php e não tenho um gancho de ação como "add_user_profile", por isso simulo com a ação "admin_footer_text" e filtrei por $ pagenow == "user-new.php". Agora eu comentei o hack para explicar o código.
NkR
3
Por que você não usa user_new_formação?
itsazzad
@SazzadTusharKhan tx para o ponteiro
alex
3

Você precisa fazer 2 coisas.

  1. Campos de registro
  2. Salvar campos

Nota: O exemplo abaixo funciona apenas para administratora função de usuário.


1. Campos de registro

Para a ação Adicionar novo usuário, useuser_new_form

Para o perfil do usuário, use ações show_user_profile,edit_user_profile

Registre os campos Snippet:

/**
 * 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. Salve os campos

Para a ação Adicionar novo usuário, useuser_register

Para o perfil do usuário, use ações personal_options_update,edit_user_profile_update

Salvar campos 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'] );
    }
}

Snippet de código completo:

/**
 * 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'] );
    }
}
maheshwaghmare
fonte
2

A solução alternativa está disponível usando o user_new_form_tagque reside dentro da user-new.phpmarca inicial do formulário da página. É no final, portanto, se você produzir HTML depois disso, precisará iniciar a saída >e remover a última saída >do seu próprio código. Como em:

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

O user_new_form_tagestá situado em user-new.phptorno da linha 303 (no WP3.5.1, pelo menos):

...
<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" />
...

Obviamente, a desvantagem aqui é que todos os seus campos personalizados devem aparecer primeiro no formulário, antes dos campos declarados no núcleo do WP.

ojrask
fonte
2

Os ganchos são importantes, não importa como classificamos os campos de formulário dentro da função. Siga meus comentários em linha. A partir do WordPress 4.2.2, temos muitos ganchos agora:

<?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
Mayeenul Islam
fonte
1

user_contactmethodso gancho de filtro não é chamado na user-new.phppágina para que não funcione e, infelizmente, se você der uma olhada na fonte , verá que não há gancho que possa ser usado para adicionar campos extras ao novo formulário de usuário.

Portanto, isso só pode ser feito modificando os arquivos principais (BIG NO NO) ou adicionando os campos usando JavaScript ou jQuery e capturando os campos.

ou você pode criar um ticket no Trac

Bainternet
fonte
Infelizmente, para fazê-lo funcionar, temporariamente, fui forçado a modificar o user-new.php. Este é um não não. Mas espero que seja temporário.
Zach Shallbetter
1

O código a seguir exibirá "Informações biográficas" no formulário "Adicionar usuário"


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

Linish
fonte
Uma resposta apenas de código é uma resposta ruim. Tente vincular o artigo relacionado ao Codex e explicar o código aqui.
Mayeenul Islam
0

Para fazer isso, você precisará alterar manualmente a página user-new.php. Não é a maneira correta de lidar com isso, mas se você estiver precisando desesperadamente, é assim que é feito.

Eu adicionei

<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>

Eu também adicionei as informações ao functions.php

   function my_custom_userfields( $contactmethods ) {
    $contactmethods['company_name']             = 'Company Name';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);
Zach Shallbetter
fonte
0

Isso não serve para adicionar uma nova página de usuário, mas se você deseja que isso aconteça na página "Seu perfil" (onde os usuários podem editar seu perfil), tente isso em 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 }
AndrettiMilas
fonte