Wordpress:当我添加一个身份验证过滤器时,注销过程非常慢

时间:2015-07-09 11:13:25

标签: php wordpress

我需要在按下登录按钮后立即将我的WP与ERP同步。基本上你输入用户名和密码,在Wordpress完成它必须做的事情之前我会执行一些操作。

基本上我这样做了:

function intercetta_login($user, $username, $password) {

    global $ecommerceFrontend;
    $ecommerceFrontend->intercetta_login($username);

    return $user;
}
add_filter( 'authenticate', 'intercetta_login', 30, 3 );

一切都按预期工作,我对此非常满意。问题是退出。当此过滤器开启时,注销大约需要两分钟。当我关闭它时需要几秒钟(根据连接速度我不介意计算秒数,只是2分钟让我想到一个问题)。

我做了另一个测试:

function intercetta_login($user) {

    $username = $user->data->user_login;

    global $ecommerceFrontend;
    $ecommerceFrontend->intercetta_login($username);

    return $user;
}   
add_filter('wp_authenticate_user', 'intercetta_login', 10, 1);  

在这种情况下,注销过程看起来很好,但这不能正常工作:如果ERP上存在用户(但在Wordpress上不存在),则该函数最终会出现登录错误(用户dosn')存在)。我相信它会在以后发生,我需要在Wordpress执行正常的身份验证之前更新内容。

所以问题1是:为什么我的第一个解决方案有效,但需要永远注销?

问题2是:为什么解决方案2的时机错误?我应该通过修正时间来使用它吗?

先谢谢你们!

2 个答案:

答案 0 :(得分:0)

我可能找到了解决方法。注销非常慢,因为在注销期间也调用了我的函数。我不知道,但基本上我也在注销期间进入我的循环,这导致了问题。所以基本上我用这种方式编辑代码:

function intercetta_login($user, $username, $password) {

    if (!$_GET['loggedout']) {

        global $ecommerceFrontend;
        $ecommerceFrontend->intercetta_login($username);
    }

    return $user;
}
add_filter( 'authenticate', 'intercetta_login', 30, 3 );

基本上在注销期间有一个$ _GET变量集,如果你正确地排除了这个变量,你就不用输入自定义更新功能了。

这不是很棒,但有效。

我学到了什么:在注销期间也会调用add_filter('authenticate'...)。要注意这一点,我花了很多时间来弄明白。

如果有人有更好的解决方案,请随时回答。

答案 1 :(得分:0)

即使仅使用/wp-login.php访问URL,也会调用过滤器“验证”。

因此,最好在函数开始时检查$username$password是否为空。

if ($username == '' || $password == '') return $user;