Смена пароля WP

159
25 февраля 2019, 14:30

Реализую личный кабинет для пользователя, а точнее, смену данных и пароля в WordPress, но скрипт не выполняется, перебрасывает на главную страницу и все, никаких ошибок тоже не вылазит, подскажите, в чем проблема.

Это файл личного кабинета

    <?php
/*
 * Template name: Шаблон профиля пользователя
 */
global $user_ID;
// если пользователь не авторизован, отправляем его на страницу входа
if( !$user_ID ) {
    header('location:' . site_url() . '/wp-login.php');
    exit;
} else {
    $userdata = get_user_by( 'id', $user_ID );
}
?><html>
<body>
<?php
// после сохранения профиля и смены пароля понадобятся уведомления
// если уведомлений больше двух, то оптимальнее их будет вывести через switch
if( isset($_GET['status']) ) :
    switch( $_GET['status'] ) :
        case 'ok':{
            echo '<div class="success">Сохранено.</div>';
            break;
        }
        case 'exist':{
            echo '<div class="error">Пользователь с указанным email уже существует.</div>';
            break;
        }
        case 'short':{
            echo '<div class="error">Пароль слишком короткий.</div>';
            break;
        }
        case 'mismatch':{
            echo '<div class="error">Пароли не совпадают.</div>';
            break;
        }
        case 'wrong':{
            echo '<div class="error">Старый пароль неверен.</div>';
            break;
        }
        case 'required':{
            echo '<div class="error">Пожалуйста, заполните все обязательные поля.</div>';
            break;
        }
    endswitch;
endif;
// profile-update.php - это файл, который находится в папке с темой и обрабатывает сохранение, его содержимое будет в следующем шаге
?>
<form action="<?php echo get_theme_file_uri() ?>/profile-update.php" method="POST">
    <input type="text" name="first_name" placeholder="Имя" value="<?php echo $userdata->first_name ?>" />
    <input type="text" name="last_name" placeholder="Фамилия" value="<?php echo $userdata->last_name ?>" />
    <input type="email" name="email" placeholder="Email" value="<?php echo $userdata->user_email ?>" />
    <input type="password" name="pwd1" placeholder="Старый пароль" />
    <input type="password" name="pwd2" placeholder="Новый пароль" />
    <input type="password" name="pwd3" placeholder="Повторите новый пароль" />
    <button>Сохранить</button>
</form>
</body>
</html>
<?php

Это файл обработки данных

// $_SERVER['HTTP_REFERER'] - полный URL страницы, откуда пришел пользователь
// $url[0] - без GET параметров
// это нам понадобится для правильных редиректов
$url = explode("?",$_SERVER['HTTP_REFERER']);
// подключаем WordPress
// тут указан правильный путь, если profile-update.php находится непосредственно в папке с темой
require_once( dirname(__FILE__) . '/../../../wp-load.php' );
// если не авторизован, просто выходим из файла
if( !is_user_logged_in() ) exit;
// получаем объект пользователя с необходимыми данными
$user_ID = get_current_user_id();
$user = get_user_by( 'id', $user_ID );

// сначала обработаем пароли, ведь если при сохранении пользователь ничего не указал ни в одном поле пароля, то пропускаем эту часть
if( $_POST['pwd1'] || $_POST['pwd2'] || $_POST['pwd3'] ) {
    // при этом пользователь должен заполнить все поля
    if( $_POST['pwd1'] && $_POST['pwd2'] && $_POST['pwd3'] ) {
        // сначала проверяем соответствие нового пароля и его подтверждения
        if( $_POST['pwd2'] == $_POST['pwd3'] ){
            // пароль из двух символов нам не нужен, минимум 8
            if( strlen( $_POST['pwd2'] ) < 8 ) {
                // если слишком короткий - перенаправляем
                header('location:' . $url[0] . '?status=short');
                exit;
            }
            // и самое главное - проверяем, правильно ли указан старый пароль
            if( wp_check_password( $_POST['pwd1'], $user->data->user_pass, $user->ID) ) {
                // если да, меняем на новый и заново авторизуем пользователя
                wp_set_password( $_POST['pwd2'], $user_ID );
                $creds['user_login'] = $user->user_login;
                $creds['user_password'] = $_POST['pwd2'];
                $creds['remember'] = true;
                $user = wp_signon( $creds, false );
            } else {
                // если нет, перенаправляем на ошибку
                header('location:' . $url[0] . '?status=wrong');
                exit;
            }
        } else {
            // новый пароль и его подтверждение не соответствуют друг другу
            header('location:' . $url[0] . '?status=mismatch');
            exit;
        }
    } else {
        // не все поля заполнены - перенеправляем
        header('location:' . $url[0] . '?status=required');
        exit;
    }
}
// допустим, что Имя, Фамилия и Емайл - обязательные поля, Город - не обязательное
if( $_POST['first_name'] && $_POST['last_name'] && is_email($_POST['email']) ) {
    // если пользователь указал новый емайл, а кто-то уже под ним зареган - отправляем на ошибку
    if( email_exists( $_POST['email'] ) && $_POST['email'] != $user->user_email ) {
        header('location:' . $url[0] . '?status=exist');
        exit;
    }
    // обновляем данные пользователя
    wp_update_user( array( 
            'ID' => $user_ID, 
            'user_email' => $_POST['email'],
            'first_name' => $_POST['first_name'],
            'last_name' => $_POST['last_name'],
            'display_name' => $_POST['first_name'] . ' ' . $_POST['last_name'] ));
    // ну и город не забываем обновить
    update_user_meta( $user_ID, 'city', $_POST['city']);
} else {
    // не все поля заполнены - перенеправляем
    header('location:' . $url[0] . '?status=required');
    exit;
}

// если выполнение кода дошло до сюда, то следовательно всё ок
header('location:' . $url[0] . '?status=ok');
exit;
READ ALSO
Laravel. Разница между фасадами и статическими методами

Laravel. Разница между фасадами и статическими методами

Не могу окончательно понять когда лучше и практичнее использовать фасад или статический метод

157
Mail.ru не определяет меня как браузер

Mail.ru не определяет меня как браузер

Всем привет, отправлю запрос curl , но майл считает меня старым браузером и выдает мне не тот контент который отображается в браузере на самом...

153
Добавить скрипт ExtJS в Zend

Добавить скрипт ExtJS в Zend

Написал модуль на ZendСтруктура модуля:

133
Подскажите как вывести из бд название последней таблицы?

Подскажите как вывести из бд название последней таблицы?

В бд есть множество таблиц с именами-датамиНапример 01102018 или 07102018

180