Verifique se o usuário está logado usando JQuery

17

Quero executar o código jquery personalizado que mostra a caixa de diálogo de login do usuário se ele clicar em um botão e ele não estiver conectado. Como eu poderia fazer isso?

Feras Odeh
fonte

Respostas:

26

Caso você queira saber se o usuário está logado no momento atual. As outras respostas verificam se o usuário está logado ou não quando a página carregou e não o momento em que você está executando o javascript. O usuário pode ter feito login em uma guia separada, por exemplo

Coloque isso no seu 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
    }
});

coloque isso em suas funções.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');
Mridul Aggarwal
fonte
Qual é o valor de ajaxurl?
Feras Odeh
O wordpress define como 'yoursite.com/wp-admin/admin-ajax.php'. Essa é a url em que todas as requisições Ajax são supostamente para ser enviado
Mridul Aggarwal
Coloquei o jQuery.post dentro do manipulador de cliques do jquery, mas isso não funciona. você tem alguma idéia de como resolvê-lo?
Feras Odeh
Vi que o ajaxurl não está definido no console.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) disse que nas últimas versões do wordpress isso já está definido. Talvez você possa definir sua própria versão do ajaxurl com wp_localize_script
Mridul Aggarwal
32

Verifique o classatributo para body: Se o tema estiver usando body_class()o corpo, há uma classe nomeada logged-inpara usuários que estão conectados. Lembre-se de que a função também pode ser usada no elemento html.

Exemplo

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

Você também pode usar apenas is_user_logged_in()como condição para enfileirar ou imprimir o script.

fuxia
fonte
notas máximas para esta resposta - simples e eficaz.
Q Estúdio
Eu gosto da idéia de apenas verificar o corpo quanto à logged-inaula. Só precisa ter certeza de que os temas usam body_class();ou get_body_class();Caso contrário, essa não é uma solução super confiável. Embora eu use essas funções nos meus temas, essa é uma boa solução para mim. Obrigado pela idéia simples.
Michael Ecklund
18

Adicione body_class () ao seu corpo html

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

Isso adicionará logged-inao usuário logado e você poderá usar o seguinte código jquery para executar seu código juqery personalizado apenas para o usuário logado.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Monirul Islam
fonte
Não sei por que este foi rejeitado. A abordagem é totalmente válida. +1
kaiser
Eu não sei. Eu tenho a mesma pergunta. A resposta é válida, mas por que voto negativo.
Monirul Islam
Hum. Talvez porque use jQuery em vez do caminho certo (usando um filtro e o retorno de chamada). Algumas pessoas são alérgicas ao jQuery.
Kaiser
1
bom, mas não informa o estado real do login se você usar um plug-in de cache com o cache da página ativado.
Janos Szabo
6

Outro exemplo, caso você queira usá-lo para chamadas 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(),
            )
         )

    }
}
kaiser
fonte
Para observar, essa abordagem não funciona atrás da CDN. : D
Brian Fegter
@BrianFegter Talvez queira explicar (ou editá- lo) por quê? :)
kaiser
Como a CDN não se autentica com o WordPress, is_user_logged_inserá armazenada em cache como DOM no DOM quando a origem for atingida. O estado do usuário deve ser abstraído para um thread sem cache via XHR ao usar uma CDN. A abordagem de @Mridul Aggarwal funciona, mas com cabeçalhos sem cache na resposta.
Brian Fegter
@BrianFegter Good catch. Corrigido isso ... eu acho. Também votaram outras respostas.
Kaiser #
2

Observe que nenhum dos exemplos acima é confiável, caso você use um plug-in de cache de página, o código na tag body será estático. Também existe uma maneira simples de fazer isso (sem consulta extra ao ajax que não seja ideal)

Se você deseja testar o estado de logon do usuário com javascript, pode usar este código para definir o cookie quando o usuário efetuou login e excluir o cookie quando o usuário efetuou logout. Adicione isto, por exemplo. ao seu tema 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');

Então é um teste simples de cookie em javascript.

if (document.cookie.indexOf('wp_user_logged_in') !== -1) {
    //do something when user logged in
} else {
    //do something when user logged out
}
Janos Szabo
fonte
Isso é realmente muito simples, confiável e, na pior das hipóteses, é executado quase instantaneamente após o carregamento da página (se o carregamento do script no rodapé sem bloqueio de renderização) é diferente de outras respostas. O Ajax é lento e a dependência de classes corporais falhará no cache. Precisa adicionar este cookie ao texto da Política de Cookies. Obrigado Janos.
Ryszard Jędraszyk
Como acompanhamento, há um problema com a sincronização dos cookies padrão do WordPress e do cookie acessível por script recém-criado, mas recebi uma resposta excelente e simples sobre como resolvê-lo: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk