Adăugarea câmpurilor în ecranul "Adaugă Utilizator Nou" din panoul de administrare
Aș dori să adaug câmpul "Nume Companie" în pagina de adăugare utilizator nou din panoul de administrare. Am făcut destul de multe căutări și nu am reușit să găsesc detalii despre cum să fac acest lucru. Pot adăuga cu ușurință informații în pagina de profil și la înregistrare cu...
function my_custom_userfields( $contactmethods ) {
//Adaugă detalii de contact pentru client
$contactmethods['company_name'] = 'Nume Companie';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Dar nu funcționează pentru nimic altceva.

user_new_form
este hook-ul care poate face magia aici.
function custom_user_profile_fields($user){
?>
<h3>Informații suplimentare de profil</h3>
<table class="form-table">
<tr>
<th><label for="company">Nume companie</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">Unde te afli?</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){
# facem acest lucru doar dacă avem permisiunea
if(!current_user_can('manage_options'))
return false;
# salvăm câmpul personalizat
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');
Pentru mai multe detalii vizitează postul meu de blog: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Am avut aceeași nevoie și am creat următorul hack:
<?php
function hack_add_custom_user_profile_fields(){
global $pagenow;
# se execută doar în pagina user-new.php
if($pagenow !== 'user-new.php')
return;
# se execută doar dacă ai permisiunea
if(!current_user_can('manage_options'))
return false;
?>
<table id="table_my_custom_field" style="display:none;">
<!-- Codul meu Personalizat { -->
<tr>
<th><label for="my_custom_field">Câmpul meu Personalizat</label></th>
<td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
</tr>
<!-- } -->
</table>
<script>
jQuery(function($){
//Mut codul HTML sub rolul utilizatorului
$('#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){
# se execută doar dacă ai permisiunea
if(!current_user_can('manage_options'))
return false;
# salvează câmpul meu personalizat
update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');

Am văzut codul sursă în fișierul user-new.php și nu am un action hook precum "add_user_profile", așa că am simulat acest lucru cu acțiunea "admin_footer_text" și am filtrat prin $pagenow == "user-new.php".
Acum am comentat soluția temporară pentru a explica codul.

Trebuie să faci 2 lucruri.
- Înregistrează câmpuri
- Salvează câmpuri
Notă: Exemplul de mai jos funcționează doar pentru rolul de utilizator administrator
.
1. Înregistrează câmpuri
Pentru Adăugare Utilizator Nou folosește acțiunea user_new_form
Pentru Profil Utilizator folosește acțiunile show_user_profile
, edit_user_profile
Fragment de cod pentru înregistrarea câmpurilor:
/**
* Adaugă câmpuri în ecranul de profil utilizator, ecranul de adăugare utilizator nou
*/
if( !function_exists('m_register_profile_fields') ) {
// Această acțiune pentru ecranul 'Adăugare Utilizator Nou'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Aceste acțiuni pentru ecranul 'Profil Utilizator'
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>Portal Client</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categorie Portal</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. Salvează câmpuri
Pentru Adăugare Utilizator Nou folosește acțiunea user_register
Pentru Profil Utilizator folosește acțiunile personal_options_update
, edit_user_profile_update
Fragment de cod pentru salvarea câmpurilor:
/**
* Salvează câmpul categorie portal în pagina de profil utilizator, pagina de adăugare profil etc
*/
if( !function_exists('m_register_profile_fields') ) {
// Această acțiune pentru ecranul 'Adăugare Utilizator Nou'
add_action( 'user_register', 'cp_save_profile_fields' );
// Aceste acțiuni pentru ecranul 'Profil Utilizator'
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'] );
}
}
Fragment de cod complet:
/**
* Adaugă câmpuri în ecranul de profil utilizator, ecranul de adăugare utilizator nou
*/
if( !function_exists('m_register_profile_fields') ) {
// Această acțiune pentru ecranul 'Adăugare Utilizator Nou'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Aceste acțiuni pentru ecranul 'Profil Utilizator'
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>Portal Client</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categorie Portal</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 }
}
/**
* Salvează câmpul categorie portal în pagina de profil utilizator, pagina de adăugare profil etc
*/
if( !function_exists('m_register_profile_fields') ) {
// Această acțiune pentru ecranul 'Adăugare Utilizator Nou'
add_action( 'user_register', 'cp_save_profile_fields' );
// Aceste acțiuni pentru ecranul 'Profil Utilizator'
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'] );
}
}

În loc de if ( !current_user_can( 'administrator', $user_id ) )
folosește if ( !current_user_can( 'administrator' ) )
. Parametrii funcției current_user_can() au fost actualizați - https://developer.wordpress.org/reference/functions/current_user_can/

Hook-urile sunt importante, indiferent cum am sortat câmpurile formularului în interiorul funcției. Urmați comentariile mele inline. Începând cu WordPress 4.2.2 avem acum o mulțime de hook-uri:
<?php
/**
* Declararea câmpurilor formularului
*/
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('Nume Câmp') ?> </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' ); //afișează în pagina mea profile.php
add_action( 'edit_user_profile', 'wpse23813_show_my_fields' ); //afișează în pagina mea profile.php
//add_action( 'user_new_form_tag', 'wpse23813_show_my_fields' ); //pentru a adăuga câmpurile înainte de formularul user-new.php
add_action( 'user_new_form', 'wpse23813_show_my_fields' ); //pentru a adăuga câmpurile după formularul user-new.php
/**
* Salvarea câmpurilor mele de formular
*/
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' ); //pentru actualizarea paginii de profil
add_action( 'edit_user_profile_update', 'wpse23813_save_my_form_fields' ); //pentru actualizarea paginii de profil
add_action( 'user_register', 'wpse23813_save_my_form_fields' ); //pentru adăugarea unui nou utilizator în pagina user-new.php

Filtrul user_contactmethods
nu este apelat pe pagina user-new.php
, așa că nu va funcționa și, din păcate, dacă te uiți la sursă, vei vedea că nu există niciun hook care să poată fi utilizat pentru a adăuga câmpuri suplimentare în formularul de adăugare utilizator nou.
Prin urmare, acest lucru poate fi realizat doar prin modificarea fișierelor de bază (NU RECOMANDAT) sau prin adăugarea câmpurilor folosind JavaScript sau jQuery și capturarea acestor câmpuri.
Sau poți crea un Ticket în Trac

O soluție alternativă este disponibilă prin utilizarea user_new_form_tag
care se află în interiorul tag-ului de început al formularului din pagina user-new.php
. Este plasat la final, așa că dacă afișezi HTML după acesta, trebuie doar să începi output-ul cu >
și să elimini ultimul >
din propriul cod. Ca în exemplul:
function add_new_field_to_useradd()
{
echo "><div>"; // Observă primul '>' aici. Închidem propriul output într-un element 'div'.
// Codul dorit pentru output ar trebui să fie aici.
echo "</div"; // Observă lipsa '>' aici.
}
add_action( "user_new_form_tag", "add_new_field_to_useradd" );
user_new_form_tag
este situat în user-new.php
aproximativ la linia 303 (cel puțin în WP3.5.1):
...
<p><?php _e('Creează un utilizator nou și adaugă-l pe acest 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" />
...
Desigur, dezavantajul aici este că toate câmpurile personalizate trebuie să apară primele în formular, înaintea câmpurilor declarate în nucleul WP.

Pentru a face acest lucru, va trebui să modificați manual pagina user-new.php. Nu este metoda corectă de a gestiona acest lucru, dar dacă aveți nevoie urgentă, iată cum se poate face.
Am adăugat:
<tr class="form-field">
<th scope="row"><label for="company_name"><?php _e('Numele Companiei') ?> </label></th>
<td><input name="company_name" type="text" id="company_name" value="<?php echo esc_attr($new_user_companyname); ?>" /></td>
</tr>
De asemenea, am adăugat informația în functions.php
function my_custom_userfields( $contactmethods ) {
$contactmethods['company_name'] = 'Numele Companiei';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);

Acest lucru nu va funcționa pentru pagina de adăugare a unui nou utilizator, dar dacă doriți să implementați această funcționalitate pe pagina "Profilul tău" (unde utilizatorii își pot edita profilul), atunci puteți încerca acest cod în 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>Informații adiționale de profil</h3>
<table class="form-table">
<tr>
<th><label for="companyname">Numele companiei</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">Unde te afli?</span>
</td>
</tr>
</table>
<?php }

(pentru răspunsul Mc-Gee) Mulțumesc mult pentru acest cod! Încă o întrebare, cum pot insera o funcție în acest cod pentru a verifica dacă câmpurile sunt completate corect? ... de exemplu, vreau ca numele Companiei să fie doar cu litere mari... cum pot scrie această funcție, vă rog?
