if(!is_user_logged_in()) возвращает true на 404 странице

29 янв. 2014 г., 21:05:18
Просмотры: 16.4K
Голосов: 1

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

Для этого я проверяю, авторизован ли пользователь:

// запрещаем доступ неаутентифицированным пользователям
if( !is_user_logged_in() ) {
    wp_redirect('/wp-login.php');
    //auth_redirect();
    exit;
}

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

Теперь я обнаружил, что if( !is_user_logged_in() ) возвращает true на 404 странице.

Я всё ещё разбираюсь, но хочу узнать ваше мнение: это нормальное поведение или баг? Вы можете подтвердить, наблюдается ли такое же поведение в вашей установке? У меня последняя версия WordPress.


Обновление:

Всё ещё не могу понять: в footer.php

if(!is_user_logged_in()) {
    echo '123';
}

выводит 123, но моя функция не делает редирект... но всё равно это странно и вызывает проблемы с другим плагином.

Плагин выглядит так:

add_action("wp_footer","bpln_store_ids");
function bpln_store_ids(){
    if(!is_user_logged_in())
        return;
 ?>
 <div id="bpln-notification-ids" style="display:none;">
 <?php echo join(",",bpln_get_all_notification_ids(bp_loggedin_user_id()));?>
 </div>
<?php
}

Поскольку проверка возвращает true, фактическое содержимое никогда не отображается.

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

Где вы выполняете проверку? Перенаправление можно сделать только до вывода любого HTML. Если вы попытаетесь выполнить перенаправление после того, как началась отправка контента, оно будет проигнорировано.

Seamus Leahy Seamus Leahy
29 янв. 2014 г. 21:18:59

Я использую это в header.php, перед doctype. Но проблема возникает в footer.php. Я обновил свой вопрос. Это все еще проблема. Можете ли вы подтвердить, везде ли это так? Я также считаю, что это баг.

CBeTJlu4ok CBeTJlu4ok
29 янв. 2014 г. 21:23:51

У меня нет проблем с тем, чтобы is_user_logged_in() возвращал неверные данные на странице 404 - даже в footer.php. Возможно, у вас есть плагин, который изменяет состояние текущего пользователя. Вам нужно отключить плагины и нестандартные темы, чтобы определить, связано ли это с одним из них. Если проблема существует в стандартной установке WordPress, то это проблема WordPress, в противном случае она связана с каким-то дополнением.

Seamus Leahy Seamus Leahy
29 янв. 2014 г. 21:42:24

Есть ли ссылка, по которой мы можем посмотреть это в действии?

eteich eteich
29 янв. 2014 г. 21:44:22

Не следует использовать редирект в файле header.php, обычно это уже слишком поздно, заголовки уже отправлены. Лучше подключить его раньше, например, через хук template_redirect.

birgire birgire
29 янв. 2014 г. 21:56:20

@birgire В виде отдельного ответа, пожалуйста.

kaiser kaiser
29 янв. 2014 г. 22:12:05

@kaiser, спасибо за напоминание - я знаю, это плохая привычка намекать на ответ в комментариях ;-)

birgire birgire
30 янв. 2014 г. 02:52:08
Показать остальные 2 комментариев
Все ответы на вопрос 1
4

Попробуйте этот код для редиректа:

add_action( 'template_redirect', function(){

    // запрещаем доступ неавторизованным пользователям
    if( ! is_user_logged_in() )
    {
        wp_redirect( home_url( '/wp-login.php' ), 302 );
        exit();
    }
});

Это позволит просматривать сайт только вошедшим пользователям.

Обычно уже слишком поздно делать редирект напрямую в файле header.php, поэтому лучше использовать хук, который срабатывает до отправки HTTP-заголовков, например хук template_redirect. Также важно, чтобы template_redirect не срабатывал на странице wp-login.php.

30 янв. 2014 г. 02:50:54
Комментарии

Вот и голоса. Разве не просто? ;)

kaiser kaiser
30 янв. 2014 г. 04:31:13

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

CBeTJlu4ok CBeTJlu4ok
1 февр. 2014 г. 11:05:22

Хорошо, попробовал, но не работает — когда я выхожу из системы, сайт все равно просматривается. Может быть, template_redirect — неверное действие?

CBeTJlu4ok CBeTJlu4ok
1 февр. 2014 г. 11:08:48

Это странно, я успешно протестировал это на чистой установке. Возможно, у вас есть плагин/тема, который мешает работе? Может быть, у вас проблемы с куками, вы пробовали проверить в другом браузере или очистить кеш? Вы можете попробовать использовать более ранний хук, например wp, но если вы хотите использовать хуки типа init, вам нужно изменить приведенный код, чтобы избежать бесконечного цикла. Какой результат выдает home_url( '/wp-login.php' )? Что произойдет, если заменить wp_redirect() на die( 'Stop!' )? Вы добавили этот код в файл functions.php?

birgire birgire
1 февр. 2014 г. 18:52:55