Перевірте, чи користувач увійшов у систему за допомогою JQuery


18

Я хочу виконати спеціальний код jquery, який показує діалогове вікно для входу користувача, якщо він натискає кнопку, а він не входить у систему. Як я можу це зробити?

Відповіді:


27

У випадку, якщо ви хочете знати, чи користувач увійшов у поточний момент. Інші відповіді перевіряють, чи користувач увійшов чи ні, коли сторінка завантажується не час, коли ви запускаєте 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
    }
});

помістіть це у свої функції.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?
— Feras Odeh

wordpress встановлює його на "yoursite.com/wp-admin/admin-ajax.php". Ось така URL-адреса, на яку повинні бути надіслані всі запити на аякс
— Mridul Aggarwal

Я поміщаю jQuery.post всередину обробника клацань jquery, але це не працює. у вас є ідеї, як це вирішити?
— Feras Odeh

Я бачив, що ajaxurl не визначений у консолі.
— Feras Odeh

1
[codex] (codex.wordpress.org/AJAX_in_Plugins) сказав, що в останніх версіях wordpress це вже визначено. Можливо, ви можете визначити власну версію ajaxurl за допомогою wp_localize_script
— Mridul 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
— кайзер

Не знаю. У мене те саме питання. Відповідь справедлива, але чому голосувати проти.
— Монірул Іслам

Гм. Можливо тому, що він використовує 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

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

Якщо ви хочете перевірити, як користувач увійшов у стан за допомогою JavaScript, ви можете використовувати цей код для встановлення файлу cookie під час входу користувача та видалення файлу cookie під час виходу з нього. Додайте це, наприклад. до ваших тематичних функцій.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/…
— Рішард Єдрашик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.