Регистрация в вордпресс без плагина

Posted by

 

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

Для осуществления задуманного вам потребуется сделать несколько вставок в файл функций functions.php, в подключаемые файлы с расширением .js и .css. Проделав несколько несложных шагов, вы сможете сделать форму регистрации без чтения документации к разным плагинам, которые иногда работают не так как бы хотелось.  Поехали …

Первый шаг: создание формы

Код который сделал я выглядит так:

<form action="#" method="post" name="step-register-1" class="form">
	<input type="hidden" name="action" value="create_user">	
	<p><input type="text" name="user_name" placeholder="Имя" required=""></p>
	<p><input type="text" name="user_last_name" placeholder="Фамилия" required=""></p>
	<p><input type="email" name="user_email" placeholder="E-mail" required=""></p>
	<p><input type="tel" name="user_tel" placeholder="Телефон" required=""></p>	
	<p><input type="password" name="user_pass" placeholder="Пароль" required=""></p>
	<p><input type="password" name="user_re_pass" placeholder="Повторите пароль" required=""></p>
	<p><button class="bts bts-primary" type="submit">Начать регистрацию</button></p>
</form>

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

Стилизация формы

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

Второй шаг: Обработка отправки формы

Следующий пример кода, который я приведу необходимо будет вставить в файл functions.php.

add_action( 'wp_ajax_create_user', 'create_user_callback' );
add_action( 'wp_ajax_nopriv_create_user', 'create_user_callback' );
function create_user_callback() {
	require_once ABSPATH . WPINC . '/registration.php';
	$message          = [];
	$post             = array_map( 'sanitize_text_field', $_POST );
	$first_name       = $post['user_name'];
	$last_name        = $post['user_last_name'];
	$user_password    = trim( $post['user_pass'] );
	$user_re_password = $post['user_re_pass'];
	$phone_number     = $post['user_tel'];
	$user_email       = sanitize_email( $post['user_email'] );
	// проверка на заполненость
	if ( empty( $first_name ) || empty( $last_name ) || empty( $user_password ) || empty( $phone_number ) || empty( $user_email ) ) {
		echo json_encode( [
			'status'  => 0,
			'message' => 'Все поля должны быть заполнены.'
		] );
		wp_die();
	}
	// проверка почтового адреса
	if ( ! is_email( $user_email ) ) {
		echo json_encode( [
			'status'  => 0,
			'message' => 'Введённый вами e-mail в неправильном формате'
		] );
		wp_die();
	}
	// проверка существования почтового адреса в базе
	if ( email_exists( $user_email ) ) {
		echo json_encode( [
			'status'  => 0,
			'message' => 'Введённый вами e-mail уже кем то используется.'
		] );
		wp_die();
	}
	// проверка пароля на сложность
	if ( ! preg_match( "/^[\da-zA-Z_]{5,12}$/", $user_password ) ) {
		echo json_encode( [
			'status'  => 0,
			'message' => 'Пароль может содержать только английские буквы, цифры, дефис и подчеркивание. Длина пароля от 5 до 12 символов.'
		] );
		wp_die();
	}
	//	проверяем совпадение пароля и повтора пароля
	if ( $user_password != $user_re_password ) {
		echo json_encode( [
			'status'  => 0,
			'message' => 'Пароль и повтор пароля не совпадают.'
		] );
		wp_die();
	}
	// создание пользователя
	$user_id = wp_create_user( $user_email, $user_password, $user_email );
	if ( $user_id ) {
		// создание текста писем юзеру и админу
		$subject       = sprintf( 'Начало регистрации %s %s  на сайте', $first_name, $last_name );
		$message_admin = sprintf( '<h3>Данные нового участника</h3> <br> Имя: %s <br> Фамилия: %s <br> Телефон: %s <br> E-mail: %s', $first_name, $last_name, $phone_number, $user_email );
		$message_user  = sprintf( '<h3>Здравствуйте %$1s</h3> <br><p>Вы начали регистрацию на сайте &laquo;%$2s&raquo;. 
			<br><b>Ваши данные:</b><br>
			- Имя пользователя %3s <br>
			- Пароль: %4s </p>
			<p>Ссылка для входа: %5s</p>
			<p>Для полной активации необходимо полностью заполнить ваш профиль в личном кабинете.</p>',
			$first_name,
			get_bloginfo( 'name' ),
			$user_email,
			$user_password,
			get_permalink( 19 )
		);

		$headers = array(
			'content-type: text/html',
		);
		// отправка писем
		wp_mail( get_bloginfo( 'admin_email' ), $subject, $message_admin, $headers );
		wp_mail( $user_email, $subject, $message_user, $headers );
		// начинаем авторизацию
		$user = wp_authenticate( $user_email, $user_password );
		// обновляем данные пользователя
		wp_update_user( array(
			'ID'         => $user->ID,
			'first_name' => $first_name,
			'last_name'  => $last_name
		) );
		update_user_meta( $user->ID, 'phone_number', $phone_number );
		// удаляем существующие авторизационные данные, авторизуем текущего
		if ( ! is_wp_error( $user ) ) {
			nocache_headers();
			wp_clear_auth_cookie();
			wp_set_auth_cookie( $user->ID );
			echo json_encode( [
				'status'   => 1,
				'message'  => 'Вы успешно авторизованы и сейчас будете перенаправлены в личный кабинет.',
				'redirect' => get_permalink( 19 ),
				'timeout'  => 0
			] );
			wp_die();
		}
	}


	wp_die();
}

Какие действия выполняет данный код?

  • Делает проверку на заполнение полей
  • Ищет в базе нет ли уже зарегистрированного пользователя с таким email
  • Проверяет сложность, длину пароля
  • Если в все проверки пройдены, то авторизует пользователя, выполняет вход и перенаправляет на определённую страницу
  • Отправляет письма новому пользователю и уведомление администратору

Шаг третий: обработка и отправка Ajax запроса

Для того чтобы связать ранее представленные HTML код формы и php код вам понадобится вставить некоторый кусок кода в основной джаваскрипт файл вашей темы:

 $(document).on('submit', '[name="step-register-1"]', function (event) {
 	event.preventDefault();
 	var form = $(this).serialize();
 	$.ajax({
 		type: 'POST',
 		url: allData.ajaxurl,
            data: form,
            cache: false,
            success: function (data) {
            	try {
            		var json = JSON.parse(data);
            		if (json.status) {
            			setTimeout(function (e) {
            				document.location.href = json.redirect;
            			}, json.timeout);
            		} else {
            			// здесь выводится сообщение об ошибке над формой,
            			// вам нужно заменить строчку на свою
            			$(".form-info").fadeIn().find('.elementor-alert-title').text(json.message);
            		}

            	} catch (e) {
            		console.log('Ошибка ' + e.name + ":" + e.message + "\n" + e.stack);
            	}
            }
        });
 });

Вот и всё. Наша форма регистрации создана всего за несколько шагов.  Остаётся проверить работоспособность формы.

Удачи вам и побольше регистраций на сайте. P.S. Но только не от спамеров, а от хороших людей.

 

Поделиться:
Підписатися

Сповістити про





3 Ваш коментар
Старіші

Новіші
Найпопулярніші

Вбудовані Відгуки
Переглянути всі коментарі

Гор


5 роки тому

$message = [];

На этой строке Ваши изменения в коде PHP были отменены из за ошибки на строке wp-content/themes/zalive/functions.php. Исправьте и попробуйте пересохранить.

syntax error, unexpected ‘[‘

Сергей


4 роки тому

Добрый вечер! Очень классная форма регистрации ) Скажите пожалуйста, возникла проблемка, куда надо вставить третий код Ajax? Первый код вставил html блок на сайте, второй в functions.php, а Ajax в global.js или в global.js это не правильно? У меня не сработало, вышла информация “Не найдено, запрошенную информацию найти не удалось”, подскажите пожалуйста как исправить? Очень классная форма.

Данил


3 роки тому

Скажите, почему может не отправляться письмо пользователю при регистрации? Админу приходит, а пользователю нет.