Перенаправление на предыдущую страницу после входа в систему
Я не использую никаких пользовательских плагинов для входа или специального кода. На некоторых моих страницах в самом начале есть такой код:
<?php
if(!is_user_logged_in())
wp_redirect('/login/');
?>
Таким образом, это не позволяет пользователям просматривать страницу, когда они не авторизованы. У меня есть следующие страницы с этим кодом:
/wp-content/my-theme/my-account/
/wp-content/my-theme/my-account/world.php
/wp-content/my-theme/my-account/subscription.php
/wp-content/my-theme/my-dashboard.php
/wp-content/my-theme/my-files.php
Сейчас, когда пользователь переходит на любую из вышеуказанных страниц без авторизации, его перенаправляет на страницу входа, а после авторизации он попадает на страницу my-account/
.
Я хочу изменить текущий сценарий, чтобы перенаправлять пользователя на страницу, с которой он пришел. Я пробовал следующие варианты, которые не сработали.
Использование HTTP_REFERRER
В форме login/
я разместил такой код:
<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />
Модификация functions.php
В файле functions.php
я разместил такой код:
if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) {
add_filter('login_redirect', 'my_login_redirect', 10, 3);
function my_login_redirect() {
$location = $_SERVER['HTTP_REFERER'];
wp_safe_redirect($location);
exit();
}
}
Ссылки:
- Перенаправление WordPress обратно на страницу-источник после входа
- WordPress совет: Перенаправление на предыдущую страницу после входа
Я также пробовал следующие варианты, но они не сработали:
- Перенаправление пользователей на страницу-источник после входа с использованием пользовательской формы входа
- Перенаправление пользователя на исходный URL после входа?
Ничего не получается. Я готов предоставить дополнительную информацию, если потребуется. Заранее спасибо. :)
Обновление
Я изменил код следующим образом:
<?php
if(!is_user_logged_in())
wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>
Это отображает страницу входа таким образом:
/login.php?redirect_to=/my-account/subscription.php
Этого было бы достаточно для аутентификации и перенаправления. Но мне нужно найти место, где происходит реальное перенаправление, и я хочу выполнить перенаправление используя параметр redirect_to
!
Я не совсем понимаю вашу настройку, но вот несколько идей:
A) Отображение ссылки на вход с параметром redirect_to
:
Вы можете добавить следующее в свои пользовательские шаблоны страниц:
if( ! is_user_logged_in() )
{
printf( '<a href="%s">%s</a>',
wp_login_url( get_permalink() ),
__( 'Вам необходимо войти, чтобы просмотреть эту страницу!' )
);
}
Это создаст ссылку на вход для анонимных посетителей с текущей страницей в параметре GET redirect_to
.
B) Перенаправление на wp-login.php
с параметром redirect_to
:
Обратите внимание, что вызов wp_redirect()
должен происходить до отправки HTTP-заголовков.
Мы можем вызвать его через хук template_redirect
:
add_action( 'template_redirect',
function()
{
if( ! is_user_logged_in()
&& is_page( array( 'member-page-1', 'member-page-2' ) )
)
{
wp_safe_redirect( wp_login_url( get_permalink() ) );
exit();
}
}
);
где мы ограничиваем доступ к страницам с идентификаторами member-page-1
и member-page-2
.
C) Нативная форма входа (встроенная):
Другой вариант - встроить нативную форму входа прямо в содержимое страницы:
add_filter( 'the_content', function( $content ) {
if( ! is_user_logged_in()
&& is_page( array( 'member-page-1', 'member-page-2' ) )
)
$content = wp_login_form( array( 'echo' => 0 ) );
return $content;
}, PHP_INT_MAX );
где мы также ограничиваем доступ к страницам с идентификаторами member-page-1
и member-page-2
.
Обратите внимание, что вам нужно будет отдельно обрабатывать архивные/индексные/страницы поиска.
Обновление: Я упростил код, используя функцию wp_login_url()
.

Я уже передаю параметр redirect_to
в login.php
. Проверьте обновленный ответ. Но после входа в систему происходит переход на my-account
, который должен быть заменен на redirect_to
.

Обратите внимание, что вы должны использовать wp_redirect
до отправки HTTP-заголовков. Возможно, вам стоит использовать действие template_redirect
, например.

Функция wp_redirect()
является подключаемой (pluggable), но вы также можете использовать фильтр wp_redirect
.

Вы можете переопределить её своей собственной функцией wp_redirect()
, но я не рекомендую этого делать.

Хороший ответ, но не получилось заставить работать на кастомной странице входа!

Если ваш кастомный login.php
работает с параметром redirect_to
, то думаю, вы можете просто заменить wp-login.php
на login.php
в приведенном выше фрагменте кода. PS: предполагаю, что вы используете страницы WordPress, а не голые PHP-файлы.

Кастомный логин просто не работает. Оригинальный wp-login.php
работает с редиректом.

Это не работает, но я принимаю ответ за ваши старания. Я продолжу это обсуждение на StackOverflow. Вы можете присоединиться там?

Хорошо, спасибо, похоже, вы нашли решение на JavaScript, которое работает для вас там.

Использование get_permalink()
, как предложено в принятом ответе, будет работать только если вы находитесь в записи (любого типа), но не сработает, например, в архиве категории. Чтобы это работало везде, нужен текущий URL, независимо от типа контента, который мы просматриваем.
Чтобы получить текущий URL в WordPress, мы можем взять текущий запрос из глобального объекта $wp
и добавить его к URL сайта с помощью add_query_arg()
. Мы можем использовать результат в параметре redirect_to
функции wp_login_url()
:
wp_login_url( site_url( add_query_arg( array(), $wp->request ) ) );
Тот же подход можно использовать с wp_logout_url()
, если это необходимо:
wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );

Проект умер год назад. Ну и какой смысл отвечать сейчас? Ты вообще прочитал предыдущий принятый ответ?

Да, я прочитал предыдущий ответ и считаю, что могу дать лучший ответ — возможно, не для тебя, но для других. Учти, что этот сайт (как и любой из сайтов StackExchange в целом) используется в качестве справочника тысячами людей, и они могут получать устаревшие ответы. Именно поэтому новые ответы или обновление старых всегда приветствуются. Помни, что помощь здесь оказывается не только для тебя.

Ха-ха... Чувак, у меня 62k на StackOverflow. Я понимаю, о чем ты. Это кастомный код, который пошел не так, и я не уверен, что это поможет? Разве поможет? Если да, то спасибо огромное.

Я не сомневаюсь, что это может помочь. Например, этот другой вопрос был помечен несколько минут назад как дубликат того, который мы обсуждаем.

Вы также можете использовать этот код на своей пользовательской странице входа
if ( ! is_user_logged_in() ) { // Отображаем форму входа WordPress:
$args = array(
'redirect' => esc_url($_SERVER['HTTP_REFERER']),
'form_id' => 'loginform-custom',
'label_username' => __( 'Email' ),
'label_password' => __( 'Пароль' ),
'label_log_in' => __( 'Войти' ),
'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">Забыли пароль</a></p>';
}
Это перенаправит пользователя на предыдущую страницу после входа.

Это было опубликовано как ответ, но не является попыткой ответить на вопрос. Возможно, это должно быть правкой, комментарием, другим вопросом или вообще удалено.

Это действительно отвечает на вопрос. Вы можете видеть, что пользователь перенаправляется на пользовательскую страницу входа <?php
if(!is_user_logged_in())
wp_redirect('/login/');
?>

Я бы хотел проверить решение вопроса на StackOverflow...

Знаю, что поздно, но публикую решение, чтобы оно могло помочь кому-то в нужный момент.
Вот что я делаю, и это работает идеально.
function redirect_user_tologin(){
global $post;
$post_slug = $post->post_name;
if(!is_user_logged_in()){
if($post_slug == 'my-account') { //можно добавить несколько условий
//создаем динамическую ссылку для перенаправления
$redirect = urlencode(site_url().'/'.$post_slug);
//перенаправление
wp_safe_redirect(site_url().'/wp-login.php/?redirect_to=' .$redirect);
exit;
}
}
}
add_action('wp', 'redirect_to_login');
Объяснение
Если пользователь не вошел в систему, то wp_safe_redirect
перенаправит его на страницу входа.
Для перенаправления пользователя после входа мы передаем ссылку на страницу как значение параметра redirect_to
, чтобы он был перенаправлен на нужную страницу.
URL страницы входа: site_url().'/wp-login.php/'
Ссылка для перенаправления: redirect_to=' .$redirect
