Inicio > Wordpress > Añadir campos (custom fields) en perfiles de usuario

Añadir campos (custom fields) en perfiles de usuario

Añadiremos campos de información extra (custom fields o campos personalizados) en los perfiles de usuario de WordPress. El proceso similar al de custom fields para los posts pero bastante más sencillo. En el caso de los usuarios la información extra (meta) se almacena en la tabla wp_usermeta y se relaciona con los items de la tabla wp_users.

Nuevos campos en los perfiles de usuario

Este proceso se divide en dos sencillos pasos:

1.- Añadir los campos al formulario del perfil de usuario

A través de los eventos (actions) show_user_profile y edit_user_profile. La diferencia entre los dos es que edit_user_profile se ejecuta sólo cuándo el usuario está viendo el perfil de otro usuario al que puede editar y no el suyo propio (por ejemplo, cuándo un administrador ve el perfil de un autor); show_user_profile se ejecuta sólo en el perfil propio del usuario.

2.- Guardar la información

Los datos introducidos en los campos añadidos en el paso anterior se pueden recibir en los eventos personal_options_update (sólo cuándo el usuario edita su propio perfil, asociado a show_user_profile) y edit_user_profile_update (asociado a todos los perfiles). Aquí utilizaremos la función update_user_meta() para guardar los campos personalizados.

 

Añadimos unos campos para almacenar información laboral: compañía (company) y puesto (position). Información editable tanto por el usuario como por administradores:

//Añadimos los campos al formulario
add_action( 'show_user_profile', 'cyb_add_custom_user_fields' );
add_action( 'edit_user_profile', 'cyb_add_custom_user_fields' );
 
function cyb_add_custom_user_fields( $user ) {
?>
    <h3><?php _e('Job information', 'textdomain'); ?></h3>
    
    <table class="form-table">
        <tr>
            <th>
                <label for="company"><?php _e('Company', 'textdomain'); ?></label>
            </th>
            <td>
                <input type="text" name="company" id="company" value="<?php echo esc_attr( get_the_author_meta( 'company', $user->ID ) ); ?>" class="regular-text" />
                <p class="description"><?php _e('Enter your company name.', 'textdomain'); ?></p>
            </td>
        </tr>
        <tr>
            <th>
                <label for="position"><?php _e('Position', 'textdomain'); ?></label>
            </th>
            <td>
                <input type="text" name="position" id="position" value="<?php echo esc_attr( get_the_author_meta( 'position', $user->ID ) ); ?>" class="regular-text" />
                <p class="description"><?php _e('Enter your position name.', 'textdomain'); ?></p>
            </td>
        </tr>
    </table>
<?php }

//Guardamos los datos
add_action( 'personal_options_update', 'cyb_save_custom_user_fields' );
add_action( 'edit_user_profile_update', 'cyb_save_custom_user_fields' );
function cyb_save_custom_user_fields( $user_id ) {
    
    if ( !current_user_can( 'edit_user', $user_id ) ) {
        return false;
    }

    if( isset($_POST['company']) ) {
        //Sanitize and validate the data
        $company = sanitize_text_field($_POST['company']);
        update_user_meta( $user_id, 'company', $company );
    }
    
    if( isset($_POST['position']) ) {
        //Sanitize and validate the data
        $position = sanitize_text_field($_POST['position']);
        update_user_meta( $user_id, 'position', $position );
    }
    
}

 

Visualizar los campos en Contacto

puedes añadir cualquier tipo de datos y organizarlos como te de la gana, en el perfil de usuario de WordPress ya hay una sección dedicada a la información de contacto dónde aparece el email y la web:

User contact methods: default

Si quieres añadir información de contacto adicional, por ejemplo redes sociales o número de teléfono, utiliza user_contactmethods, y añadir nuevos campos:

add_filter('user_contactmethods','cyb_user_contactmethods');
function cyb_user_contactmethods( $contactmethods ) {

    $contactmethods['twitter'] = __('Twitter', 'textdomain');
    $contactmethods['facebook'] = __('Facebook', 'textdomain');
    $contactmethods['gplus'] = __('Google Plus', 'textdomain');
    $contactmethods['linkedin'] = __('Linkedin', 'textdomain');

    return $contactmethods;

}

User contact methods: extended

El inconveniente del filtro user_contactmethods es que no podemos definir una validación  para cada campo añadido.

 

Mostrar la información meta del usuario en el frontend

Con la función get_user_meta podemos obtener todos los campos personalizados del usuario de forma individual o todos a la vez. Esta función tiene la siguiente sintaxis:

get_user_meta($user_id, $key, $single);

Los parámetros son:

  • $user_id: (int) obligatorio. ID del usuario del que queremos obtener los meta datos.
  • $key: (string) opcional. Identificador del campo meta cuyo valor queremos obtener. Se corresponde con la columna meta_key de la tabla wp_usermeta. Si se deja vacío se obtendrá un array con todos los campos meta del usuario en forma de pares meta_key => meta_value.
  • $single: (boolean) opcional. Por defecto tiene el valor false. Si $single es false se obtendrá un array con cada uno de los valores encontrados para el key; si single es true se obtendrá un sólo valor, el primero que se encuentre en la base de datos. Este parámetro es ignorado si no se especifica un key.

Ejemplo:

//Obtenemos el ID del usuario actual
$user_id = get_current_user_id();

//Todos los meta fields
$user_meta = get_user_meta( $user_id );

//$user_meta es un array con pares meta_key => meta_value.
//Por ejemplo, los campos company y position añadidos en un ejemplo anterior
$company = $user_meta['company'];
$position = $user_meta['position'];

//Obtenidos de forma individual
$company = get_user_meta( $user_id, 'company', true );
$position = get_user_meta( $user_id, 'position', true );

Otras funciones que se pueden utilizar para obtener los campos meta de usuarios son get_the_author_meta (para “obtener” los datos) y the_author_meta (para “imprimir” los datos). Estas funciones son similares a get_user_meta pero deberían utilizarse preferiblemente dentro del loop y en el contexto de usuario como autor (toman por defecto el autor del post actual como usuario del que obtener los meta fields). Por ejemplo:

<?php
while( have_posts() ) {
    the_post();
    ?>
    <h1><?php the_title(); ?></h1>
    <p>Escrito por <?php the_author(); ?> que trabaja en <?php the_author_meta('company'); ?></p>

}
?>

Fuente: CYBMeta

Anuncios
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: