Главная Новости

Создаем страницу профиля пользователя в WordPress


Опубликовано: 01.09.2018

видео Создаем страницу профиля пользователя в WordPress

Как добавить пользователя в WordPress сайт

Каждый раз когда я хочу написать какой-либо интересный мне пост, я всегда смотрю в гугле, что уже имеется по этой теме. Если интернет уже переполнен ею, то я стараюсь выбрать что-либо другое.


Редактирование профиля в Wordpress

И мне показалось очень странным, что тема создания кастомной страницы профиля пользователей особо и не поднималась, если бегло пробежаться по результатам поиска, то можно увидеть уйму статей, которые должны помочь с произвольной формой регистрации или добавлением полей в профиль пользователя в админке, я об этом писал много лет назад здесь и здесь соответственно.

Даже на англоязычных сайтах я ничего не нашел (не знаю, может искал плохо), конечно некоторые решения имелись, но все они были плагинами.

Шаг 1. Шаблон страницы

Кое-что про шаблоны страниц я тоже уже писал, поэтому сейчас сразу перехожу к коду.

<?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_stylesheet_directory_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="text" name="city" placeholder="Город" value=" <?php echo get_user_meta ( $user_ID , 'city' , true ) ?> " /> <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>

Шаг 2. PHP-файл для обработки сохраняемых данных

Это и есть содержимое файла profile-update.php, который в прошлом шаге мы решили разместить прямо в папке с темой.

<?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 ;

Если у вас есть вопросы по работе кода или предложения по его доработке, прошу вас проследовать в комментарии ????

Почти все функции, использованные в коде статьи

site_url() — возвращает URL директории установки WordPress Функция возвращает URL директории, в которой установлен WordPress, обычно она совпадает с URL сайта. get_user_by() — позволяет получить информацию о пользователе, если известен или логин, или ID, или email Полезная функция, позволяющая получить недостающую информацию о пользователе. Например получить ID, если известен email или получить email, если известен логин. get_stylesheet_directory_uri() — как узнать абсолютный URL папки с темой Функция возвращает абсолютный URL папки с текущей темой (шаблоном) без слэша на конце. get_user_meta() — получает мета-параметры пользователя Функция возвращает значение указанного параметра (или массив всех параметров) для пользователя с заданным ID. update_user_meta() — обновляет значения параметров пользователя Обновляет параметр пользователя. Если параметр с указанным ключом не существует, то он будет добавлен. wp_set_password() — позволяет изменить пароль пользователя Функция меняет пароль пользователя с указанным в параметрах ID и сбрасывает его авторизацию. Ничего не возвращает. wp_signon() — авторизует пользователя на сайте Функция автоматически авторизует указанного пользователя на сайте и, в случае успеха, возвращает объект WP_User. is_email() — функция для проверки правильности указанного email адреса Если email указан неправильно - функция возвращает false, если правильно, то возвращает сам email адрес. email_exists() — существует ли на блоге пользователь, зарегистрированный под указанным email Условный тег, возвращающий ID пользователя, зарегистрированного под указанным email адресом, если под ним никто не регался, возвращает false.
rss