Как обновить user_email во фронтенде в WordPress 3.3?
Я использую следующий код, и все в профиле пользователя обновляется, кроме email пользователя.
В шаблоне:
global $current_user, $wp_roles;
get_currentuserinfo();
/* Загрузка файла регистрации */
require_once( ABSPATH . WPINC . '/registration.php' );
/* Если профиль был сохранен, обновляем профиль */
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {
/* Обновление пароля пользователя */
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;
}
/* Обновление информации пользователя */
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'] ) );
/* Редирект для отображения обновленной информации */
if ( !$error ) {
wp_redirect( get_permalink() . '?success' );
}
else {
wp_redirect( get_permalink() . '?error' );
}
exit;
}
get_header(); ?>
И на странице:
<?php if (stripos($_SERVER['REQUEST_URI'],'?success') !== false) { // ЭТО НАЧАЛО ?>
<div class="alert alert-success" align="center">Ваш профиль был успешно обновлен.</div>
<?php } ?>
<?php if (stripos($_SERVER['REQUEST_URI'],'?error') !== false) { // ЭТО НАЧАЛО ?>
<div class="alert alert-danger" align="center">Хмм, что-то пошло не так, и ваш профиль не был обновлен.</div>
<?php } ?>
<form method="post" id="adduser" action="<?php the_permalink(); ?>">
<table class="profile">
<tr>
<td class="left">
Имя
</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">
Фамилия
</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">
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">
Номер телефона
</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">
Почтовый адрес
</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">
Описание бизнеса
</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>

Для изменения email вам нужно использовать функцию wp_update_user()
, так как email является основными данными пользователя, а не пользовательскими метаданными. Код должен выглядеть примерно так:
$args = array(
'ID' => $current_user->id,
'user_email' => esc_attr( $_POST['user_email'] )
);
wp_update_user( $args );
Примечание: код не тестировался, но должен работать из коробки.

Упс, лол, спасибо, что заметили. Ответ обновлен с правильным количеством )

Не думаю, что здесь нужна esc_attr, так как параметры передаются напрямую в функцию wp_update_user(). Возможно, стоит заменить её на trim(), иначе будет раздражать, если из-за одного пробела пароль окажется неверным

Если вы планируете использовать этот код на фронтенде, я бы проверил, свободен ли email для использования. В противном случае вы создаёте уязвимость в безопасности.
if (isset( $_POST['email'])) {
// проверяем, действительно ли пользователь обновляет значение
if ($user_email != $_POST['email']) {
// проверяем, свободен ли email для использования
if (email_exists( $_POST['email'] )){
// Email уже существует, не обновляем значение.
// Можно вывести предупреждение.
} else {
$args = array(
'ID' => $current_user->id,
'user_email' => esc_attr( $_POST['email'] )
);
wp_update_user( $args );
}
}
}
