Ajout de champs à l'écran «Ajouter un nouvel utilisateur» dans le tableau de bord

13

Je voudrais ajouter le champ "Nom de la société" à la page Ajouter un nouvel utilisateur dans le panneau d'administration. J'ai fait pas mal de recherches et je n'ai pas pu trouver de détails sur la façon de procéder. Je peux facilement ajouter des informations sur la page de profil et l'inscription avec ..

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

Mais pas de dés sur autre chose.

Zach Shallbetter
la source
Vous pouvez utiliser le plugin ACF (Advanced Custom Fields) pour implémenter cette fonctionnalité.
Linish

Réponses:

17

user_new_form est le crochet qui peut faire la magie ici.

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

Pour plus de détails, visitez mon article de blog: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Tahir Yasin
la source
13

J'ai eu le même besoin et j'ai créé le hack suivant:

<?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
la source
3
Nous attendons maintenant votre explication.
fuxia
J'ai vu le code source dans le fichier user-new.php et je n'ai pas de hook d'action comme "add_user_profile" alors je simule cela avec l'action "admin_footer_text" et je filtre par $ pagenow == "user-new.php". Maintenant, j'ai commenté le hack pour expliquer le code.
NkR
3
Pourquoi vous n'utilisez pas d' user_new_formaction?
itsazzad
@SazzadTusharKhan tx pour le pointeur
alex
3

Vous devez faire 2 choses.

  1. Enregistrer les champs
  2. Enregistrer les champs

Remarque: l' exemple ci - dessous ne fonctionne que pour administratorle rôle d'utilisateur.


1. Enregistrer les champs

Pour Ajouter un nouvel utilisateur action utilisationuser_new_form

Pour les actions d' utilisation du profil utilisateur show_user_profile,edit_user_profile

Enregistrer les extraits de champs:

/**
 * 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. Enregistrer les champs

Pour Ajouter un nouvel utilisateur action utilisationuser_register

Pour les actions d' utilisation du profil utilisateur personal_options_update,edit_user_profile_update

Enregistrer les extraits de champs:

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

Extrait de code complet:

/**
 * 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
la source
2

La solution de contournement est disponible en utilisant le user_new_form_tagqui réside à l'intérieur de la user-new.phpbalise de début de formulaire de la page. C'est à la fin, donc si vous sortez du HTML après cela, vous avez juste besoin de commencer la sortie avec >et de supprimer la dernière sortie >de votre propre code. Un péché:

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

Le user_new_form_tagest situé user-new.phpautour de la ligne 303 (dans WP3.5.1 au moins):

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

Bien sûr, l'inconvénient ici est que tous vos champs personnalisés doivent apparaître en premier dans le formulaire, avant les champs déclarés dans WP core.

ojrask
la source
2

Les crochets sont importants, peu importe la façon dont nous avons trié les champs de formulaire à l'intérieur de la fonction. Suivez mes commentaires en ligne. Depuis WordPress 4.2.2, nous avons maintenant de nombreux crochets:

<?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
la source
1

user_contactmethods le crochet du filtre n'est pas appelé au user-new.php page, ce qui ne fonctionnera pas et malheureusement si vous jetez un œil à la source vous verrez qu'il n'y a pas de hook qui puisse être utilisé pour ajouter des champs supplémentaires au formulaire d'ajout d'un nouvel utilisateur.

Donc, cela ne peut être fait qu'en modifiant les fichiers de base (BIG NO NO) ou en ajoutant les champs à l'aide de JavaScript ou jQuery et en attrapant les champs.

ou vous pouvez créer un ticket au Trac

Bainternet
la source
Malheureusement, afin de le faire fonctionner temporairement, j'ai été obligé de modifier user-new.php. C'est un non non. Mais j'espère que c'est temporaire.
Zach Shallbetter
1

Le code suivant affichera "Info biographique" dans le formulaire "Ajouter un utilisateur"


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

Linish
la source
Une réponse uniquement codée est une mauvaise réponse. Essayez de lier un article du Codex et d'expliquer le code ici.
Mayeenul Islam
0

Pour ce faire, vous devrez modifier manuellement la page user-new.php. Ce n'est pas la bonne façon de le gérer, mais si vous en avez désespérément besoin, c'est comme ça que c'est fait.

J'ai ajouté

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

J'ai également ajouté les informations à 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
la source
0

Cela ne le fera pas pour la page d'ajout d'un nouvel utilisateur, mais si vous voulez que cela se produise dans la page "Votre profil" (où les utilisateurs peuvent modifier leur profil), vous pouvez essayer ceci dans 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
la source