Перенаправление пользователя на исходный URL после входа?

30 апр. 2011 г., 06:35:04
Просмотры: 65.8K
Голосов: 18

У меня есть функция, которая перенаправляет пользователей на страницу входа (главную), если они пытаются получить доступ к любой другой странице без авторизации. Вот как она работает:

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.

Есть ли способ сделать это? Заранее спасибо!

0
Все ответы на вопрос 7
2
16

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

Если вы используете ссылку для входа на главной странице для перехода на страницу входа, то решение @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 );
?>

Измените другие параметры в соответствии с вашими потребностями.

30 апр. 2011 г. 13:43:56
Комментарии

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

rafi rafi
6 февр. 2014 г. 08:15:56

Я разобрался, у меня была двойная косая черта. Мое решение выглядит так: <?php echo '//' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>

rafi rafi
6 февр. 2014 г. 08:19:15
2

Попробуйте передать 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;, что я сделал во втором примере.

30 апр. 2011 г. 06:42:23
Комментарии

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

Javier Villanueva Javier Villanueva
30 апр. 2011 г. 08:12:44

Извините, изначально неправильно понял ваш вопрос. Я добавил правку, которая, надеюсь, учитывает ваш случай использования.

Chip Bennett Chip Bennett
30 апр. 2011 г. 15:34:20
3

Всем спасибо, я вроде как использовал немного из того, что все порекомендовали, так что в итоге мой код выглядит так:

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;
}

Большое спасибо за вашу помощь, я плюсовал всех!

30 апр. 2011 г. 19:41:27
Комментарии

Привет, Хавьер, в какой файл ты добавил эти функции? Спасибо.

Tyler Durden Tyler Durden
24 авг. 2012 г. 13:09:27

В functions.php

Javier Villanueva Javier Villanueva
25 авг. 2012 г. 23:40:09

После wp_redirect() следует вызывать exit() или die(). Иначе есть вероятность, что код после wp_redirect() будет выполнен, что может привести к ошибкам и уязвимостям безопасности.

Ian Dunn Ian Dunn
6 нояб. 2012 г. 19:21:38
0

Это мой код, который я использую для перенаправления пользователей на страницу входа в WordPress. После входа они возвращаются обратно на ту страницу, где были. Но это не главная страница, а кастомная страница входа в WordPress, которую я настроил.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

Возможно, вам стоит поэкспериментировать с этим. Обычно текущий URL пользователя можно получить с помощью $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

30 апр. 2011 г. 11:43:01
3

Я знаю, что это очень поздно, но я написал пост о том, как именно это сделать, если кто-то в будущем наткнется на это и ему понадобится:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

17 мар. 2016 г. 23:02:27
Комментарии

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

Gabriel Gabriel
17 мар. 2016 г. 23:37:09

Ссылка не работает (апрель 2020).

Philip Jones Philip Jones
22 апр. 2020 г. 16:01:55

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

jsmod jsmod
26 окт. 2020 г. 14:13:38
0

Фильтр-хук 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 );
12 авг. 2014 г. 18:24:16
0

Ни один из ваших ответов не сработал, но после небольшого изменения всё заработало! Вот мой код:

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://. Также изменил кавычки "".

Я основывался на этой странице.

22 авг. 2014 г. 15:11:08