Проверьте, вошел ли пользователь, используя JQuery

17

Я хочу выполнить пользовательский код jquery, который показывает диалог входа в систему для пользователя, если он нажимает кнопку, а он не вошел в систему. Как я могу это сделать?

Ферас Одех
источник

Ответы:

26

В случае, если вы хотите знать, вошел ли пользователь в текущий момент. Другие ответы проверяют, вошел ли пользователь в систему или нет, когда страница загружена, а не в тот момент, когда вы запускаете JavaScript. Например, пользователь мог войти в отдельную вкладку

Поместите это в свой JavaScript

var data = {
    action: 'is_user_logged_in'
};

jQuery.post(ajaxurl, data, function(response) {
    if(response == 'yes') {
        // user is logged in, do your stuff here
    } else {
        // user is not logged in, show login form here
    }
});

поместите это в ваши functions.php

function ajax_check_user_logged_in() {
    echo is_user_logged_in()?'yes':'no';
    die();
}
add_action('wp_ajax_is_user_logged_in', 'ajax_check_user_logged_in');
add_action('wp_ajax_nopriv_is_user_logged_in', 'ajax_check_user_logged_in');
Мридул Аггарвал
источник
Какова ценность ajaxurl?
Ферас Одех
WordPress устанавливает его как «yoursite.com/wp-admin/admin-ajax.php». Это URL, по которому должны быть отправлены все запросы Ajax
Mridul Aggarwal
Я поместил jQuery.post в обработчик кликов jquery, но это не работает. у тебя есть идеи как это решить?
Ферас Одех
Я видел, что ajaxurl не определен в консоли.
Ферас Одех
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) сказал, что в последних версиях WordPress это уже определено. Может быть, вы можете определить свою собственную версию ajaxurl с помощью wp_localize_script
Aggarwal
32

Проверьте classатрибут на body: Если тема использует body_class()тело, есть класс, названный logged-inдля пользователей, которые вошли в систему. Имейте в виду, что функцию можно использовать и для элемента html.

пример

if(jQuery('body').hasClass('logged-in')){
    // Do something
}

Вы также можете просто использовать его is_user_logged_in()как условие для постановки в очередь или печати сценария.

Фуксия
источник
высшие оценки за этот ответ - просто и эффективно.
Q Studio
Мне нравится идея просто проверять тело на logged-inуроке. Просто нужно быть уверенным, что темы используются body_class();или get_body_class();В противном случае, это не супер надежное решение. Хотя я использую эти функции в своих темах, так что это хорошее решение для меня. Спасибо за простую идею.
Майкл Эклунд
18

Пожалуйста, добавьте body_class () в ваше тело HTML

<body <?php body_class(); ?>>
   //your html code
</body>

Это добавит logged-inдля зарегистрированного пользователя, тогда вы можете использовать следующий код jquery для выполнения вашего пользовательского кода juqery только для зарегистрированного пользователя.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Монирул Ислам
источник
Я не знаю, почему за это проголосовали. Подход полностью действителен. +1
кайзер
Я не знаю. У меня такой же вопрос. Ответ действителен, но почему нет.
Monirul Islam
Гектометр Может быть, потому что он использует JQuery вместо правильного пути (с помощью фильтра и обратного вызова). Некоторые люди имеют аллергию на JQuery.
Кайзер
1
хорошо, но это не скажет фактическое состояние входа, если вы используете плагин кеширования с включенным кешем страниц.
Янош Сабо
6

Другой пример, если вы хотите использовать его для вызовов AJAX.

// Simplified... please note, that all names/vars/etc. in my class got unique names.
// ...the same goes for the script handler.
class wpse69814_example
{
    public $response;

    public function __construct()
    {
        add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'localize' ), 20 );
    }

    public function enqueue()
    {
        wp_enqueue_script(
            'wpse69814_handler',
            plugins_url( 'url/to/file.js', __FILE__ ),
            array( 'jquery' ),
            filemtime( plugins_dir_path( __FILE__ ).'/path/to/file.js' ),
            true
        );
    }

    public function localize()
    {
        wp_localize_script( 'wpse69814_handler, 'wpse69814_object', array(
            'ajaxurl'    => admin_url( 'admin-ajax.php' ),
            'ajax_nonce' => wp_create_nonce( 'wpse69814_nonce' ),
            'action'     => 'wpse69814-handler-action',
            'data'       => array(
               'is_user_logged_in' => is_user_logged_in(),
            )
         )

    }
}
кайзер
источник
Отметим, что этот подход не работает за CDN. : D
Брайан Фегтер
@BrianFegter Может, хотите объяснить (или отредактировать ) почему? :)
Кайзер
Так как CDN не аутентифицируется с WordPress, is_user_logged_inон будет кэшироваться как ложный в DOM при достижении источника. Состояние пользователя должно быть абстрагировано в поток без кэширования через XHR при использовании CDN. Подход @Mridul Aggarwal работает, но с заголовками без кеша в ответе.
Брайан Фегтер
@BrianFegter Хороший улов. Исправлено это ... я думаю. Проголосовал и другие ответы.
Кайзер
2

Обратите внимание, что ни один из приведенных выше примеров не является надежным, если вы используете плагин кэширования страниц, тогда код в теге body будет статическим. Также есть простой способ сделать это (без дополнительного запроса к ajax, который не является оптимальным)

Если вы хотите проверить состояние пользователя, вошедшего в систему с помощью javascript, вы можете использовать этот код для установки cookie-файлов при входе пользователя в систему и удаления cookie-файлов при выходе из системы. Добавьте это например. к вашей теме functions.php

function login_function() {
    setcookie('wp_user_logged_in', 1, time() + 31556926, '/');
    $_COOKIE['wp_user_logged_in'] = 1;
}
add_action('wp_login', 'login_function');

function logout_function() {
    unset($_COOKIE['wp_user_logged_in']);
    setcookie('wp_user_logged_in', null, -1, '/');
}
add_action('wp_logout', 'logout_function');

Тогда это простой тест cookie в javascript.

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}
Янош Сабо
источник
Это действительно довольно просто, надежно и в худшем случае выполняется почти сразу после загрузки страницы (если загрузка скрипта в нижний колонтитул без блокировки рендера) в отличие от других ответов. Ajax медленен, и полагаться на классы тела не удастся при кэшировании. Необходимо добавить этот файл cookie в текст Политики использования файлов cookie. Спасибо, Янос.
Рышард Йендрашик
Кроме того, существует проблема с синхронизацией файлов cookie WordPress по умолчанию и вновь созданных файлов cookie, доступных для сценариев, но я получил отличный и простой ответ о том, как ее решить: stackoverflow.com/questions/56208574/…
Рышард Йендрашик