我需要在登录按钮按下后立即同步我的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;