Compruebe si el usuario ha iniciado sesión con JQuery

17

Quiero ejecutar un código jquery personalizado que muestre el diálogo de inicio de sesión al usuario si hace clic en un botón y no está conectado. ¿Cómo podría hacer eso?

Feras Odeh
fuente

Respuestas:

26

En caso de que desee saber si el usuario ha iniciado sesión en el momento actual. Las otras respuestas verifican si el usuario ha iniciado sesión o no cuando la página se cargó, no cuando está ejecutando JavaScript. El usuario podría haber iniciado sesión en una pestaña separada, por ejemplo

Pon esto en tu 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
    }
});

pon esto en tus funciones.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
fuente
¿Cuál es el valor de ajaxurl?
Feras Odeh
WordPress lo establece en 'yoursite.com/wp-admin/admin-ajax.php'. Esa es la url en la que se supone que deben enviarse todas las solicitudes de ajax
Mridul Aggarwal
Puse el jQuery.post dentro del controlador de clic jquery, pero esto no funciona. ¿Tienes alguna idea de cómo resolverlo?
Feras Odeh
Vi que ajaxurl no está definido en la consola.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) dijo que en las últimas versiones de WordPress esto ya está definido. Tal vez pueda definir su propia versión de ajaxurl con wp_localize_script
Mridul Aggarwal
32

Verifique el classatributo para body: Si el tema está usando body_class()el cuerpo tiene una clase nombrada logged-inpara los usuarios que han iniciado sesión. Tenga en cuenta que la función también se puede usar en el elemento html.

Ejemplo

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

También puede usarlo is_user_logged_in()como condición para poner en cola o imprimir el guión.

fuxia
fuente
Las mejores calificaciones para esta respuesta: simple y eficaz.
Q Studio
Me gusta la idea de simplemente revisar el cuerpo para la logged-inclase. Solo tengo que estar seguro de que los temas usan body_class();o de lo get_body_class();contrario, esa no es una solución súper confiable. Aunque utilizo esas funciones en mis temas, es una buena solución para mí. Gracias por la simple idea.
Michael Ecklund
18

Agregue body_class () a su cuerpo html

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

Esto se agregará logged-inpara el usuario registrado, luego puede usar el siguiente código jquery para ejecutar su código juqery personalizado solo para el usuario registrado.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Monirul Islam
fuente
No sé por qué este fue rechazado. El enfoque es totalmente válido. +1
kaiser
No lo sé. Tengo la misma pregunta La respuesta es válida, pero ¿por qué votar?
Monirul Islam
Hm. Tal vez porque usa jQuery en lugar de la forma correcta (usando un filtro y la devolución de llamada). Algunas personas son alérgicas a jQuery.
Kaiser
1
bien, pero no indicaría el estado de inicio de sesión real si utiliza un complemento de caché con caché de página habilitado.
Janos Szabo
6

Otro ejemplo, en caso de que quiera usarlo para llamadas 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(),
            )
         )

    }
}
emperador
fuente
Para tener en cuenta, este enfoque no funciona detrás de CDN. : D
Brian Fegter
@BrianFegter ¿Podría querer explicar (o editarlo ) por qué? :)
kaiser
Dado que el CDN no se autentica con WordPress, is_user_logged_inse almacenará en caché como falso en el DOM cuando se golpee el origen. El estado del usuario debe extraerse a un subproceso sin caché a través de XHR cuando se utiliza un CDN. El enfoque de @Mridul Aggarwal funciona pero con encabezados sin caché en la respuesta.
Brian Fegter
@BrianFegter Buena captura. Arreglado eso ... creo. Votaron otras respuestas también.
kaiser
2

Tenga en cuenta que ninguno de los ejemplos anteriores es confiable en caso de que use un complemento de almacenamiento en caché de página, entonces el código en la etiqueta del cuerpo será estático. También hay una manera simple de hacer esto (sin consulta adicional a ajax que no es óptima)

Si desea probar el estado de inicio de sesión del usuario con javascript, puede usar este código para configurar la cookie cuando el usuario inició sesión y eliminar la cookie cuando el usuario cerró la sesión. Agregue esto, por ejemplo. a su 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');

Entonces es una prueba simple de cookie en 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
fuente
De hecho, esto es bastante simple, confiable y, en el peor de los casos, se ejecuta casi instantáneamente después de la carga de la página (si carga el script en el pie de página sin el bloqueo de renderizado) a diferencia de otras respuestas. Ajax es lento y depender de las clases corporales fallará en el almacenamiento en caché. Es necesario agregar esta cookie al texto de la Política de cookies. Gracias Janos
Ryszard Jędraszyk
Como seguimiento, hay un problema con la sincronización de las cookies predeterminadas de WordPress y la cookie accesible con script recién creada, pero he recibido una respuesta excelente y simple sobre cómo resolverla: stackoverflow.com/questions/56208574/…
Ryszard Jędraszyk