Перенаправление пользователя на исходный URL после входа?
У меня есть функция, которая перенаправляет пользователей на страницу входа (главную), если они пытаются получить доступ к любой другой странице без авторизации. Вот как она работает:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( get_option('home') );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Очень просто и работает нормально, но проблема в том, что мне нужно перенаправить их на URL, к которому они пытались получить доступ после успешного входа в систему, точно так же, как работает панель управления WordPress.
Есть ли способ сделать это? Заранее спасибо!
Вы можете легко это сделать. Вам просто нужно указать параметр перенаправления.
Если вы используете ссылку для входа на главной странице для перехода на страницу входа, то решение @sisir верное.
<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>
Если вы используете пользовательскую форму на главной странице, то внутри тега <form>
убедитесь, что вы заполнили скрытое поле с URL для перенаправления
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />
И если вы используете wp_login_form()
для генерации формы, тогда укажите параметр - http://codex.wordpress.org/Function_Reference/wp_login_form
<?php
$args = array(
'echo' => true,
'redirect' => site_url( $_SERVER['REQUEST_URI'] ),
'form_id' => 'loginform',
'label_username' => __( 'Имя пользователя' ),
'label_password' => __( 'Пароль' ),
'label_remember' => __( 'Запомнить меня' ),
'label_log_in' => __( 'Войти' ),
'id_username' => 'user_login',
'id_password' => 'user_pass',
'id_remember' => 'rememberme',
'id_submit' => 'wp-submit',
'remember' => true,
'value_username' => NULL,
'value_remember' => false );
wp_login_form( $args );
?>
Измените другие параметры в соответствии с вашими потребностями.

Я использую пользовательскую форму и ваше решение со скрытым полем, но в моем случае происходит перенаправление на URL вида 'localhost/wordpress/localhost/wordpress/blog/someone'. Можете помочь?

Попробуйте передать the_permalink()
в качестве аргумента $redirect
:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( the_permalink() );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
РЕДАКТИРОВАНО:
Извините, изначально неверно понял ваш вопрос. Попробуйте так:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Также обратите внимание: правильное использование wp_redirect()
обычно требует добавления exit;
, что я сделал во втором примере.

Это не имеет смысла, перенаправление должно вести на домашнюю страницу, это работает нормально. Мне нужен способ запомнить исходный URL и перенаправить пользователя туда после входа.

Всем спасибо, я вроде как использовал немного из того, что все порекомендовали, так что в итоге мой код выглядит так:
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
И в моей форме входа (я жестко прописываю форму входа в своем приложении, спасибо @Ashfame за то, что сообщил мне о wp_login_form, я даже не знал, что такая функция существует) я добавил это, когда учетные данные пользователя верны и он готов войти:
if (isset($_REQUEST['redirect_to'])){
wp_redirect($_REQUEST['redirect_to']);
// wp_redirect() не завершает работу автоматически, и почти всегда за ним должен следовать вызов exit;
exit;
} else {
wp_redirect(get_bloginfo('url') . '/groups/');
exit;
}
Большое спасибо за вашу помощь, я плюсовал всех!

Это мой код, который я использую для перенаправления пользователей на страницу входа в WordPress. После входа они возвращаются обратно на ту страницу, где были. Но это не главная страница, а кастомная страница входа в WordPress, которую я настроил.
<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>
Возможно, вам стоит поэкспериментировать с этим. Обычно текущий URL пользователя можно получить с помощью $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

Я знаю, что это очень поздно, но я написал пост о том, как именно это сделать, если кто-то в будущем наткнется на это и ему понадобится:
http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если целевая страница изменится. См. [ответ].

Я смог получить доступ к неработающей ссылке с помощью Wayback Machine, если кому-то еще нужна эта информация.

Фильтр-хук login_redirect
является более полным и эффективным решением в данном случае. Таким образом, вы можете предлагать различные пути перенаправления для пользователей с разными уровнями доступа или сохранять URL перенаправления в случае ошибки при входе (например, неправильный пароль).
function login_redirect( $redirect_to, $request, $user ){
if(isset($_REQUEST['redirect_to'])){
return $_REQUEST['redirect_to'];
}
return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
wp_redirect( $redirect );
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Ни один из ваших ответов не сработал, но после небольшого изменения всё заработало! Вот мой код:
function login_redirect( $redirect_to, $request, $user ){
if(isset($_REQUEST['redirect_to'])){
return $_REQUEST['redirect_to'];
}
return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );
function restrict_access_if_logged_out(){
if (!is_user_logged_in() && !is_home()){
$redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Я всего лишь добавил /wp-login.php
по сравнению с ответом @Matt, но именно это стало ключевым моментом. Надеюсь, это поможет! :)
**РЕДАКТИРОВАНИЕ:**
Я обнаружил ОШИБКУ при принудительном использовании HTTPS в WordPress. Этот метод не работает, так как перенаправление происходит по HTTP. Для исправления я изменил функцию. Вот результат:
function restrict_access_if_logged_out(){
global $wp;
$protocol='http';
if (isset($_SERVER['HTTPS']))
if (strtoupper($_SERVER['HTTPS'])=='ON')
$protocol='https';
if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
$redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
wp_redirect( $redirect );
exit;
}
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
Я проверил протокол, затем удалил esc_url
и добавил правильный протокол: $protocol://
. Также изменил кавычки ""
.
Я основывался на этой странице.
