Как создать свою форму входа/регистрации с обработкой ошибок?
Итак, я работаю над плагином, в котором создаю пользовательскую страницу, содержащую форму входа, а также форму регистрации пользователей. Формы построены и работают, ниже мой код.
<!-- Начало формы входа -->
<form name="loginform" id="login_form" class="login_form" action="<?php echo esc_url( wp_login_url() ); ?>" method="post">
<p>
<input type="text" name="log" id="user_login" class="input" placeholder="Имя пользователя" />
</p>
<p>
<input type="password" name="pwd" id="user_pass" class="input" placeholder="Пароль" />
</p>
<button name="wp-submit" id="wp-submit" class="btn"><?php _e("Войти", "shorti"); ?></button>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["REQUEST_URI"]; ?>" />
</form>
<!-- конец формы входа -->
<!-- Начало формы регистрации -->
<form method="post" id="register_form" class="wp-user-form" action="<?php echo site_url('wp-login.php?action=register', 'login_post') ?>">
<p><!-- Имя пользователя -->
<input type="text" name="user_login" id="user_login" class="input" placeholder="имя пользователя" />
</p>
<p><!-- Email для отправки пароля -->
<input type="email" name="user_email" id="user_email" class="input" placeholder="email адрес" />
</p>
<p class="small-text">Вы получите email с сгенерированным паролем<br />(который вы сможете изменить в "настройках пользователя")</p>
<?php do_action('register_form'); ?>
<button name="wp-submit" id="wp-submit" class="btn"><?php _e("Регистрация!", "shorti"); ?></button>
<?php $register = $_GET['register']; if($register == true) { echo '<p>Проверьте свою почту для получения пароля!</p>'; } ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?register=true" />
<input type="hidden" name="user-cookie" value="1" />
</form><!-- конец формы регистрации -->
Это работает нормально, но когда возникает сообщение об ошибке, пользователь перенаправляется на wp-login.php. Мне нужно, чтобы страница с формой обрабатывала все ошибки с помощью AJAX для обеспечения лучшего пользовательского опыта. Как лучше всего это реализовать?

Посмотрите на открывающий элемент формы. Значение атрибута action определяет, куда отправляются данные формы. Изменив это значение, вы можете перенаправить форму на саму себя вместо другой страницы.
Кодекс предлагает альтернативный подход к генерации разметки для необходимой формы:
http://codex.wordpress.org/Customizing_the_Login_Form#Make_a_Custom_Login_Page
Вот более подробное руководство:
http://digwp.com/2010/12/login-register-password-code/
Вы также можете использовать или модифицировать уже существующий популярный плагин для AJAX-авторизации:

Да, ссылка Digging into WP — это отличный ресурс... я использовал её для создания того, что у меня есть сейчас (код, которым я поделился), но там не показано, как обрабатывать ошибки на той же странице (по крайней мере, я этого не увидел). Во-вторых, я разрабатываю это для собственного плагина, над которым работаю, а это значит: я не хочу зависеть от другого плагина, который должен постоянно работать, чтобы мой тоже функционировал.

Вот что я делаю. Использую форму входа для создания логина https://codex.wordpress.org/Function_Reference/wp_login_form
Ниже приведены редиректы при входе/выходе и обработка ошибок входа. Это поможет вам с проблемами авторизации.
/** Редирект после входа
* Перенаправляет пользователя после успешного входа.
*
* @param string $redirect_to URL для перенаправления.
* @param string $request URL, с которого пришел пользователь.
* @param object $user Данные авторизованного пользователя.
* @return string
*/
function my_login_redirect( $redirect_to, $request, $user ) {
// есть ли пользователь для проверки?
global $user;
if ( isset( $user->roles ) && is_array( $user->roles ) ) {
// проверка для администраторов
if ( in_array( 'administrator', $user->roles ) ) {
// перенаправляем их в стандартное место
return home_url('/wp-admin/');
} else {
return home_url();
}
} else {
return $redirect_to;
}
}
/*Обработка ошибок входа*/
add_action( 'wp_login_failed', 'aa_login_failed' ); // хук для неудачного входа
function aa_login_failed( $user ) {
// проверяем, с какой страницы пришла попытка входа
$referrer = $_SERVER['HTTP_REFERER'];
// проверяем, что мы не на стандартной странице входа
if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
// убедимся, что у нас еще нет отметки о неудачной попытке входа
if ( !strstr($referrer, '?login=failed' )) {
// перенаправляем на страницу входа и добавляем параметр login=failed
wp_redirect( $referrer . '?login=failed');
} else {
wp_redirect( $referrer );
}
exit;
}
}
/*Обработка ошибок пустых полей входа*/
add_action( 'authenticate', 'pu_blank_login');
function pu_blank_login( $user ){
// проверяем, с какой страницы пришла попытка входа
$referrer = $_SERVER['HTTP_REFERER'];
$error = false;
if($_POST['log'] == '' || $_POST['pwd'] == '')
{
$error = true;
}
// проверяем, что мы не на стандартной странице входа
if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $error ) {
// убедимся, что у нас еще нет отметки о неудачной попытке входа
if ( !strstr($referrer, '?login=failed') ) {
// перенаправляем на страницу входа и добавляем параметр login=failed
wp_redirect( $referrer . '?login=failed' );
} else {
wp_redirect( $referrer );
}
exit;
}
}
/*Редирект после выхода*/
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );
function go_home(){
wp_redirect( home_url('/login/') );
exit();
}
add_action('wp_logout','go_home');
