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

16

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

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.

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

Хавьер Вильянуэва
источник

Ответы:

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' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( '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 );
?>

Измените другие параметры в соответствии с тем, что у вас есть или нужно.

Ashfame
источник
Я использую пользовательскую форму, и я использую предоставленное вами решение для скрытых полей, но в моем случае меня перенаправляют на URL вроде «localhost / wordpress / localhost / wordpress / blog / somebody». любая помощь?
Рафи
Я получил это, я использую двойной слэш. поэтому мое решение выглядит так <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER [ "REQUEST_URI"]; ?>
Рафи
6

Попробуйте передать 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 и перенаправить туда пользователя, как только он войдет в систему.
Хавьер Вильянуэва,
Извините, неправильно понял ваш вопрос изначально. Я добавил правку, которая, надеюсь, относится к вашему варианту использования.
Чип Беннетт
4

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

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() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

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

Хавьер Вильянуэва
источник
Привет Хавьер, в каком файле вы добавили эти функции? Благодарю.
Тайлер Дерден
Вfunctions.php
Хавьер Вильянуэва
4
Вам следует позвонить exit()или die()после wp_redirect(). В противном случае возможно выполнение кода after wp_redirect(), что может привести к ошибкам и уязвимостям безопасности.
Ян Данн
2

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

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

Вы могли бы хотеть исследовать с. Как правило, вы получите текущий URL пользователя по$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

Sisir
источник
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 );
Matt
источник
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, но для меня это был ключ. Надеюсь, это поможет! :)

**РЕДАКТИРОВАТЬ:

Я обнаружил ОШИБКУ, когда вы НАСТРАИВАЕТЕ WordPress для перехода в HTTPS. Этот метод не работает, потому что перенаправление происходит в 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://. Также я изменил "".

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

Нил
источник
0

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

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

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