我有两个Wordpress插件,这两个插件的作者拒绝承认冲突/问题是他们的网站,但很明显,双方都可以很容易地解决问题.
我提供了一个插件作者的修复程序,它对插件没有任何负面影响,如果该人安装了第二个插件,它不会导致任何问题,但他们不会将修复程序添加到他们的插件中,即使它增加了与不同插件的兼容性.
我无法弄清楚如何修复第二个插件,但我知道需要做什么......
插件1的片段(我提供了一个解决方案)/* check if the user is valid */ if ( true === wlm_admin_in_admin() || true === $special_bypass ) { $validuser = username_exists( $data['username'] ); if ( ! $validuser ) { $validuser = email_exists( $data['email'] ); $user_info = get_userdata( $validuser ); $data['username'] = $user_info->user_login; } $data['password'] = __( 'Already assigned', 'wishlist-member' ); } else { $validuser = wp_login( $data['username'], $data['password'] ); } if ( $validuser ) { $user = $this->Get_UserData( 0, $data['username'] ); /* check for blacklist status */ $blacklist = $this->CheckBlackList( $user->user_email ); }
现在,如果找到这条线:
$validuser = wp_login( $data['username'], $data['password'] );
并替换为:
//$validuser = wp_login( $data['username'], $data['password'] ); $tmpvaliduser = username_exists( $data['username'] ); if ($tmpvaliduser) $validuser = wp_login( $data['username'], $data['password'] ); if ( ! $validuser || !$tmpvaliduser) { if((!$data['email']) && !(false === strrpos($data['username'], "@")) ) { $validuser = email_exists( $data['username'] ); $user_info = get_userdata( $validuser ); $data['username'] = $user_info->user_login; $validuser = wp_login( $data['username'], $data['password'] ); } }
然后这解决了问题,因为它将$data['username']
变量更改为其实际用户名,这意味着插件1的其余部分将继续正确并将某些详细信息绑定到用户名(帐户),而不是包含其电子邮件的用户名(显然不存在)作为用户名)
如果用户名存在(他们尝试使用用户名和密码登录),那么它会像平常一样继续.
如果用户名不存在,那么它会检查电子邮件是否存在,如果存在,那么它将从输入的电子邮件地址中获取用户名,只需更改输入的用户名字段及其实际用户名而不是电子邮件,然后继续正常
插件2的片段(我需要修复的一个)
function email_login_authenticate( $user, $username, $password ) { if ( is_a( $user, 'WP_User' ) ) return $user; if ( !empty( $username ) ) { $user = get_user_by( 'email', $username ); if ( isset( $user, $user->user_login, $user->user_status ) && 0 == (int) $user->user_status ) { $username = $user->user_login; } $result = wp_authenticate_username_password( null, $username, $password ); if (is_a ( $result, 'WP_User' ) ) { global $WishListMemberInstance; $WishListMemberInstance->WPMAutoLogin($user->ID); $_POST['log'] = $username; $WishListMemberInstance->Login(); } } return wp_authenticate_username_password( null, $username, $password ); }
我不是100%确定上面的snippit完全做了什么,但我理解它已经足够好了,我需要更改它以便它以某种方式返回正确的用户名, 以便$data['username']
用用户名而不是电子邮件替换(如果是电子邮件用来)