Agregar campos a la pantalla "Agregar nuevo usuario" en el panel de control
Me gustaría agregar el campo "Nombre de la Empresa" a la página de agregar nuevo usuario en el panel de administración. He estado buscando bastante y no he podido encontrar detalles sobre cómo hacer esto. Puedo agregar fácilmente información a la página de perfil y registro con...
function my_custom_userfields( $contactmethods ) {
//Agrega detalles de contacto del cliente
$contactmethods['company_name'] = 'Nombre de la Empresa';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);
Pero no funciona para nada más.

user_new_form
es el hook que puede hacer la magia aquí.
function custom_user_profile_fields($user){
?>
<h3>Información adicional del perfil</h3>
<table class="form-table">
<tr>
<th><label for="company">Nombre de la empresa</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">¿Dónde trabajas?</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){
# nuevo: haz esto solo si tienes permisos
if(!current_user_can('manage_options'))
return false;
# guarda mi campo personalizado
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 más detalles visita mi artículo en el blog: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Tuve la misma necesidad y creé el siguiente hack:
<?php
function hack_add_custom_user_profile_fields(){
global $pagenow;
# hacer esto solo en la página user-new.php
if($pagenow !== 'user-new.php')
return;
# hacer esto solo si tienes permiso
if(!current_user_can('manage_options'))
return false;
?>
<table id="table_my_custom_field" style="display:none;">
<!-- Mi Código Personalizado { -->
<tr>
<th><label for="my_custom_field">Mi Campo Personalizado</label></th>
<td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
</tr>
<!-- } -->
</table>
<script>
jQuery(function($){
//Mover mi código HTML debajo del rol del usuario
$('#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){
# nuevamente hacer esto solo si tienes permiso
if(!current_user_can('manage_options'))
return false;
# guardar mi campo personalizado
update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');

Vi el código fuente en el archivo user-new.php y no tiene un action hook como "add_user_profile", así que simulo esto con el action "admin_footer_text" y filtro por $pagenow == "user-new.php".
Ahora he comentado el hack para explicar el código.

Necesitas hacer 2 cosas.
- Registrar campos
- Guardar campos
Nota: El siguiente ejemplo funciona solo para el rol de usuario administrator
.
1. Registrar campos
Para Añadir Nuevo Usuario usa la acción user_new_form
Para Perfil de Usuario usa las acciones show_user_profile
, edit_user_profile
Snippet para registrar campos:
/**
* Añadir campos a la pantalla de perfil de usuario y a la pantalla de añadir nuevo usuario
*/
if( !function_exists('m_register_profile_fields') ) {
// Esta acción es para la pantalla 'Añadir Nuevo Usuario'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Estas acciones son para la pantalla 'Perfil de Usuario'
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 del Cliente</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categoría del 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. Guardar campos
Para Añadir Nuevo Usuario usa la acción user_register
Para Perfil de Usuario usa las acciones personal_options_update
, edit_user_profile_update
Snippet para guardar campos:
/**
* Guardar el campo de categoría del portal en la página de perfil de usuario, añadir nueva página de perfil, etc.
*/
if( !function_exists('m_register_profile_fields') ) {
// Esta acción es para la pantalla 'Añadir Nuevo Usuario'
add_action( 'user_register', 'cp_save_profile_fields' );
// Estas acciones son para la pantalla 'Perfil de Usuario'
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:
/**
* Añadir campos a la pantalla de perfil de usuario y a la pantalla de añadir nuevo usuario
*/
if( !function_exists('m_register_profile_fields') ) {
// Esta acción es para la pantalla 'Añadir Nuevo Usuario'
add_action( 'user_new_form', 'm_register_profile_fields' );
// Estas acciones son para la pantalla 'Perfil de Usuario'
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 del Cliente</h3>
<table class="form-table">
<tr>
<th><label for="dropdown">Categoría del 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 }
}
/**
* Guardar el campo de categoría del portal en la página de perfil de usuario, añadir nueva página de perfil, etc.
*/
if( !function_exists('m_register_profile_fields') ) {
// Esta acción es para la pantalla 'Añadir Nuevo Usuario'
add_action( 'user_register', 'cp_save_profile_fields' );
// Estas acciones son para la pantalla 'Perfil de Usuario'
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'] );
}
}

En lugar de if ( !current_user_can( 'administrator', $user_id ) )
usa if ( !current_user_can( 'administrator' ) )
. Los parámetros de la función current_user_can() han sido actualizados - https://developer.wordpress.org/reference/functions/current_user_can/

Los hooks son importantes, no importa cómo ordenemos los campos del formulario dentro de la función. Sigue mis comentarios en línea. A partir de WordPress 4.2.2 tenemos muchos hooks disponibles:
<?php
/**
* Declarando los campos del formulario
*/
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('Nombre del 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' ); //mostrar en mi página profile.php
add_action( 'edit_user_profile', 'wpse23813_show_my_fields' ); //mostrar en mi página profile.php
//add_action( 'user_new_form_tag', 'wpse23813_show_my_fields' ); //para agregar los campos antes del formulario user-new.php
add_action( 'user_new_form', 'wpse23813_show_my_fields' ); //para agregar los campos después del formulario user-new.php
/**
* Guardando mis campos del formulario
*/
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' ); //para actualización de página de perfil
add_action( 'edit_user_profile_update', 'wpse23813_save_my_form_fields' ); //para actualización de página de perfil
add_action( 'user_register', 'wpse23813_save_my_form_fields' ); //para adición de nuevo usuario en página user-new.php

El gancho de filtro user_contactmethods
no se llama en la página user-new.php
, por lo que no funcionará y, lamentablemente, si echas un vistazo al código fuente, verás que no hay ningún gancho que se pueda utilizar para agregar campos adicionales al formulario de agregar nuevo usuario.
Por lo tanto, esto solo se puede hacer modificando los archivos principales (GRAN NO NO) o agregando los campos usando JavaScript o jQuery y capturando los campos.
O puedes crear un Ticket en el Trac

Una solución alternativa disponible es utilizar el user_new_form_tag
que reside dentro de la etiqueta de apertura del formulario en la página user-new.php
. Está al final, así que si generas HTML después de eso, solo necesitas comenzar la salida con >
y eliminar el último >
generado por tu propio código. Como en:
function add_new_field_to_useradd()
{
echo "><div>"; // Nota el primer '>' aquí. Envolvemos nuestra salida en un elemento 'div'.
// Tu código de salida deseado debería ir aquí.
echo "</div"; // Nota el '>' faltante aquí.
}
add_action( "user_new_form_tag", "add_new_field_to_useradd" );
El user_new_form_tag
se encuentra en user-new.php
alrededor de la línea 303 (al menos en WP3.5.1):
...
<p><?php _e('Crea un usuario nuevo y añádelo a este sitio.'); ?></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" />
...
Por supuesto, la desventaja aquí es que todos tus campos personalizados deben aparecer primero en el formulario, antes de los campos declarados en el núcleo de WP.

Para hacer esto tendrás que modificar manualmente la página user-new.php. No es la forma correcta de manejarlo pero si lo necesitas urgentemente, así es como se hace.
Yo agregué:
<tr class="form-field">
<th scope="row"><label for="company_name"><?php _e('Nombre de la Empresa') ?> </label></th>
<td><input name="company_name" type="text" id="company_name" value="<?php echo esc_attr($new_user_companyname); ?>" /></td>
</tr>
También agregué la información al archivo functions.php
function my_custom_userfields( $contactmethods ) {
$contactmethods['company_name'] = 'Nombre de la Empresa';
return $contactmethods;
}
add_filter('user_contactmethods','my_custom_userfields',10,1);

Esto no funcionará para la página de agregar nuevo usuario, pero si quieres que aparezca en la página "Tu perfil" (donde los usuarios pueden editar su perfil), entonces puedes probar esto en 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>Información adicional del perfil</h3>
<table class="form-table">
<tr>
<th><label for="companyname">Nombre de la empresa</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">¿Dónde estás?</span>
</td>
</tr>
</table>
<?php }

(para la respuesta de Mc-Gee) ¡Muchas gracias por este código! Una pregunta más, ¿cómo puedo insertar una función en este código para verificar si los campos están correctamente escritos? Por ejemplo, quiero que el nombre de la Compañía esté solo en MAYÚSCULAS... ¿cómo puedo escribir esto en la función por favor?
