Contents
Introducción
Este tutorial explica, con todo lujo de detalles, cómo crear un campo personalizado en el perfil de usuario de WordPress usando PHP. Verás desde las buenas prácticas (registro del metadato, sanitización, verificación de permisos y nonces) hasta ejemplos listos para usar en un plugin o en el archivo functions.php de tu tema. Todos los fragmentos de código incluyen comentarios y uso correcto de las API de WordPress.
Requisitos previos
- Conocimientos básicos de PHP y WordPress.
- Acceso al archivo functions.php del tema o la posibilidad de crear un plugin sencillo.
- Versión de WordPress relativamente moderna (4.9 recomendable).
Concepto clave
Los datos adicionales de un usuario se guardan como user meta (tabla wp_usermeta) usando las funciones get_user_meta() y update_user_meta(). Para integrar de forma correcta con la administración y la seguridad, usamos los hooks adecuados de WordPress para mostrar y guardar campos en la pantalla de perfil.
Flujo que implementaremos
- Registrar el meta (opcional pero recomendado para controlar sanitización/REST).
- Mostrar el campo en las pantallas de perfil (show_user_profile y edit_user_profile).
- Validar y guardar el valor al actualizar (personal_options_update y edit_user_profile_update).
- Asegurar permisos y usar nonce para proteger la acción.
- Ejemplos adicionales: agregar columna en la lista de usuarios y mostrar el valor en el front-end.
1) Registrar el meta (opcional pero recomendable)
Registrar el meta te permite declarar sanitización y que esté disponible desde la REST API si lo necesitas. Úsalo en el hook init.
string, single => true, sanitize_callback => sanitize_text_field, auth_callback => function() { // Permitir acceso de lectura/escritura solo a usuarios con la capacidad edit_users return current_user_can( edit_users ) }, ) ) } add_action( init, mi_plugin_registrar_usermeta ) ?>
2) Mostrar el campo en la pantalla de perfil
Usaremos los hooks show_user_profile y edit_user_profile para añadir un campo en la interfaz de edición del perfil.
ID, telefono, true ) // Campo nonce para seguridad wp_nonce_field( mi_plugin_guardar_telefono_nonce, mi_plugin_guardar_telefono_nonce_field ) ?> lth3gtInformación adicionallt/h3gt lttable class=form-tablegt lttrgt ltthgtltlabel for=telefonogtTeléfonolt/labelgtlt/thgt lttdgt ltinput type=text name=telefono id=telefono value= class=regular-text /gt ltp class=descriptiongtIntroduce un teléfono de contacto.lt/pgt lt/tdgt lt/trgt lt/tablegt lt?php } add_action( show_user_profile, mi_plugin_mostrar_campo_telefono ) add_action( edit_user_profile, mi_plugin_mostrar_campo_telefono ) ?>
3) Guardar el valor del campo (con verificaciones)
Al guardar, validamos la capacidad del usuario que realiza el cambio, verificamos el nonce y sanitizamos el dato antes de guardarlo con update_user_meta.
Explicación de las comprobaciones
- current_user_can(edit_user, user_id): asegura que el usuario que actualiza tiene permiso para editar aquel perfil.
- wp_verify_nonce: evita CSRF y acciones no autorizadas.
- sanitize_text_field y wp_unslash: sanitizan y limpian el dato antes de guardarlo.
4) Establecer un valor por defecto al registrarse (opcional)
Si quieres un valor inicial al crear un nuevo usuario, usa el hook user_register.
5) Mostrar el valor en el front-end
Para mostrar el valor en el front-end, obtén el user meta con get_user_meta() y escapa el valor antes de imprimirlo.
6) Añadir una columna en la lista de usuarios (wp-admin)
Para ver el teléfono directamente en la tabla de usuarios del admin, añade una columna personalizada y rellénala con el valor.
7) Ejemplo completo como plugin (archivo único)
A continuación tienes un ejemplo compacto que agrupa todo en un único archivo. Puedes crear un plugin con este archivo (p. ej. mi-plugin-usuario.php) y activarlo.
string, single => true, sanitize_callback => sanitize_text_field, auth_callback => function() { return current_user_can( edit_users ) }, ) ) } ) // Mostrar campo en perfil function mp_mostrar_campo_telefono( user ) { telefono = get_user_meta( user->ID, telefono, true ) wp_nonce_field( mp_guardar_telefono_nonce, mp_guardar_telefono_nonce_field ) ?> lth3gtInformación adicionallt/h3gt lttable class=form-tablegt lttrgt ltthgtltlabel for=telefonogtTeléfonolt/labelgtlt/thgt lttdgt ltinput type=text name=telefono id=telefono value= class=regular-text /gt ltp class=descriptiongtTeléfono de contacto.lt/pgt lt/tdgt lt/trgt lt/tablegt lt?php } add_action( show_user_profile, mp_mostrar_campo_telefono ) add_action( edit_user_profile, mp_mostrar_campo_telefono ) // Guardar campo function mp_guardar_campo_telefono( user_id ) { if ( ! current_user_can( edit_user, user_id ) ) { return false } if ( ! isset( _POST[mp_guardar_telefono_nonce_field] ) ! wp_verify_nonce( _POST[mp_guardar_telefono_nonce_field], mp_guardar_telefono_nonce ) ) { return false } if ( isset( _POST[telefono] ) ) { telefono = sanitize_text_field( wp_unslash( _POST[telefono] ) ) update_user_meta( user_id, telefono, telefono ) } else { delete_user_meta( user_id, telefono ) } } add_action( personal_options_update, mp_guardar_campo_telefono ) add_action( edit_user_profile_update, mp_guardar_campo_telefono ) // Columna en la tabla de usuarios add_filter( manage_users_columns, function( columns ) { columns[telefono] = Teléfono return columns } ) add_action( manage_users_custom_column, function( value, column_name, user_id ) { if ( telefono === column_name ) { return esc_html( get_user_meta( user_id, telefono, true ) ) } return value }, 10, 3 ) ?>
Buenas prácticas y consideraciones
- Nombres de meta: usa prefijos o nombres claros (ej. mi_plugin_telefono o telefono) para evitar colisiones con otros plugins.
- Sanitización: siempre sanitiza los datos entrantes (sanitize_text_field, sanitize_email, esc_url_raw, etc.).
- Escapado: cuando muestres datos en HTML, utiliza esc_html() o esc_attr() según corresponda.
- Permisos: comprueba current_user_can() antes de actualizar datos para evitar elevación de privilegios.
- Nonce: añade y verifica nonces para proteger contra CSRF.
- REST API: si quieres exponer o editar el campo via REST, registra el meta con show_in_rest y schema.
Ejemplo avanzado: exponer el campo en REST
Si necesitas que el campo esté disponible en la REST API, añade show_in_rest en el registro del meta.
string, single => true, sanitize_callback => sanitize_text_field, show_in_rest => true, auth_callback => function() { return current_user_can( edit_users ) }, ) ) ?>
Resumen final
Crear un campo personalizado en el perfil de usuario implica:
- Definir y registrar el meta (opcional pero recomendado).
- Mostrar el campo en las pantallas de edición con los hooks adecuados.
- Validar permisos y nonces, sanitizar y guardar con update_user_meta.
- Escapar salidas y seguir buenas prácticas de seguridad.
Con los ejemplos proporcionados tienes todo lo necesario para implementar, ampliar y asegurar un campo personalizado en el perfil de usuario de WordPress usando PHP.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |