Редирект при входе на предыдущую страницу

3 окт. 2012 г., 08:23:55
Просмотры: 18.2K
Голосов: 9

У меня есть кастомная страница входа по адресу http://netballscoop.com/log-in/

Когда вы вводите логин и пароль, вас успешно перенаправляет на предыдущую страницу, где вы были. При нажатии "Выйти" также происходит редирект на ту же страницу. Это всё работает отлично.

Если оставить поля логина/пароля пустыми или будет ошибка, система перенаправит на wp-login. Чтобы этого избежать, я использовал код с https://stackoverflow.com/questions/11477107/redirect-away-from-login-page

add_action('login_redirect', 'redirect_login', 10, 3);
function redirect_login($redirect_to, $url, $user) {
if($user->errors['empty_password']){
    wp_redirect(get_bloginfo('url').'/log-in-error/');
}
else if($user->errors['empty_username']){
    wp_redirect(get_bloginfo('url').'/log-in-error/');
}
else if($user->errors['invalid_username']){
    wp_redirect(get_bloginfo('url').'/log-in-error/');
}
else if($user->errors['incorrect_password']){
    wp_redirect(get_bloginfo('url').'/log-in-error/');
}
else{
    wp_redirect(get_bloginfo('url').'/log-in');
}
exit;
}

Это отлично работает для обработки ошибок входа на моём сайте. Но теперь при успешном входе система перенаправляет на http://netballscoop.com/members/testing (пользователь 'Testing' попадает на свою страницу профиля BuddyPress).

Как сделать редирект пользователя на предыдущую страницу при входе в систему?

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

Мой предыдущий ответ немного неверно истолковал ваш вопрос, поэтому я удалил его. Вы уже пробовали использовать действие wp_login? Оно срабатывает одним из последних при успешном входе в систему. Я использовал его на сайте, который недавно разрабатывал с BuddyPress, и это сработало просто отлично.

Eric Allen Eric Allen
4 окт. 2012 г. 07:39:18

Привет @allenericr, честно говоря, я даже не знаю, с чего начать. Мои знания PHP/функций и т.д. очень ограничены. Не могли бы вы поделиться тем, что используете на том сайте, если считаете, что это лучшее решение?

Tanya Tanya
4 окт. 2012 г. 08:07:50
Все ответы на вопрос 1
2
11

Вы можете фильтровать функцию login_redirect следующим образом, адаптируя код под свои нужды.

add_filter('login_redirect', 'redirect_previous_page', 10, 1);

function redirect_previous_page( $redirect_to ){
    global $user;

    $request = $_SERVER["HTTP_REFERER"];

    if ( in_array( $user->roles[0], array( 'administrator') ) ) {

        return admin_url();

    } elseif ( in_array( $user->roles[0], array( 'subscriber') ) ) {

        return $request;
    } 

    return $redirect_to;
}

Обновление 1:

Код (выше) был изменен и протестирован — он работает.

Обновление 2: (от Tanya)

Обсуждалось с @userabuser и было найдено рабочее решение.

// Перенаправление на предыдущую страницу 
remove_all_filters('login_redirect', 99);
add_filter('bbp_user_login_redirect_to', 'function_name');

Важное примечание:

Оказалось, что Tanya использовала плагин форума bbPress, поэтому, несмотря на оригинальный сниппет, который использует

add_filter('login_redirect', 'function_name'); //стандартный фильтр WordPress API

и который является правильным и работает в "обычных" условиях WordPress, в данном случае он переопределялся по приоритету фильтром bbPress,

add_filter('bbp_user_login_redirect_to', 'function_name'); //фильтр API bbPress

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

Примечания: (разное)

Измените 'subscriber' на роль, которую вы используете для данного типа пользователя. Также можно указать несколько ролей, так как это массив.

in_array( $user->roles[0], array( 'subscriber', 'role2, role3', 'etc')
4 окт. 2012 г. 09:54:40
Комментарии

@Tanya Изменил код, чтобы включить необязательные параметры. Переменная $user может быть недоступна. Попробуйте это обновление и дайте мне знать.

Adam Adam
4 окт. 2012 г. 12:10:07

@Tanya Привет, Таня, спасибо за обновление. Тем временем, не могли бы вы удалить ваши последние комментарии (нажмите на маленький крестик при наведении), чтобы мы могли почистить ветку обсуждения. Я также удалю свои нерелевантные комментарии.

Adam Adam
12 окт. 2012 г. 09:40:42