【发布时间】:2016-01-07 04:17:56
【问题描述】:
我有两个 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% 确定上面的代码片段的全部功能,但我理解它已经足够好了,我需要对其进行更改,以便它返回正确的用户名 不知何故$data['username'] 替换为用户名而不是电子邮件(如果使用电子邮件)
【问题讨论】:
-
根据codex.wordpress.org/Function_Reference/wp_login
wp_login()已弃用。它已经被弃用了很长时间。结合这个间接证据和 Plugin1 作者的态度,也许是时候停止使用那个插件了。 -
@JamesJones 由于
wp_login()函数不在已弃用的函数列表中,我假设他们已经从 4.4.1 中完全删除了wp_login()并且插件作者已经创建了他们的自己的自定义wp_login()函数。为了公平对待插件 1,他们的 Wordpress 和他们的插件并没有宣传使用电子邮件登录的能力,所以这并不是他们真正要修复的。相反,插件 2 的作者应该修复它,因为这是他们的插件有问题。 -
我们在这里看到的实际插件是什么?
-
有什么问题,你想完成什么?没有人回答,因为这个问题非常模糊。
-
你不能简单地在本地更新插件 1 吗?如果插件更新,您必须再次修复它,但您可以绕过它的更新。或者创建一个分支。