ユーザーがJQueryを使用してログインしているかどうかを確認します


17

ユーザーがボタンをクリックしてログインしていない場合に、ユーザーにログインダイアログを表示するカスタムjqueryコードを実行したいのですが、どうすればよいですか?

回答:


26

ユーザーが現時点でログインしているかどうかを知りたい場合。もう1つの答えは、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
    }
});

あなたのfunctions.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の価値は何ですか?
フェラスオーデ

wordpressは「yoursite.com/wp-admin/admin-ajax.php」に設定します。これは、すべてのAjaxリクエストが送信されるURLです。
Mridul Aggarwal

jQuery.postをjqueryクリックハンドラ内に配置しましたが、これは機能しません。それを解決する方法はありますか?
フェラスオーデ

コンソールでajaxurlが定義されていないことがわかりました。
フェラスオーデ

1
[codex](codex.wordpress.org/AJAX_in_Plugins)は、最新のワードプレスバージョンでは既に定義されていると述べています。たぶん、wp_localize_scriptを使用して独自のバージョンのajaxurlを定義できます
Mridul Aggarwal

32

次のclass属性を確認しますbody。テーマがbody_class()ボディを使用している場合、logged-inログインしているユーザーに名前の付いたクラスがあります。この関数は要素でhtmlも使用できることに注意してください。

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

またis_user_logged_in()、スクリプトをエンキューまたは印刷するための条件として使用することもできます。


この答えのトップマーク-シンプルで効果的。
Qスタジオ

体の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
kaiser

知りません。同じ質問があります。回答は有効ですが、なぜ反対票を投じますか。
モニールイスラム14年

ふむ たぶん、正しい方法ではなくjQueryを使用しているためです(フィルターとコールバックを使用)。jQueryにアレルギーの人もいます。
カイザー

1
良いですが、ページキャッシュを有効にしてキャッシュプラグインを使用する場合、実際のログイン状態を通知しません。
ヤーノシュ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
ブライアンフェッター

@BrianFegter なぜ説明したい(または編集したい)のでしょうか?:)
kaiser

CDNはWordPressで認証されないため、is_user_logged_inオリジンがヒットするとDOMでfalseとしてキャッシュされます。CDNを使用する場合、XHRを介してユーザー状態をキャッシュなしスレッドに抽象化する必要があります。@Mridul Aggarwalのアプローチは機能しますが、応答にキャッシュなしヘッダーがあります。
ブライアンフェクター

@BrianFegter良いキャッチ。それを修正した...私は思う。他の回答も支持しました。
カイザー

2

上記の例はいずれも、ページキャッシュプラグインを使用する場合に信頼性がないため、bodyタグのコードは静的であることに注意してください。また、これを行う簡単な方法があります(最適ではないajaxへの余分なクエリはありません)

javascriptでユーザーのログイン状態をテストする場合は、このコードを使用して、ユーザーがログインしたときにcookieを設定し、ユーザーがログアウトしたときにcookieを削除できます。これを追加してください。テーマの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');

次に、JavaScriptでのCookieの簡単なテスト。

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 Policyテキストに追加する必要があります。ありがとう、ヤノス。
リザード・イドラシュク

フォローアップとして、デフォルトのワードプレスのクッキーの同期や、新しく作成したスクリプトがアクセス可能なクッキーに問題がありますが、私はそれを解決する方法についての素晴らしいと簡単な答えを受け取った:stackoverflow.com/questions/56208574/...を
RyszardJędraszyk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.