У меня есть два плагина 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']
заменяется на имя пользователя вместо электронного письма (если используется электронное письмо)