检查用户是否使用JQuery登录


Answers:


26

如果您想知道用户当前是否已登录。其他答案检查页面加载时用户是否已登录,而不是运行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'Oct

我把jQuery.post放在jQuery click handler中,但这不起作用。你有解决的办法吗?
菲拉斯·奥德

我看到控制台中未定义ajaxurl。
菲拉斯·奥德

1
[codex](codex.wordpress.org/AJAX_in_Plugins)表示,在最新的wordpress版本中,已经对此进行了定义。也许您可以使用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 Studio

我喜欢只检查身体logged-in上课的想法。只需确保使用主题即可body_class();get_body_class();否则,这不是一个超级可靠的解决方案。虽然,我在主题中使用了这些功能,但这对我来说是一个很好的解决方案。感谢您的简单想法。
Michael Ecklund '17

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

我不知道。我有同样的问题。答案是有效的,但为什么要投反对票。
Monirul Islam

嗯 也许是因为它使用jQuery而不是正确的方式(使用过滤器和回调)。有些人对jQuery过敏。
kaiser 2014年

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好收获。解决了...我想。还提出了其他答案。
kaiser

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策略文本中。谢谢Janos。
RyszardJędraszyk19年

作为一项后续行动,没有与默认的WordPress饼干同步和新创建的脚本访问的cookie的一个问题,但我已经收到了关于如何解决成为一个伟大的和简单的答案:stackoverflow.com/questions/56208574/...
RyszardJędraszyk19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.