Перенаправление wp-login.php на другую страницу
Я хотел бы перенаправить страницу wp-login.php на страницу /login.
Так чтобы когда пользователь кликает на ссылку вида <a href="/wp-login.php">login</a>, WordPress перенаправлял его на /register.
Я нашел эту функцию и модифицировал ее:
add_action('init','custom_login');
function custom_login(){
global $pagenow;
if (( 'wp-login.php' == $pagenow ) && (!is_user_logged_in())) {
wp_redirect('/login');
exit();
}
Я не очень хорошо разбираюсь в программировании WordPress.
Перенаправление работает нормально, но аутентификация, похоже, сломана.
Когда я ввожу логин/пароль, та же страница (/login) перезагружается без выполнения входа в систему.
Есть ли предложения по исправлению функции перенаправления?
Если вас беспокоят только ссылки для входа, отображаемые на ваших страницах, вы можете изменить URL с помощью фильтра login_url. Это не перенаправит пользователя, который введёт http://MYSITE/wp-login.php напрямую в браузере, но повлияет на ссылки для входа, отображаемые на вашем сайте.
Пример кода со login_url страницы Codex:
add_filter( 'login_url', 'my_login_page', 10, 2 );
function my_login_page( $login_url, $redirect ) {
return home_url( '/my-login-page/?redirect_to=' . $redirect );
}
1. Измените ваш файл .htaccess – добавьте эту строку после правила перезаписи index.php:
RewriteRule ^index\.php$ – [L]<br />
RewriteRule ^yoursecretpath$ wp-login.php [L,NC,QSA]
где yoursecretpath – это ваш секретный путь к панели администратора.
2. Измените функцию login_header в файле wp-login.php – добавьте этот код прямо перед строкой 59 (где начинается HTML-тег doctype, чтобы избежать ошибки отправки заголовков):
<?php $uri = $_SERVER['REQUEST_URI']; if(stripos($uri, ‘wp-login’) or stripos($uri, ‘wp-admin’) && !stripos($GLOBALS["HTTP_COOKIE"], ‘wordpress_logged_in’)) { header("Location: ".get_site_url().'/yoursecretpath' ); exit(); } ?>
У меня уже есть опенсорсный плагин, который делает это:
https://github.com/tripflex/wp-login-flow
Он был создан для обязательной верификации email пользователей, но вы можете отключить эту функцию и просто использовать функционал перезаписи URL, который работает в последней версии в репозитории WordPress (1.0.0).
Вы можете посмотреть код, чтобы увидеть, как я обрабатываю перезаписи:
https://github.com/tripflex/wp-login-flow/blob/master/classes/rewrite.php#L312
Сейчас я как раз работаю над крупными обновлениями и исправлениями для этого плагина, но текущая версия 1.0.0 отлично справляется с перезаписями URL. Наслаждайтесь :)
Если вы создадите пользовательскую страницу входа по адресу /login, то добавьте перезапись:
function restrict_admin() {
if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
wp_redirect( site_url() );
}
}
add_action( 'admin_init', 'restrict_admin', 1 );
Этот код проверит, является ли пользователь администратором, и если нет — WordPress перенаправит его на главную страницу сайта.
Также создайте шаблон для вашей пользовательской страницы входа и используйте стандартные функции входа WordPress внутри шаблона:
$args = array( 'redirect' => site_url( $_SERVER['REQUEST_URI'] ) );
wp_login_form( $args );
Вы также можете изменить адрес перенаправления для страницы входа. Но также полезно проверять ошибки входа и, возможно, добавить код для правильного перенаправления после неудачной попытки входа. Для этих задач используйте хуки wp_login_failed и authenticate.