当我添加认证过滤器时,注销过程变得非常慢


Wordpress: when I added an authenticate filter, the logout process got really slow

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

基本上我是这样做的:

function intercetta_login($user, $username, $password) {
    global $ecommerceFrontend;
    $ecommerceFrontend->intercetta_login($username);
    return $user;
}
add_filter( 'authenticate', 'intercetta_login', 30, 3 );

一切都如预期的那样,我对此非常满意。问题是退出登录。当此过滤器为ON时,注销大约需要两分钟。当我关闭它需要几秒钟(基于连接速度,我不介意数秒,只是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),该函数以登录错误结束(用户不存在)。我相信这是以后发生的,我需要我的更新东西之前Wordpress做正常的身份验证。

那么问题1是:为什么我的第一个解决方案有效,但需要永远退出?

问题2是:为什么解决方案2的时间不对?我应该通过调整时间来利用它吗?

提前感谢各位!

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

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'…)在注销期间也被调用。请注意,我花了很多时间才弄明白。

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

过滤器'authenticate'被调用,即使只是访问URL与/wp-login.php

所以最好检查$username$password在函数开始时是否为空。

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