사용자가 JQuery를 사용하여 로그인했는지 확인


17

버튼을 클릭했는데 로그인하지 않은 경우 사용자에게 로그인 대화 상자를 표시하는 사용자 정의 jquery 코드를 실행하고 싶습니다. 어떻게 할 수 있습니까?

답변:


26

현재 사용자가 로그인했는지 알고 싶을 때. 다른 답변은 자바 스크립트를 실행하는 시간이 아닌 페이지가로드 될 때 사용자가 로그인했는지 여부를 확인합니다. 예를 들어 사용자가 별도의 탭에 로그인했을 수 있습니다

이것을 자바 스크립트에 넣으십시오.

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
    }
});

이것을 당신의 함수에 넣으십시오.

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

워드 프레스는 'yoursite.com/wp-admin/admin-ajax.php'로 설정합니다. 즉 모든 아약스 요청을 전송 해야하는되는 URL을
Mridul 가르 왈

jQuery 클릭 핸들러 안에 jQuery.post를 넣었지만 작동하지 않습니다. 그것을 해결하는 방법을 알고 있습니까?
Feras Odeh

콘솔에 ajaxurl이 정의되어 있지 않은 것을 보았습니다.
Feras Odeh

1
[codex] (codex.wordpress.org/AJAX_in_Plugins)는 최신 워드 프레스 버전에서 이미 정의되어 있다고 말했습니다. 어쩌면 당신은 wp_localize_script과 ajaxurl의 자신의 버전을 정의 할 수 있습니다
Mridul 가르 왈에게

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();그렇지 않으면 확실하게 신뢰할 수있는 솔루션이 아닙니다. 테마에서 이러한 기능을 사용하기 때문에 좋은 해결책입니다. 간단한 아이디어에 감사드립니다.
Michael Ecklund

18

HTML 본문에 body_class ()를 추가하십시오

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

이것은 logged-in로그 된 사용자를 추가 한 다음 다음 jquery 코드를 사용하여 로그 된 사용자에 대해서만 사용자 정의 juqery 코드를 실행할 수 있습니다.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}

나는 이것이 왜 투표에 실패했는지 모르겠다. 접근이 완전히 유효합니다. +1
kaiser

몰라요 나도 같은 질문이 있습니다. 대답은 유효하지만 왜 투표하지 않습니까?
Monirul Islam

흠. 필터와 콜백을 사용하여 올바른 방법 대신 jQuery를 사용하기 때문일 수 있습니다. 어떤 사람들은 jQuery에 알레르기가 있습니다.
카이저

1
좋지만 페이지 캐시가 활성화 된 캐시 플러그인을 사용하면 실제 로그인 상태를 알 수 없습니다.
Janos Szabo

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
Brian Fegter

@BrianFegter 이유 를 설명하거나 편집 하고 싶 습니까? :)
kaiser

CDN은 WordPress로 인증하지 않으므로 is_user_logged_in원본이 적중하면 DOM에서 false로 캐시됩니다. CDN을 사용할 때 XHR을 통해 사용자 상태가 캐시없는 스레드로 추상화되어야합니다. @Mridul Aggarwal의 접근 방식은 작동하지만 응답에 캐시 없음 헤더가 있습니다.
Brian Fegter

@BrianFegter 잘 잡았습니다. 고쳤다 .. 다른 답변도 찬성했습니다.
카이저

2

페이지 캐시 플러그인을 사용하는 경우 위의 예 중 어느 것도 신뢰할 수 없으므로 body 태그의 코드는 정적입니다. 또한이 작업을 수행하는 간단한 방법이 있습니다 (아약스에 대한 추가 쿼리가 없으므로 최적이 아닙니다)

javascript로 로그인 한 사용자를 테스트하려면이 코드를 사용하여 사용자가 로그인 할 때 쿠키를 설정하고 사용자가 로그 아웃 할 때 쿠키를 삭제할 수 있습니다. 이것을 예를 들어 추가하십시오. 당신의 테마 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');

그런 다음 자바 스크립트에서 쿠키를 테스트합니다.

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}

이것은 실제로 매우 간단하고 안정적이며 최악의 경우 다른 답변과 달리 페이지로드 후 거의 즉시 실행됩니다 (렌더 차단없이 바닥 글에 스크립트를로드하는 경우). Ajax가 느리고 바디 클래스에 의존하면 캐싱에 실패합니다. 이 쿠키를 쿠키 정책 텍스트에 추가해야합니다. 고맙습니다 Janos.
Ryszard Jędraszyk

후속 조치로 기본 WordPress 쿠키와 새로 만든 스크립트 액세스 가능 쿠키의 동기화에 문제가 있지만이를 해결하는 방법에 대한 위대하고 간단한 답변을 받았습니다 : stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.