¿Cómo actualizar user_email en el front-end en WordPress 3.3?
Estoy usando el siguiente código y todo en el perfil de usuario se actualiza excepto el email del usuario.
En la plantilla:
global $current_user, $wp_roles;
get_currentuserinfo();
/* Cargar el archivo de registro. */
require_once( ABSPATH . WPINC . '/registration.php' );
/* Si el perfil fue guardado, actualizar perfil. */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {
/* Actualizar contraseña de usuario. */
if ( !empty($_POST['pass1'] ) && !empty( $_POST['pass2'] ) ) {
if ( $_POST['pass1'] == $_POST['pass2'] )
wp_update_user( array( 'ID' => $current_user->id, 'user_pass' => esc_attr( $_POST['pass1'] ) ) );
else
wp_redirect( get_permalink() . '?error' );
exit;
}
/* Actualizar información del usuario. */
if ( !empty( $_POST['first_name'] ) )
update_user_meta( $current_user->id, 'first_name', esc_attr( $_POST['first_name'] ) );
if ( !empty( $_POST['last_name'] ) )
update_user_meta($current_user->id, 'last_name', esc_attr( $_POST['last_name'] ) );
if ( !empty( $_POST['user_email'] ) )
update_user_meta($current_user->id, 'user_email', esc_attr( $_POST['user_email'] ) );
if ( !empty( $_POST['cell_phone'] ) )
update_user_meta( $current_user->id, 'cell_phone', esc_attr( $_POST['cell_phone'] ) );
if ( !empty( $_POST['mailing_address'] ) )
update_user_meta( $current_user->id, 'mailing_address', esc_attr( $_POST['mailing_address'] ) );
if ( !empty( $_POST['description'] ) )
update_user_meta( $current_user->id, 'description', esc_attr( $_POST['description'] ) );
/* Redireccionar para mostrar la información actualizada. */
if ( !$error ) {
wp_redirect( get_permalink() . '?success' );
}
else {
wp_redirect( get_permalink() . '?error' );
}
exit;
}
get_header(); ?>
Y en la página:
<?php if (stripos($_SERVER['REQUEST_URI'],'?success') !== false) { // ESTE ES EL INICIO ?>
<div class="alert alert-success" align="center">Tu perfil se actualizó correctamente.</div>
<?php } ?>
<?php if (stripos($_SERVER['REQUEST_URI'],'?error') !== false) { // ESTE ES EL INICIO ?>
<div class="alert alert-danger" align="center">Hmm, algo salió mal y tu perfil no fue actualizado.</div>
<?php } ?>
<form method="post" id="adduser" action="<?php the_permalink(); ?>">
<table class="profile">
<tr>
<td class="left">
Nombre
</td>
<td class="right">
<input type="text" name="first_name" id="first_name" value="<?php global $current_user; get_currentuserinfo(); echo $current_user->first_name; ?>" />
</td>
</tr>
<tr>
<td class="left">
Apellido
</td>
<td class="right">
<input type="text" name="last_name" id="last_name" value="<?php global $current_user; get_currentuserinfo(); echo $current_user->last_name; ?>" />
</td>
</tr>
<tr>
<td class="left">
Dirección de Email
</td>
<td class="right">
<input type="text" name="user_email" id="user_email" value="<?php global $current_user; get_currentuserinfo(); echo $current_user->user_email; ?>" />
</td>
</tr>
<tr>
<td class="left">
Número de Teléfono
</td>
<td class="right">
<input type="text" name="cell_phone" id="cell_phone" value="<?php global $current_user; get_currentuserinfo(); echo $current_user->cell_phone; ?>" />
</td>
</tr>
<tr>
<td class="left">
Dirección Postal
</td>
<td class="right">
<textarea name="mailing_address" id="mailing_address" rows="4" cols="30" class="regular-text"><?php global $current_user; get_currentuserinfo(); echo $current_user->mailing_address; ?></textarea>
</td>
</tr>
<tr>
<td class="left">
Descripción del Negocio
</td>
<td class="right">
<textarea name="description" id="description" rows="4" cols="30" class="regular-text"><?php global $current_user; get_currentuserinfo(); echo $current_user->description; ?></textarea>
</td>
</tr>
</table>
<p class="form-submit">
<?php echo $referer; ?>
<input name="updateuser" type="submit" id="updateuser" class="submit button" value="update-user" />
<?php wp_nonce_field( 'update-user' ) ?>
<input name="action" type="hidden" id="action" value="Update" />
</p>
</form>

Necesitas usar wp_update_user()
para el correo electrónico, ya que no es un meta-dato de usuario sino información central del usuario. El código debería verse algo así:
$args = array(
'ID' => $current_user->id,
'user_email' => esc_attr( $_POST['user_email'] )
);
wp_update_user( $args );
Nota: esto no ha sido probado, pero debería funcionar directamente.

Un paréntesis de más, por lo demás funcionó perfectamente. ¡Muchas gracias!

Ups, jaja, gracias por detectarlo. Respuesta actualizada para tener el número correcto de )

No creo que esc_attr deba estar ahí porque estás pasando parámetros directamente a la función wp_update_user(). Tal vez deberías reemplazarlo con trim(), de lo contrario sería molesto si un solo espacio hace que una contraseña sea incorrecta

Si planeas usar este código en el frontend, recomiendo verificar si el correo electrónico está disponible para usar. De lo contrario, estarías creando un agujero de seguridad.
if (isset( $_POST['email'])) {
// Verificar si el usuario está realmente actualizando el valor
if ($user_email != $_POST['email']) {
// Verificar si el correo está disponible
if (email_exists( $_POST['email'] )){
// El correo existe, no actualizar el valor.
// Podrías mostrar una advertencia.
} else {
$args = array(
'ID' => $current_user->id,
'user_email' => esc_attr( $_POST['email'] )
);
wp_update_user( $args );
}
}
}
