Перенаправление на предыдущую страницу после входа в систему

27 нояб. 2014 г., 14:30:05
Просмотры: 49.4K
Голосов: 7

Я не использую никаких пользовательских плагинов для входа или специального кода. На некоторых моих страницах в самом начале есть такой код:

<?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();
        }
}

Ссылки:


Я также пробовал следующие варианты, но они не сработали:

Ничего не получается. Я готов предоставить дополнительную информацию, если потребуется. Заранее спасибо. :)


Обновление

Я изменил код следующим образом:

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>

Это отображает страницу входа таким образом:

/login.php?redirect_to=/my-account/subscription.php

Этого было бы достаточно для аутентификации и перенаправления. Но мне нужно найти место, где происходит реальное перенаправление, и я хочу выполнить перенаправление используя параметр redirect_to!

2
Комментарии

Вы нашли решение этой проблемы? У меня такая же ситуация!

Tom Nolan Tom Nolan
7 июн. 2015 г. 19:31:56

@ThomasNolan Вообще-то я использовал временную переменную! ;)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
8 июн. 2015 г. 07:46:53
Все ответы на вопрос 4
12
13

Я не совсем понимаю вашу настройку, но вот несколько идей:

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().

27 нояб. 2014 г. 15:19:18
Комментарии

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 15:21:54

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

birgire birgire
27 нояб. 2014 г. 15:28:43

Хорошо, где происходит вызов redirect()?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 15:30:26

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

birgire birgire
27 нояб. 2014 г. 15:33:45

Я не понимаю. Что значит "подключаемая"?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 15:34:16

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

birgire birgire
27 нояб. 2014 г. 15:34:49

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 16:26:54

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

birgire birgire
27 нояб. 2014 г. 17:37:20

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 17:48:37

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 17:52:46

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

birgire birgire
27 нояб. 2014 г. 18:37:04

Да, дружище, это была моя ошибка. Кастомный код был на JavaScript! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 нояб. 2014 г. 19:45:29
Показать остальные 7 комментариев
5

Использование 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 ) ) );
1 дек. 2015 г. 09:11:24
Комментарии

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 дек. 2015 г. 09:13:39

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

cybmeta cybmeta
1 дек. 2015 г. 09:20:24

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 дек. 2015 г. 09:21:23

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

cybmeta cybmeta
1 дек. 2015 г. 09:28:03

Ха-ха... Ладно. Я сдаюсь. Ты прав! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 дек. 2015 г. 09:29:42
3

Вы также можете использовать этот код на своей пользовательской странице входа

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

Это перенаправит пользователя на предыдущую страницу после входа.

6 июл. 2016 г. 08:46:25
Комментарии

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 июл. 2016 г. 11:13:25

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

KKumar KKumar
6 июл. 2016 г. 13:30:00

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

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 июл. 2016 г. 13:46:19
1

Знаю, что поздно, но публикую решение, чтобы оно могло помочь кому-то в нужный момент.

Вот что я делаю, и это работает идеально.

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

20 янв. 2020 г. 08:05:33
Комментарии

Спасибо...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
21 янв. 2020 г. 22:21:25