Agregar campos a la pantalla "Agregar nuevo usuario" en el panel de control

23 jul 2011, 01:22:26
Vistas: 36.8K
Votos: 16

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.

1
Comentarios

Puedes usar el plugin ACF (Advanced Custom Fields) para implementar esta función.

Linish Linish
11 sept 2017 19:56:50
Todas las respuestas a la pregunta 10
0
26

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/

12 nov 2014 16:08:06
4
13

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');
9 ene 2013 21:57:05
Comentarios

Ahora estamos esperando tu explicación.

fuxia fuxia
9 ene 2013 23:19:02

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.

NkR NkR
10 ene 2013 13:41:23

¿Por qué no usas el action user_new_form?

itsazzad itsazzad
7 may 2014 03:11:50

@SazzadTusharKhan gracias por el dato

alex alex
23 sept 2014 23:02:16
2

Necesitas hacer 2 cosas.

  1. Registrar campos
  2. 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'] );
    }
}
22 ago 2016 14:47:14
Comentarios

Hola, esto no se está guardando en user_meta

sanjeev shetty sanjeev shetty
5 jun 2020 04:01:08

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/

maheshwaghmare maheshwaghmare
5 jun 2020 09:57:12
0

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
17 jun 2015 15:02:18
1

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

23 jul 2011 12:32:31
Comentarios

Desafortunadamente, para que funcione, temporalmente, me vi obligado a modificar user-new.php. Esto es un no-no. Pero esperemos que sea temporal.

Zach Shallbetter Zach Shallbetter
25 jul 2011 23:55:23
0

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.

19 jun 2013 15:22:33
1

El siguiente código mostrará "Información Biográfica" en el formulario "Añadir Usuario"


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

6 feb 2014 10:31:03
Comentarios

Una respuesta que solo contiene código es una mala respuesta. Intenta enlazar artículos relacionados del Codex y explica el código aquí.

Mayeenul Islam Mayeenul Islam
6 feb 2014 11:56:49
1

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);
3 ago 2011 21:01:38
Comentarios

Esta es la respuesta funcional.

sanjeev shetty sanjeev shetty
5 jun 2020 04:07:46
0

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 }
9 ene 2013 23:50:51
0

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

6 dic 2024 11:39:36