Añadir campos personalizados (custom fields) en los perfiles de usuario WordPress
Hoy vamos a ver como podemos añadir 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
. Vamos a ver dos partes: añadir nuevos custom fields en general y un caso especial para añadir campos extra a la sección «Información de contacto».
Nuevos campos en los perfiles de usuario
Este proceso se divide en dos sencillos pasos:
Añadir los campos al formulario del perfil de usuario
Esto se hace 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.
Por tanto, si el campo a añadir puede ser editado por el propio usuario, y no por otros (ni siquiera admin) se debe utilizar show_user_profile
; si sólo puede ser editado por administradores se debe utilizar edit_user_profile
. Se utilizan los dos si se quiere que tanto el propio usuario como los administradores puedan editar la información.
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.
Ejemplo
Añadir 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 );
}
}
Añadir información de contacto: el filtro user_contactmethods
Aunque con el método anterior 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:
Si quieres añadir información de contacto adicional, por ejemplo redes sociales o número de teléfono, esta sección parece idónea, ¿no crees? Y lo bueno es que esta sección cuenta con un filtro, user_contactmethods, y añadir nuevos campos aquí es muy fácil. Por ejemplo, si queremos añadir los campos para los perfiles de Twitter, Facebook, Google Plus y LinkedIn
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;
}
Ahora aparecerá:
El único inconveniente del filtro user_contactmethods
es que no podemos definir una validación propia para cada campo añadido. Por ejemplo, no podremos validar una URL o un número teléfono, todos los campos añadidos aquí serán validados como campos de texto.
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 tablawp_usermeta
. Si se deja vacío se obtendrá un array con todos los campos meta del usuario en forma de paresmeta_key => meta_value
. - $single: (boolean) opcional. Por defecto tiene el valor
false
. Si$single
esfalse
se obtendrá un array con cada uno de los valores encontrados para el key; sisingle
estrue
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>
}
?>