如何区分挂机PROFILE_UPDATE用户注册、用户重置密码或用户更新配置文件?

时间:2015-12-05 作者:Sasha Grievus

钩子

 profile_update
如果用户更新其个人资料,也就是在注册后第一次重置密码和注册时,就会被解雇。

我如何区分这三种情况?

编辑:至少有3种情况需要区分,其中称为钩子。

用户的第一个注册步骤用户填写电子邮件和用户名并保存(此处调用profile\\u update),收到验证过程中检查电子邮件的请求,用户在注册后重置密码。用户检查其邮件,按照建议的url,重置密码并保存(此处调用profile\\u update)

  • 用户更新其配置文件,用户登录并更新其配置文件中的一些数据并保存(此处调用profile\\u update)
      1. 我认为可以区分情况3,验证当前是否有人登录呼叫

        is_user_logged_in()
        
        区分案例2和案例1仍然存在问题。正如s\\u ha\\u dum指出的,可以检查user\\u activation\\u密钥。如果不是在时间1而是在时间2创建密钥,则可以区分这3种情况。(即使我个人认为钩子覆盖了太多的案例,也不应该)。

    2 个回复
    最合适的回答,由SO网友:s_ha_dum 整理而成

    从技术上讲,你不能。这个过滤器不会传递任何数据,特别允许你区分这两种情况。

    2086                    /**
    2087                     * Fires immediately after an existing user is updated.
    2088                     *
    2089                     * @since 2.0.0
    2090                     *
    2091                     * @param int    $user_id       User ID.
    2092                     * @param object $old_user_data Object containing user\'s data prior to update.
    2093                     */
    2094                    do_action( \'profile_update\', $user_id, $old_user_data );
    
    您注意到过滤器确实通过了$old_user_data 所以你可以检查user_activation_key 在里面the *_users table. 但是,我认为该字段是在用户重置密码时填充的,而不仅仅是在创建帐户时填充的。

    要绝对确定你可能需要set a user meta value 在第一次登录时,然后检查后续登录。

    SO网友:Sasha Grievus

    为了区分案例1和3,我实际使用了:

    add_action( \'profile_update\', \'when_profile_update\', 10, 2 );
    function when_profile_update( $user_id, $old_user_data ) {
        if (is_user_logged_in()) { 
            // Updating profile info when logged in 
        }else{ 
            if (empty($old_user_data->user_activation_key)) { 
                  // Registering
            }
        }
    }
    
    此时,在my site profile\\u中,密码重置不会触发更新,因此案例2不会发生。

    相关推荐

    Hooks are not executing

    根据我对钩子的理解,您可以通过do\\u action(“hook\\u name”)创建一个钩子;然后向所述钩子中添加一些内容,并在希望它执行钩子的位置调用该方法,因此:public function hook_name(){ do_action(\'hook_name\'); } 有些地方你会做类似的事情:add_action(\'hook_name\', \'some_hook\'); 然后在主题中的一些地方,你称之为:hook_name();