我想执行自定义的jquery代码,如果他单击按钮但未登录,则会向用户显示登录对话框。该怎么办?

#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 br />
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的值是什么?

– Feras Odeh
2012年10月24日19:22

WordPress将其设置为“ yoursite.com/wp-admin/admin-ajax.php”。这是所有ajax请求都应发送到的网址

– Mridul Aggarwal
2012年10月24日19:25

我把jQuery.post放在jQuery click handler中,但这不起作用。你有什么解决的办法吗?

– Feras Odeh
2012年10月24日19:28

我看到控制台中未定义ajaxurl。

– Feras Odeh
2012年10月24日19:34

[codex](codex.wordpress.org/AJAX_in_Plugins)表示,在最新的wordpress版本中,已经对此进行了定义。也许您可以使用wp_localize_script定义自己的ajaxurl版本

– Mridul Aggarwal
2012年10月24日19:45

#2 楼

检查classbody属性:如果主题使用的是body_class(),则该主体具有一个名为logged-in的登录用户类。请注意,该函数也可以在元素html上使用。 />
if(jQuery('body').hasClass('logged-in')){
    // Do something
}

使用纯JavaScript的示例:
if (document.body.classList.contains('logged-in')) {
    // do something
}

您也可以使用is_user_logged_in()作为入队或打印脚本的条件。

评论


此答案的最高得分-简单有效。

– Q Studio
13年7月20日在21:12

我喜欢只检查正文是否已登录的想法。只需确保主题使用body_class();即可。或get_body_class();否则,那不是一个超级可靠的解决方案。虽然,我在主题中使用了这些功能,但这对我来说是一个很好的解决方案。感谢您的简单想法。

–迈克尔·埃克伦德(Michael Ecklund)
17年2月16日在17:22

#3 楼

请将body_class()添加到您的html body

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


这将为登录用户添加logged-in,然后您可以使用以下jquery代码仅对登录用户执行自定义juqery代码。

if ($('body').hasClass('logged-in')) {
       //execute your jquery code.
}


评论


我不知道为什么这个被否决。方法是完全有效的。 +1

– kaiser
13年12月31日在11:54

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

– Monirul伊斯兰教
2014年1月22日下午4:42

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

– kaiser
2014年1月22日14:28

很好,但是如果您使用启用了页面缓存的缓存插件,它不会告诉实际登录状态。

–贾诺斯·萨博(Janos Szabo)
18 Mar 19 '18在7:29

#4 楼

另一个示例,如果您想将其用于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
13年12月30日在16:21

@BrianFegter可能想解释(或对其进行编辑)为什么? :)

– kaiser
2013年12月31日0:52



由于CDN不会通过WordPress进行身份验证,因此在击中源时,is_user_logged_in将在DOM中缓存为false。使用CDN时,应通过XHR将用户状态抽象为无缓存线程。 @Mridul Aggarwal的方法有效,但是响应中没有缓存头。

– Brian Fegter
2013年12月31日下午5:42

@BrianFegter好收获。解决了...我想。还提出了其他答案。

– kaiser
2013年12月31日11:54



#5 楼

请注意,如果您使用页面缓存插件,上述示例都不可靠,那么body标签中的代码将是静态的。还有一种简单的方法(没有多余的查询不是最佳的ajax)

如果要测试使用javascript登录的用户,可以在以下情况下使用此代码设置cookie用户登录,并在用户注销时删除cookie。添加此例如。主题功能。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进行简单测试。

评论


与其他答案不同,这确实非常简单,可靠,在最坏的情况下,页面加载后几乎立即执行(如果在页脚中加载脚本而没有渲染阻塞)。 Ajax速度很慢,依赖正文类将导致缓存失败。需要将此Cookie添加到Cookie策略文本中。谢谢亚诺斯。

– RyszardJędraszyk
19-4-19的0:13



作为后续措施,默认WordPress cookie和新创建的脚本可访问cookie的同步存在问题,但是我收到了一个关于如何解决它的简单好答案:stackoverflow.com/questions/56208574/…

– RyszardJędraszyk
19年5月27日,下午3:58

#6 楼

我很欣赏所有答案,但是在我看来,本地化脚本或检查css类不是最佳实践,因为css类检查不是100%可靠的,并且顾名思义,本地化脚本功能是本地化。 />
在Wordpress 4.5之后,最好的解决方案是添加如下内联脚本:

 <?php

function detect_login() {
  $isLoggedIn = is_user_logged_in();
  wp_register_script( 'detect_login', '' );
  wp_enqueue_script( 'detect_login');
  wp_add_inline_script( 'detect_login', "var isLoggedIn = $isLoggedIn" );
}

add_action( 'wp_enqueue_scripts', 'detect_login' );
 


然后显然检查全局范围,该范围现在被我们的全局变量isLoggedIn污染,如下所示:window.isLoggedIn

评论


这就是wp_localize_script()所做的。

–雅各布·皮蒂(Jacob Peattie)
20 Feb 17'0:51

@JacobPeattie是的,他们创建wp_add_inline_script()的原因是为了避免人们使用本地化脚本函数来声明全局变量。顾名思义,这是一个更好的选择,如果我们有一个不错的选择,为什么还要使用最初不打算用于此目的的其他内容?

–梅尔·马卡洛索(Mel Macaluso)
20-2-17在9:24

那不是它的目的。添加它是为了支持在脚本之前或之后添加少量可执行代码,以支持诸如字体加载器之类的功能。 make.wordpress.org/core/2016/03/08/…

–雅各布·皮蒂(Jacob Peattie)
20-2-17在9:28

完全是@JacobPeattie,并且为wp_localize_script()字符串添加了什么?用全局变量污染全局范围?还是真正顾名思义地本地化?

–梅尔·马卡洛索(Mel Macaluso)
20-2-17在10:06



你在说什么? wp_localize_script强制您在对象内对变量进行命名空间。您自己的答案是在没有任何名称空间的情况下将变量添加到全局范围。

–雅各布·皮蒂(Jacob Peattie)
20-2-17在10:27