Подтвердить что ты не робот

Изменение функции для правильного ввода имени пользователя, для плагина wordpress

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

4b9b3361

Ответ 1

Во-первых, моя версия Wordpress

Name        : wordpress                    Relocations: (not relocatable)
Version     : 4.4                               Vendor: Fedora Project
Release     : 1.el6                         Build Date: Wed 09 Dec 2015 11:40:49 AM EST

плагины на моем centos6.4 будут установлены в этом месте:

/usr/share/wordpress/wp-content/plugins

Обратите внимание, что эта функция (в моей системе) не всегда возвращает пользователя, WP_Error также

/**
 * Authenticate the user using the username and password.
 *
 * @since 2.8.0
 *
 * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.
 * @param string                $username Username for authentication.
 * @param string                $password Password for authentication.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_authenticate_username_password($user, $username, $password) {

Вход wp-email-login, который я нашел, может поместиться для вас:

http://plugins.svn.wordpress.org/wp-email-login/trunk/email-login.php

Чтобы быть более понятным, фрагмент из плагина 2 должен быть изменен на:

function email_login_authenticate( $user, $username, $password ) {
    if ( is_a( $user, 'WP_User' ) )
        return $user;
    if ( !empty( $username ) ) {


        // add this line to format email - propose change #1
            $username = str_replace( '&', '&', stripslashes( $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' ) ) {
            // These 4 lines came from plugin2 from your system, keep as is
            global $WishListMemberInstance;
            $WishListMemberInstance->WPMAutoLogin($user->ID);
            $_POST['log'] = $username;
            $WishListMemberInstance->Login();
        }


        // no need to authenticate another time, return - proposed change #2
        // authenticate twice could be a problem as well
        return $result;
    }
    return wp_authenticate_username_password( null, $username, $password );
}