Ayer estuve platicando con un amigo en Samborns y me pregunto que si sabía o si podía agregar mas campos en los perfiles de usuarios de wordpress, no sabía hacerlo pero supuse que si se podía porque mientras exista programación es OBVIO que se pueden hacer muchísimas cosas :).
Y fue el día de hoy que mi curiosidad me llevo a investigar y me metí a codex para leer sobre cual era el proceso de registro de usuarios, los archivos relacionados que se utilizan y otras cosillas que me fueran útiles para insertar mas campos en los perfiles.
Como resultado de esa investigación he hecho este minitutorial en el cual agregaremos un campo personalizado en los perfiles de usuarios de wordpress ( colaboradores, editores, administradores, subscriptores) llamado educación, espero les agrade.
1.-Entramos a nuestra base de datos desde PhpMyadmin o el manejador de BD que utilicemos
buscamos la tabla wp_users y accesamos a esa tabla.
-En ella podemos ver ID, user_login y otros campos para los usuarios.

2.- Agregar campo nuevo: Ahora vamos a crear un nuevo campo , esto lo podemos hacer de dos formas, la primera es de forma gráfica.
Seleccionamos agregar un campo al final de la tabla y damos click en continuar

llenamos los campos y damos click en salvar/guardar.

La segunda forma de hacerlo es con SQL así:
ALTER TABLE `wp_users` ADD `educacion` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; |
De cualquiera de las 2 formas debe quedarnos algo así(no!, mas bien, debe quedar así).

3.- Localizar Archivos a modificar: Una ves agregado el nuevo campo en la base de datos ubicamos los siguientes archivos que vamos a modificar.
- /wp-includes/registration.php
- /wp-admin/user-edit.php
- /wp-admin/user-new.php
- /wp-admin/includes/user.php
4.- Modificar el archivo registration para insertar la información del campo nuevo en la base de datos: Abrimos el archivo registration.php, buscamos la función wp_insert_user($userdata) y buscamos estas lineas:
if ( empty($last_name) ) $last_name = ''; $last_name = apply_filters('pre_user_last_name', $last_name); |
Y debajo colocamos lo siguiente:
if ( empty($educacion) ) $educacion = ”; $educacion = apply_filters('pre_educacion', $educacion); |
Dentro del mismo archivo buscamos la siguiente linea
$data = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name', 'user_registered' ); |
y reemplazamos por esta donde enviamos la información del campo educación.
$data = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name','educacion', 'user_registered' ); |
Ahora solo buscamos la siguiente linea para que wordpress actualice los datos y los inserte en la BD
Buscamos esta linea:
update_usermeta( $user_id, 'nickname', $nickname ); |
y debajo de ella colocamos la siguiente linea:
update_usermeta( $educacion, 'educacion', $educacion ); |
Guardamos y pasamos al siguiente archivo.
5.-Editar el formulario del archivo user-edit para editar los datos de los usuarios: Abrimos el archivo user-edit.php para agregar al perfil el campo nuevo dentro del formulario de usuarios y buscamos las siguientes lineas:
<tr>
<th><label for="last_name"><?php _e('Last name') ?></label></th>
<td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr($profileuser->last_name) ?>" class="regular-text" /></td>
</tr> |
Y agregamos debajo de ellas el siguiente input:
<tr>
<th><label for="educacion">Educación</label></th>
<td><input type="text" name="educacion" id="educacion" value="<?php echo $profileuser->educacion ?>" /></td>
</tr> |
Guardamos los cambios y nos pasamos al siguiente archivo
6.-Agregar el campo nuevo en el registro de usuarios user-new.php:Ahora agregamos el campo nuevo en el formulario donde creamos nuevos usuarios.
Buscamos las siguientes lineas
<tr class="form-field">
<th scope="row"><label for="last_name"><?php _e('Last Name') ?> </label></th>
<td><input name="last_name" type="text" id="last_name" value="<?php echo esc_attr($new_user_lastname); ?>" /></td>
</tr> |
Y debajo de ellas insertamos nuestro nuevo campo
<tr class="form-field">
<th scope="row"><label for="educacion"><?php _e('educacion') ?> </label></th>
<td><input name="educacion" type="text" id="educacion" value="<?php echo esc_attr($new_user_educacion); ?>" /></td>
</tr> |
7.- Por ultimo editamos el archivo user.php con el que vamos a guardar el nuevo valor de las variables.
Buscamos estas lineas
if ( isset( $_POST['nickname'] )) $user->nickname = esc_html( trim( $_POST['nickname'] )); |
y debajo de ellas colocamos lo siguiente
if ( isset( $_POST['educacion'] )) $user->educacion = esc_html( trim( $_POST['educacion'] )); |
Ahora agregamos a la funcion get_user_to_edit() la siguiente linea para obtener la información del nuevo campo en el perfil.
Buscamos la siguiente linea
$user->display_name = esc_attr($user->display_name); |
y debajo de ella agregamos lo siguiente:
$user->educacion = esc_attr($user->educacion); |
8.- Subimos todos los archivos modificados en las carpetas donde les corresponde.
- /wp-includes/registration.php
- /wp-admin/user-edit.php
- /wp-admin/user-new.php
- /wp-admin/includes/user.php
Y ahora cada que un usuario entre a su perfil tendrá un nuevo campo como este.

Y eso es todo, espero les sirva y cualquier error que tengan me lo pueden decir, pero a la hora de hacer esto yo no tuve ningún problema y por eso lo publique. 🙂
Lo desventaja de esto es que modifica archivos desde la estructura de wordpress, si se hace un update automáticamente se reemplazaran los archivos modificados y desaparecerá el campo agregado, por lo que tendríamos que repetir los mismos pasos ya explicados(menos el primero).

[…] This post was mentioned on Twitter by el Diario Colectivo. el Diario Colectivo said: How to: Agregar mas campos en el perfil de usuarios de wordpress http://ff.im/-9tHCx […]
Jejeje, y las miles de preguntas que te seguiré cuestionando hasta que llegue a entender todos los poderes místicos del WP… (?)
Bueno, igual entre tu y Pablo (kabytes.com) me ilustrarán…, yo con la parte visual y creativa no tengo problema, pero los códigos y bases de datos son mi dilema universal…
Saludos dani 😉
Los unicos limites son la imaginacion y el lenguaje de programacion mas nuevo que exista XD…
De ahi en fuera se hacen maravillas jaja
Buen tutorial 😛
Cuando quieras Miguel, a mi todo eso me sirve para aprender, aun hay muchas cosas que no se hacer :P.
LegendDx: Sí claro!.. hay cosas que también dependen de nuestras habilidades, porque imaginación a veces sobra jaja 😛
Muy detallado el tutorial, bien loco. Lo único que me parece un poco equivocado, es tener que tocar los archivos propios del Core de WordPress.. cuando el desarrollador necesite actualizar de version de WP. tendrá que volver a modificar estos archivos.
Alguien sabe como hacer lo mismo pero sin tener que tocar los archivos del Core? directamente creando un plugin??
Existe el hook before_registration o algo asi?..
Saludos!
Si, eso mismo es lo que explico al final, de hecho he estado investigando como agregar campos utilizando el archivo funtions.php de los themes y que afecte automáticamente a los archivos del core de wp.
Esta fue la opción mas rápida que se me ocurrio 😛
hola, me parece muy interesante. yo tengo la misma necesidad pero en mi caso es insertar un radio butom para insertar una opcion de SI o NO. como podría hacerlo?
Gracias de antemano
Escael, en el siguiente código podrás ver como se agregan.
Para los que buscan agregar mas campos en el perfil de los usuarios en wordpress, este código les servirá de mucha ayuda, no lo hice yo, pero lo utilice en un blog y obviamente lo tuve que editar a como lo quería.
Para agregar mas campos solo pegan este código en el archivo funtions.php de su theme y enseguida tendrán mas campos en el perfil.
<pre lang="php">
<?php
add_action( 'show_user_profile', 'campos_nuevos' );
add_action( 'edit_user_profile', 'campos_nuevos' );
function campos_nuevos( $user ) { ?>
<h3><?php _e("Información extra", "blank"); ?></h3>
<table class="form-table">
<tr>
<th><label for="postalcode"><?php _e("twitter"); ?></label></th>
<td>
<input type="text" name="postalcode" id="postalcode" value="<?php echo esc_attr( get_the_author_meta( 'twitter', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description"><?php _e("Escribe tu twitter."); ?></span>
</td>
</tr>
<tr>
<th><label for="postalcode"><?php _e("Eres Mexicano?"); ?></label></th>
<td>
<input type="radio" name="nacionalidad" value="yes" /><label>Si</label>
<input type="radio" name="nacionalidad" value="no" /><label>No</label></td>
</tr>
</table>
<?php }
add_action( 'personal_options_update', 'salvar_informacion' );
add_action( 'edit_user_profile_update', 'salvar_informacion' );
function salvar_informacion( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) ) { return false; }
update_usermeta( $user_id, 'twitter', $_POST['twitter'] );
update_usermeta( $user_id, 'nacionalidad', $_POST['nacionalidad'] );
}
?>
</pre>
De esta forma se evitan modificar los archivos internos de wordpress, OJO! solo funciona en el theme en el que agreguen este código en el archivo funtions.php.
Y debe aparecer algo así
<img src="http://lh5.ggpht.com/_lKXHiMxyf7o/S7MnzQeQylI/AAAAAAAAAwk/puJcmvtiv8A/twitter.JPG" alt="imagen twitter" />
Para llamar el contenido de los campos en cualquier parte del blog se hace así
<pre lang="php">
<?php the_author_meta('twitter'); ?>
</pre>
Esta es mejor opción que la que escribí en esta entrada.
Saludos! y espero les sirva.
En el código anterior quiten las partes de
<strong><pre lang="php"></strong>
<strong></pre></strong>
Lo que pasa es que mi blog filtra el código en los comentarios.
Hola alguien sabría hacer lo mismo pero con las propiedades de las categorías en lugar de las de un usuario.
gracias
Exactamente que es lo que necesitas hacer?
Bueno la primera opcion es la necesaria si queremos que los campos aparezcan a la hora de ingresar un nuevo usuario y eso es lo que yo ando buscando. Todos las entradas encontradas lo realizan de manera que aparecen los ampos solo en la actualizacion y no al ingresar u nuevo usuario. Muchas gracias por la informacion me sirvio de mucho.
Hola, yo quiero agregar un select dependiente, del tipo seleccionas un pais y se despliegan estados. Lo prodria lograr con este código ? O hay algun plugin que lo haga ?.
Gracias.
Te sirve este codigo que publique en los comentarios.
http://soycachanilla.com/2009/10/how-to-agregar-mas-campos-en-el-perfil-de-usuarios-de-wordpress.html/comment-page-1/#comment-8373
Es mas practico, con respecto a tu pregunta creo que si hay, aunque la verdad nunca he buscado.
Hola en estosmomento trabajo con wp 3 y en cuento al primer paso de editar el archivo register.php, veo que este no tiene nada de codigo… en ese caso en que archivo lo busco o como hago??…
muchas gracias
Hola estuve viendo tu tutorial pero tengo unos inconvenientes para realizarlo en wp 3.5.1
1. el archivo registration.php solo tiene este codigo:
display_name = esc_attr($user->display_name);
y no se puede poner la que adicionaste.
El campo efectivamente me aparece en el perfil pero a la hora de guardar o actualizar la info no se me guarda.
saludos
Hola
Yo tenia ese mismo problema y con este codigo lo solucioné, espero te funcione.
Nombre
<input id="user_email" class="input-text" type="imput" tabindex="20? size="25? value="” name=”first”/>
Apellidos
<input id="user_email" class="input-text" type="imput" tabindex="20? size="25? value="” name=”last”/>
add(‘empty_realname’, ‘ERROR: Please Enter in First Name’);
} else {
$firstname = $_POST[‘first’];
}
if ($_POST[‘last’] == ”) {
$errors->add(‘empty_realname’, ‘ERROR: Please Enter in Last Name’);
} else {
$firstname = $_POST[‘last’];
}
}
function register_extra_fields($user_id, $password=”, $meta=array()) {
$userdata = array();
$userdata[‘ID’] = $user_id;
$userdata[‘first_name’] = $_POST[‘first’];
$userdata[‘last_name’] = $_POST[‘last’];
$userdata[‘cell’] = ‘12547875’;
wp_update_user($userdata);
}
/* Campos adicionales en la administracio de usuarios wordpress*/
add_action( ‘show_user_profile’, ‘extra_user_profile_fields’ );
add_action( ‘edit_user_profile’, ‘extra_user_profile_fields’ );
function extra_user_profile_fields( $user ) { ?>
<input type="text" name="cedula" id="cedula" value="ID ) ); ?>” class=”regular-text” />
<input type="text" name="provincia" id="provincia" value="ID ) ); ?>” class=”regular-text” />
<input type="text" name="ciudad" id="ciudad" value="ID ) ); ?>” class=”regular-text” />
<input type="text" name="celular" id="celular" value="ID ) ); ?>” class=”regular-text” />
<input type="text" name="fecha_nacimiento" id="fecha_nacimiento" value="ID ) ); ?>” class=”regular-text” />
*
<input type="text" class="input-text" name="cedula" id="cedula" value="”/>
*
<input type="text" class="input-text" name="provincia" id="provincia" value="”/>
*
<input type="text" class="input-text" name="ciudad" id="ciudad" value="”/>
*
<input type="text" class="input-text" name="celular" id="celular" value="”/>
*
<input type="text" class="input-text" name="fecha_nacimiento" id="fecha_nacimiento" value="”/>
<?php }
add_action('user_register', 'save_extra_user_register_fields');
function save_extra_user_register_fields( $user_id ) {
update_usermeta( $user_id, 'cedula', $_POST['cedula'] );
update_usermeta( $user_id, 'ciudad', $_POST['ciudad'] );
update_usermeta( $user_id, 'provincia', $_POST['provincia'] );
update_usermeta( $user_id, 'celular', $_POST['celular'] );
update_usermeta( $user_id, 'fecha_nacimiento', $_POST['fecha_nacimiento'] );
}
Aquí puedes adicionar todos los campos que desees
Saludos