Каждый раз когда я хочу написать какой-либо интересный мне пост, я всегда смотрю в гугле, что уже имеется по этой теме. Если интернет уже переполнен ею, то я стараюсь выбрать что-либо другое.
И мне показалось очень странным, что тема создания кастомной страницы профиля пользователей особо и не поднималась, если бегло пробежаться по результатам поиска, то можно увидеть уйму статей, которые должны помочь с произвольной формой регистрации или добавлением полей в профиль пользователя в админке, я об этом писал много лет назад здесь и здесь соответственно.
Даже на англоязычных сайтах я ничего не нашел (не знаю, может искал плохо), конечно некоторые решения имелись, но все они были плагинами.
Кое-что про шаблоны страниц я тоже уже писал, поэтому сейчас сразу перехожу к коду.
<?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>
Это и есть содержимое файла 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;
Если у вас есть вопросы по работе кода или предложения по его доработке, прошу вас проследовать в комментарии :)
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Вау как вовремя! :) Спасибо.
Миша, а может у тебя есть идеи как вывести создание постов? или уже есть готовая статья?
Например опубликовал запись + также есть возможность отредактировать или удалить его.
Такой ответ я думаю лучше оформить все в отдельный пост (вот тебе как идея для нового поста). Так как в инете ничего годного нет. А у тебя мануалы самые понятные :)
Форма создания постов для пользователей?:)
Да :)
Если ты про добавление постов с фронтенда, то хорошая статья есть на dontforget.pro. Там с аяксом, допполями и картинками
ВОУ ВОУ МИША!!!
СУПЕР!!!!
сейчас читаю мимолетом, приду с учебы более подробно все протестирую, посмотрю; возникнут вопросы и комментария напишу)))) (обязательно возникнут)
Спасибо Большое еще раз))
Пожалуйста:)
Миша спасибо большое еще раз
К сожалению только сейчас смог сесть и почитать и все сделать...пришлось уехать на некоторое время по делам и никак не мог добраться
Если я правильно понял мы создаем:
Шаблон страницы
А затем создаем второй файл (который подключили ранее в шаблоне (пункт 1) ) для того чтобы когда пользователь меняет информацию оно могла сохранится и обработаться так?
Это все работает отлично + я добавил плагин и теперь пользователь может менять аватарку опять же только в админке
как я не пытался понять и правильно сделать ( с помошью кода) не получается организовать замену аватарке так же как у вас отдельно на странице
Плюс хотел бы сделать чтобы (пример): пользователь А написал комментарий, пользователь Б нажал на его ник и его перекинуло в профиль пользователя А там аватарка его и инфа там город, телефон, может пару фоточек каких ну простой профиль такие отлично реализованы на DLE
Так, без аватарки поля хорошо работают, я правильно понял?
Относительно URL пользователей - там какой-то хук был вроде бы. Но думаю проще прямо в теме сменить и всё.
Попробуй плагин WP User Avatar там с помощью шорткода [avatar_upload] можешь загружать аватарки на front-end.
Ок сейчас просмотрю, спасибо.
Михаил, да и с аваторкой и и без поля работают все хорошо.
А как сделать, чтобы эта страница открывалась? За это вроде отвечает author.php
Я хочу сделать, чтобы при авторизации или регистрации, пользователя направляло на эту страницу, созданную с помощью шаблона и этого кода.
Ну по сути вам нужно сделать только редирект при входе, это можно сделать на хуке
login_redirect
.Этот код безопасен? Никакие проверки или функции очистки не требуются перед изменением пользователем значений?
Код безопасен, но функции очистки конечно не будет лишним добавить
Подскажи пожалуйста, как сделать, чтобы код срабатывал не из папки с шаблонами темы, а из папки с плагинами. Скажем, я создал папку "custom-accounts" и закинул туда эти два файла. Как сделать чтобы изменения отображались?