Introduction
Are you Curious about how to create a custom login and register form in WordPress without any plugin? Not everyone wants to install a plugin on their WordPress website for every little things. Especially when you just need a simple registration and login form for your site users.
Fortunately, WordPress comes with some functions. It’s quite easy to create a simple user registration and login form in WordPress with the default WordPress functions and you don’t need any type of plugins.
In this tutorial, I will demonstrate how you can create a custom login and register page in WordPress using the function in a custom page template.
Prerequisites
Before we begin, make sure you have:
- Access to your WordPress site’s files via FTP or a file manager.
- Basic knowledge of HTML, CSS, and PHP.
Step 1: Create Custom Login and Register Forms
1.1 Create a Custom Login Form
Create a new file named custom-login.php in your theme directory. Add the following code:
<?php
/*
Template Name: Custom Login
*/
// If user is already loggedin then redirect him/her to my-account page
if(is_user_logged_in()) {
wp_redirect( site_url('my-account') );
}
get_header();
?>
<form class="login-form" id="login-form" action="" method="post">
<div class="form-row">
<label for="user_email">Email</label>
<input type="email" name="user_email" id="user_email" class="form-control" required="required"/>
</div>
<div class="form-row">
<label for="user_password">Password</label>
<input type="password" name="user_password" id="user_password" class="form-control" required="required" />
</div>
<?php wp_nonce_field('login_user_nonce', 'login_user_nonce'); ?>
<button type="submit" class="btn btn-primary submit-btn">Sign in</button>
</form>
<?php
get_footer();
?>
Implement your custom login form and include the necessary JavaScript for AJAX functionality.
1.2 Create a Custom Register Form
Similarly, create a file named custom-register.php with a template structure like the one above. Implement your custom registration form and include the necessary JavaScript.
<?php
/*
Template Name: Custom Register
*/
// If user is already loggedin then redirect him/her to my-account page
if(is_user_logged_in()) {
wp_redirect( site_url('my-account') );
}
get_header();
?>
<form class="register-form" id="register-form" action="" method="post">
<div class="form-row">
<label for="user_first_name">First Name</label>
<input type="text" name="user_first_name" id="user_first_name" class="form-control" required="required"/>
</div>
<div class="form-row">
<label for="user_last_name">Last Name</label>
<input type="text" name="user_last_name" id="user_last_name" class="form-control" required="required"/>
</div>
<div class="form-row">
<label for="user_email">Email</label>
<input type="email" name="user_email" id="user_email" class="form-control" required="required"/>
</div>
<div class="form-row">
<label for="user_password">Password</label>
<input type="password" name="user_password" id="user_password" class="form-control" required="required" />
</div>
<div class="form-row">
<label for="user_cpassword">Confirm Password</label>
<input type="password" name="user_cpassword" id="user_cpassword" class="form-control" required="required" />
</div>
<?php wp_nonce_field('register_user_nonce', 'register_user_nonce'); ?>
<button type="submit" class="btn btn-primary submit-btn">Sign up</button>
</form>
<?php
get_footer();
?>
Step 2: Implement AJAX for Form Submission
2.1 Enqueue jQuery (if not already loaded)
In your theme’s functions.php file, enqueue jQuery if it’s not already loaded:
add_action('wp_enqueue_scripts', 'enqueue_custom_scripts');
function enqueue_custom_scripts() {
wp_enqueue_script('jquery');
}
2.2 AJAX for Login Form
In your custom-login.php file, add the following JavaScript code to handle the login form submission:
jQuery(document).ready(function($) {
jQuery("#login-form").on("submit", function (e) {
e.preventDefault();
e.isDefaultPrevented();
var form = jQuery(this);
var error;
var user_email = form.find("#user_email");
var user_password = form.find("#user_password");
var security = form.find("#login_user_nonce");
jQuery.ajax({
type: "POST",
dataType: "json",
url: '<?= esc_url(admin_url('admin-ajax.php')); ?>',
data: {
action: "ajax_login_user",
user_email: user_email.val(),
user_password: user_password.val(),
security: security.val(),
},
success: function (response) {
if (response.success) {
$('.alert').text(response.msg).show();
window.setTimeout(function () {
window.location = response.redirect;
}, 500);
} else {
$('.alert').text(response.msg).show();
$("html, body").animate({ scrollTop: 0 }, "slow");
}
},
error: function (jqXHR, exception) {
var msg = "";
if (jqXHR.status === 0) {
msg = "Not connect.\n Verify Network.";
} else if (jqXHR.status == 404) {
msg = "Requested page not found. [404]";
} else if (jqXHR.status == 500) {
msg = "Internal Server Error [500].";
} else if (exception === "parsererror") {
msg = "Requested JSON parse failed.";
} else if (exception === "timeout") {
msg = "Time out error.";
} else if (exception === "abort") {
msg = "Ajax request aborted.";
} else if (jqXHR.responseText === "-1") {
msg = "Please refresh page and try again.";
} else {
msg = "Uncaught Error.\n" + jqXHR.responseText;
}
$('.alert').text(msg).show();
},
});
});
});
2.3 AJAX for Register Form
Similarly, in your custom-register.php file, add the following JavaScript code for the registration form:
jQuery(document).ready(function($) {
$('#register-form').on('submit', function (e) {
e.preventDefault();
e.isDefaultPrevented();
var form = jQuery(this);
var user_first_name = form.find("#user_first_name");
var user_last_name = form.find("#user_last_name");
var user_email = form.find("#user_email");
var user_password = form.find("#user_password");
var user_cpassword = form.find("#user_cpassword");
var security = form.find("#register_user_nonce");
jQuery.ajax({
type: "POST",
dataType: "json",
url: '<?= esc_url(admin_url('admin-ajax.php')); ?>',
data: {
action: "ajax_register_user",
user_first_name: user_first_name.val(),
user_last_name: user_last_name.val(),
user_email: user_email.val(),
user_password: user_password.val(),
user_cpassword: user_cpassword.val(),
security: security.val(),
},
success: function (response) {
if (response.success) {
$('.alert').text(response.msg).show();
window.setTimeout(function () {
window.location = response.redirect;
}, 500);
} else {
$('.alert').text(response.msg).show();
$("html, body").animate({ scrollTop: 0 }, "slow");
}
},
error: function (jqXHR, exception) {
var msg = "";
if (jqXHR.status === 0) {
msg = "Not connect.\n Verify Network.";
} else if (jqXHR.status == 404) {
msg = "Requested page not found. [404]";
} else if (jqXHR.status == 500) {
msg = "Internal Server Error [500].";
} else if (exception === "parsererror") {
msg = "Requested JSON parse failed.";
} else if (exception === "timeout") {
msg = "Time out error.";
} else if (exception === "abort") {
msg = "Ajax request aborted.";
} else if (jqXHR.responseText === "-1") {
msg = "Please refresh page and try again.";
} else {
msg = "Uncaught Error.\n" + jqXHR.responseText;
}
$('.alert').text(msg).show();
},
});
});
});
Step 3: Handle AJAX Requests in WordPress
3.1 Process AJAX Login Request
In your theme’s functions.php file, handle the AJAX login request:
/**
* Ajax login
*
* @return json
*/
add_action('wp_ajax_nopriv_ajax_login_user', 'ajax_login_user');
function ajax_login_user() {
$user_email = sanitize_email( $_POST['user_email'] );
$user_password = sanitize_text_field( $_POST['user_password'] );
// First check the nonce, if it fails the function will break
if( !check_ajax_referer( 'login_user_nonce', 'security', false) ) :
echo json_encode(
array(
'success' => false,
'msg' => 'Session token has expired, please reload the page and try again',
)
);
die();
endif;
// if user_email is empty then return
if ( !$user_email ) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please fill email address',
)
);
die();
}
// if user_email is not valid then return
if ( !is_email($user_email) ) {
echo json_encode(
array(
'registered' => false,
'msg' => 'This is not valid email address',
)
);
die();
}
// if user_password is empty then return
if(empty($user_password)) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please provide password',
)
);
die();
}
$info = [
'user_login' => $user_email,
'user_password' => $user_password,
'remember' => true,
];
// now sign on user
$user_signon = wp_signon( $info, '' );
// if login details is wrong then give a alert else login user
if ( is_wp_error($user_signon) ) {
echo json_encode(
array(
'success' => false,
'msg' => 'Wrong username or password.',
)
);
} else {
wp_clear_auth_cookie();
wp_set_current_user($user_signon->ID);
wp_set_auth_cookie($user_signon->ID, true);
echo json_encode(
array(
'success' => true,
'msg' => 'Login successful, redirecting...',
'redirect' => site_url('my-account'),
)
);
}
die();
}
3.2 Process AJAX Register Request
Similarly, handle the AJAX register request:
/**
* Ajax register
*
* @return json
*/
add_action( 'wp_ajax_nopriv_ajax_register_user', 'ajax_register_user' );
public function ajax_register_user() {
$user_first_name = sanitize_text_field( $_POST['user_first_name'] );
$user_last_name = sanitize_text_field( $_POST['user_last_name'] );
$user_email = sanitize_email( $_POST['user_email'] );
$user_password = sanitize_text_field( $_POST['user_password'] );
$user_cpassword = sanitize_text_field( $_POST['user_cpassword'] );
// First check the nonce, if it fails the function will break
if( !check_ajax_referer( 'register_user_nonce', 'security', false) ) :
echo json_encode(
array(
'registered' => false,
'msg' => 'Session token has expired, please reload the page and try again'
)
);
die();
endif;
// if user_first_name is empty then return
if(empty($user_first_name)) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please provide your first name'
)
);
die();
}
// if user_last_name is empty then return
if(empty($user_last_name)) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please provide your last name',
)
);
die();
}
// if user_email is empty then return
if ( !$user_email ) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please fill email address',
)
);
die();
}
// if user_email is not valid then return
if ( !is_email($user_email) ) {
echo json_encode(
array(
'registered' => false,
'msg' => 'This is not valid email address',
)
);
die();
}
// if user_password is empty then return
if(empty($user_password)) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please provide password',
)
);
die();
}
// if user confirm password is empty then return
if(empty($user_cpassword)) {
echo json_encode(
array(
'registered' => false,
'msg' => 'Please confirm password',
)
);
die();
}
// if password is not strong then return
$uppercase = preg_match('@[A-Z]@', $user_password);
$lowercase = preg_match('@[a-z]@', $user_password);
$number = preg_match('@[0-9]@', $user_password);
$specialChars = preg_match('@[^\w]@', $user_password);
if(!$uppercase || !$lowercase || !$number || !$specialChars || strlen($user_password) < 8) {
echo json_encode(
array(
'registered'=>false,
'msg'=> 'Password should be at least 8 characters in length and should include at least one upper case letter, one number, and one special character.',
)
);
die();
}
// if email not exist then register user and login
if( email_exists($user_email) == false ) {
$user_name = explode( '@', $user_email);
$username = $user_name[0];
// check if username is exist else generate new
if (username_exists($username)) {
$random = rand(10,100);
$username = $username . '-' . $random;
}
$user_data = array(
'first_name' => $user_first_name,
'last_name' => $user_last_name,
'user_login' => $username,
'user_email' => $user_email,
'user_pass' => $user_password,
);
// insert new user
$user_id = wp_insert_user( $user_data );
$info = [
'user_login' => $user_email,
'user_password' => $user_password;
'remember' => true,
];
$user_signon = wp_signon( $info, '' );
// login user
wp_clear_auth_cookie();
wp_set_current_user($user_signon->ID);
wp_set_auth_cookie($user_signon->ID, true);
echo json_encode(
array(
'success' => true,
'redirect' => site_url('my-account'),
'msg' => 'You have successfully logged in. Redirecting please wait....',
)
);
die();
} else {
echo json_encode(
array(
'success' => false,
'msg' => 'Email already exist, please try other one.',
)
);
die();
}
die();
}
Conclusion
In this post we have created login and register form using custom page template. You can use a shortcode function to create a WordPress login and register form in WordPress without a plugin. I hope you can now implement one of these methods to create a custom front-end login and register form on your WordPress site.