Überprüfen Sie, ob der Benutzer mit JQuery angemeldet ist

17

Ich möchte benutzerdefinierten Abfragecode ausführen, der dem Benutzer den Anmeldedialog anzeigt, wenn er auf eine Schaltfläche klickt und nicht angemeldet ist. Wie kann ich das tun?

Feras Odeh
quelle

Antworten:

26

Wenn Sie wissen möchten, ob der Benutzer gerade angemeldet ist. Die anderen Antworten prüfen, ob der Benutzer angemeldet ist oder nicht, wenn die Seite nicht geladen wurde, wenn Sie das Javascript ausführen. Der Benutzer könnte sich beispielsweise in einer separaten Registerkarte angemeldet haben

Tragen Sie dies in Ihr Javascript ein

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

Gib das in deine functions.php ein

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
quelle
Was ist der Wert von Ajaxurl?
Feras Odeh
wordpress setzt es auf 'yoursite.com/wp-admin/admin-ajax.php'. Das ist die URL, an die alle Ajax-Anfragen gesendet werden sollen
Mridul Aggarwal
Ich habe den jQuery.post in den jquery click handler eingefügt, aber das funktioniert nicht. Hast du eine Idee, wie man es löst?
Feras Odeh
Ich habe gesehen, dass Ajaxurl nicht in der Konsole definiert ist.
Feras Odeh
1
[codex] (codex.wordpress.org/AJAX_in_Plugins) gab an, dass dies in den neuesten WordPress-Versionen bereits definiert ist. Vielleicht können Sie Ihre eigene Version von Ajaxurl mit wp_localize_script definieren
Mridul Aggarwal
32

Überprüfen Sie das classAttribut für body: Wenn das Thema verwendet wird, verfügt body_class()der Textkörper über eine Klasse mit Namen logged-infür angemeldete Benutzer. Beachten Sie, dass die Funktion auch für das Element verwendet htmlwerden kann.

Beispiel

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

Sie können is_user_logged_in()das Skript auch nur als Bedingung zum Einreihen oder Drucken verwenden.

fuxia
quelle
Bestnoten für diese Antwort - einfach und effektiv.
Q Studio
Ich mag die Idee, nur den Körper auf logged-inKlasse zu überprüfen . Müssen nur sicher sein , dass Themen verwenden body_class();oder get_body_class();andernfalls , dass kein Super zuverlässige Lösung ist. Obwohl ich diese Funktionen in meinen Themen verwende, ist das eine gute Lösung für mich. Danke für die einfache Idee.
Michael Ecklund
18

Bitte fügen Sie body_class () zu Ihrem HTML-Body hinzu

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

Dies wird logged-infür angemeldete Benutzer hinzugefügt. Anschließend können Sie den folgenden jquery-Code verwenden, um Ihren benutzerdefinierten juqery-Code nur für angemeldete Benutzer auszuführen.

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}
Monirul Islam
quelle
Ich weiß nicht, warum für diesen hier nicht abgestimmt wurde. Ansatz ist voll gültig. +1
Kaiser
Ich weiß es nicht. Ich habe die gleiche frage Die Antwort ist gültig, aber warum abstimmen.
Monirul Islam
Hm. Vielleicht, weil es jQuery anstelle des richtigen Weges verwendet (mit einem Filter und dem Rückruf). Einige Menschen sind allergisch gegen jQuery.
Kaiser
1
gut, aber es würde nicht den aktuellen Anmeldestatus anzeigen, wenn Sie ein Cache-Plugin mit aktiviertem Seiten-Cache verwenden.
Janos Szabo
6

Ein weiteres Beispiel, falls Sie es für AJAX-Aufrufe verwenden möchten.

// 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
quelle
Zu beachten ist, dass dieser Ansatz hinter CDN nicht funktioniert. : D
Brian Fegter
@BrianFegter Möchten Sie möglicherweise erklären (oder bearbeiten ), warum? :)
Kaiser
Da sich das CDN nicht bei WordPress authentifiziert, is_user_logged_inwird es im DOM als false zwischengespeichert, wenn der Ursprung erreicht wird. Der Benutzerstatus sollte bei Verwendung eines CDN über XHR an einen No-Cache-Thread abstrahiert werden. @Mridul Aggarwals Ansatz funktioniert, die Antwort enthält jedoch keine Cache-Header.
Brian Fegter
@ BrianFegter Guter Fang. Repariert das ... denke ich. Auch andere Antworten wurden positiv bewertet.
Kaiser
2

Bitte beachten Sie, dass keines der obigen Beispiele zuverlässig ist, wenn Sie ein Seiten-Cache-Plugin verwenden. Der Code im Body-Tag ist dann statisch. Es gibt auch eine einfache Möglichkeit, dies zu tun (ohne zusätzliche Ajax-Abfrage, die nicht optimal ist).

Wenn Sie den Status des angemeldeten Benutzers mit Javascript testen möchten, können Sie diesen Code verwenden, um das Cookie beim Anmelden des Benutzers zu setzen und das Cookie beim Abmelden des Benutzers zu löschen. Fügen Sie dies zB. zu deinem Theme 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');

Dann ist es ein einfacher Test von Cookies in 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
quelle
Dies ist in der Tat ziemlich einfach, zuverlässig und wird im schlimmsten Fall im Gegensatz zu anderen Antworten fast sofort nach dem Laden der Seite ausgeführt (wenn das Skript in der Fußzeile geladen wird, ohne die Blockierung zu rendern). Ajax ist langsam und das Verlassen auf Körperklassen schlägt beim Cachen fehl. Sie müssen dieses Cookie zum Cookie-Richtlinientext hinzufügen. Vielen Dank, Janos.
Ryszard Jędraszyk
Als Folge davon gibt es ein Problem mit der Synchronisierung von WordPress-Standardcookies und neu erstellten Cookies, auf die über Skripte zugegriffen werden kann
Ryszard Jędraszyk