Перенаправити користувача на оригінальний 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 );
?>

Змініть інші параметри відповідно до того, що у вас є чи потрібно.


Я використовую власну форму, і я використовую ваше надане приховане поле, але в моєму випадку мене переадресовують на URL, як-от "localhost / wordpress / localhost / wordpress / блог / хтось". будь-яка допомога?
rafi

у мене це є, я використовую подвійну косу рису. тож моє рішення таке <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi

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

Дуже дякую за вашу допомогу, я проголосував за всіх!


Привіт Хав'єр, у який файл ти додав ці функції? Спасибі.
Тайлер Дерден


4
Вам слід зателефонувати exit()або die()після wp_redirect(). Інакше можливо, що після цього wp_redirect()буде виконаний код , що може призвести до помилок та вразливості безпеки.
Іван Данн

2

це мій код, який я використовую, щоб люди направляли на wp сторінку входу. Потім, увійшовши в систему, вони повернулися туди, де були. Але це не домашня сторінка, а сторінка входу в wordpress, де я налаштовую користувальницький вхід.

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

Ви можете зайнятися дослідженням. Зазвичай ви отримаєте поточну URL-адресу користувача від$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


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

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порівняно з відповіддю @ Метта, але для мене це було ключовим. Сподіваюся, що це допомагає! :)

** редагувати:

Я виявив ПОМИЛУ, коли ви ВИПУСКОВО 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/


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. Дивіться, як відповісти .
Габріель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.