我需要在按下登录按钮后立即将我的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的时机错误?我应该通过修正时间来使用它吗?
先谢谢你们!
答案 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;