Aggiungere campi alla schermata "Aggiungi Nuovo Utente" nel pannello di controllo
Vorrei aggiungere il campo "Nome Azienda" alla pagina di aggiunta nuovo utente nel pannello di amministrazione. Ho fatto diverse ricerche ma non sono riuscito a trovare dettagli su come farlo. Posso facilmente aggiungere informazioni alla pagina del profilo e alla registrazione con..
function my_custom_userfields( $contactmethods ) {
// Aggiunge i dettagli di contatto del cliente
$contactmethods['company_name'] = 'Nome Azienda';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Ma niente da fare per tutto il resto.

user_new_form
è l'hook che può fare la magia qui.
function custom_user_profile_fields($user){
?>
<h3>Informazioni aggiuntive del profilo</h3>
<table class="form-table">
<tr>
<th><label for="company">Nome Azienda</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">Dove lavori?</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){
# esegui questo solo se hai i permessi
if(!current_user_can('manage_options'))
return false;
# salva il campo personalizzato
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');
Per maggiori dettagli visita il mio blog post: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Ho avuto la stessa necessità e ho creato il seguente hack:
<?php
function hack_add_custom_user_profile_fields(){
global $pagenow;
# esegui questo solo nella pagina user-new.php
if($pagenow !== 'user-new.php')
return;
# esegui questo solo se hai i permessi
if(!current_user_can('manage_options'))
return false;
?>
<table id="table_my_custom_field" style="display:none;">
<!-- Mio Codice Personalizzato { -->
<tr>
<th><label for="my_custom_field">Mio Campo Personalizzato</label></th>
<td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
</tr>
<!-- } -->
</table>
<script>
jQuery(function($){
//Sposta il mio codice HTML sotto il ruolo dell'utente
$('#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){
# di nuovo, esegui questo solo se hai i permessi
if(!current_user_can('manage_options'))
return false;
# salva il mio campo personalizzato
update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');

Ho visto il codice sorgente nel file user-new.php e non c'è un action hook come "add_user_profile", quindi ho simulato questo con l'action "admin_footer_text" filtrando per $pagenow == "user-new.php".
Ora ho commentato l'hack per spiegare il codice.

Devi fare 2 cose.
- Registrare i campi
- Salvare i campi
Nota: L'esempio qui sotto funziona solo per il ruolo utente administrator
.
1. Registrare i campi
Per Aggiungi Nuovo Utente usa l'azione user_new_form
Per Profilo Utente usa le azioni show_user_profile
, edit_user_profile
Snippet per registrare i campi:
/**
* Aggiunge campi alla schermata del profilo utente e alla schermata di aggiunta nuovo utente
*/
if( !function_exists('m_register_profile_fields') ) {
// Questa azione è per la schermata 'Aggiungi Nuovo Utente'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Queste azioni sono per la schermata 'Profilo Utente'
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>Portale Clienti</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categoria Portale</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. Salvare i campi
Per Aggiungi Nuovo Utente usa l'azione user_register
Per Profilo Utente usa le azioni personal_options_update
, edit_user_profile_update
Snippet per salvare i campi:
/**
* Salva il campo della categoria portale nella pagina del profilo utente, nuova pagina profilo, ecc.
*/
if( !function_exists('m_register_profile_fields') ) {
// Questa azione è per la schermata 'Aggiungi Nuovo Utente'
add_action( 'user_register', 'cp_save_profile_fields' );
// Queste azioni sono per la schermata 'Profilo Utente'
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 di codice completo:
/**
* Aggiunge campi alla schermata del profilo utente e alla schermata di aggiunta nuovo utente
*/
if( !function_exists('m_register_profile_fields') ) {
// Questa azione è per la schermata 'Aggiungi Nuovo Utente'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Queste azioni sono per la schermata 'Profilo Utente'
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>Portale Clienti</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categoria Portale</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 }
}
/**
* Salva il campo della categoria portale nella pagina del profilo utente, nuova pagina profilo, ecc.
*/
if( !function_exists('m_register_profile_fields') ) {
// Questa azione è per la schermata 'Aggiungi Nuovo Utente'
add_action( 'user_register', 'cp_save_profile_fields' );
// Queste azioni sono per la schermata 'Profilo Utente'
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'] );
}
}

Invece di if ( !current_user_can( 'administrator', $user_id ) )
usa if ( !current_user_can( 'administrator' ) )
. I parametri della funzione current_user_can() sono stati aggiornati - https://developer.wordpress.org/reference/functions/current_user_can/

Gli hook sono importanti, non importa come abbiamo ordinato i campi del form all'interno della funzione. Segui i miei commenti inline. A partire da WordPress 4.2.2 abbiamo molti hook disponibili:
<?php
/**
* Dichiarazione dei campi del form
*/
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('Nome Campo') ?> </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' ); //mostra nella pagina profile.php personale
add_action( 'edit_user_profile', 'wpse23813_show_my_fields' ); //mostra nella pagina profile.php di modifica
//add_action( 'user_new_form_tag', 'wpse23813_show_my_fields' ); //per aggiungere i campi prima del form user-new.php
add_action( 'user_new_form', 'wpse23813_show_my_fields' ); //per aggiungere i campi dopo il form user-new.php
/**
* Salvataggio dei miei campi del form
*/
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' ); //per l'aggiornamento della pagina profilo
add_action( 'edit_user_profile_update', 'wpse23813_save_my_form_fields' ); //per l'aggiornamento della pagina profilo
add_action( 'user_register', 'wpse23813_save_my_form_fields' ); //per l'aggiunta di nuovi utenti nella pagina user-new.php

L'hook del filtro user_contactmethods
non viene chiamato nella pagina user-new.php
, quindi non funzionerà e purtroppo se dai un'occhiata al codice sorgente vedrai che non c'è alcun hook che possa essere utilizzato per aggiungere campi extra al modulo di aggiunta nuovo utente.
Quindi questo può essere fatto solo modificando i file core (ASSOLUTAMENTE NO) oppure aggiungendo i campi utilizzando JavaScript o jQuery e intercettando i campi.
Oppure puoi creare un Ticket sul Trac

Una soluzione alternativa è disponibile utilizzando il tag user_new_form_tag
che si trova all'interno del tag di apertura del form nella pagina user-new.php
. Si trova alla fine, quindi se si desidera generare HTML dopo di esso, è necessario iniziare l'output con >
e rimuovere l'ultimo >
generato dal proprio codice. Come nel seguente esempio:
function add_new_field_to_useradd()
{
echo "><div>"; // Notare il primo '>' qui. Avvolgiamo il nostro output in un elemento 'div'.
// Il codice di output desiderato dovrebbe essere inserito qui.
echo "</div"; // Notare il '>' mancante qui.
}
add_action( "user_new_form_tag", "add_new_field_to_useradd" );
Il tag user_new_form_tag
si trova in user-new.php
intorno alla linea 303 (almeno in WP3.5.1):
...
<p><?php _e('Crea un nuovo utente e aggiungilo a questo sito.'); ?></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" />
...
Ovviamente, lo svantaggio è che tutti i campi personalizzati devono apparire per primi nel form, prima dei campi dichiarati nel core di WordPress.

Per fare questo dovrai modificare manualmente la pagina user-new.php. Non è il modo corretto di gestirlo, ma se ne hai disperatamente bisogno ecco come si fa.
Ho aggiunto
<tr class="form-field">
<th scope="row"><label for="company_name"><?php _e('Nome Azienda') ?> </label></th>
<td><input name="company_name" type="text" id="company_name" value="<?php echo esc_attr($new_user_companyname); ?>" /></td>
</tr>
Ho anche aggiunto l'informazione al file functions.php
function my_custom_userfields( $contactmethods ) {
$contactmethods['company_name'] = 'Nome Azienda';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);

Questo non funzionerà per la pagina di aggiunta nuovo utente, ma se vuoi implementarlo nella pagina "Il tuo profilo" (dove gli utenti possono modificare il loro profilo), allora puoi provare questo nel file 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>Informazioni aggiuntive del profilo</h3>
<table class="form-table">
<tr>
<th><label for="companyname">Nome Azienda</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">Dove ti trovi?</span>
</td>
</tr>
</table>
<?php }

(per la risposta di Mc-Gee) Grazie mille per questo codice! Un'altra domanda, come posso inserire una funzione in questo codice per verificare se i campi sono corretti? ... per esempio, voglio che il nome della Compagnia sia solo in lettere maiuscole... come posso scrivere questa funzione per favore?
