Перевірте, чи користувач увійшов у систему за допомогою 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.