programing

워드프레스 플러그인에 대해 사용자 이름을 올바르게 반환하도록 함수 수정

closeapi 2023. 3. 17. 21:29
반응형

워드프레스 플러그인에 대해 사용자 이름을 올바르게 반환하도록 함수 수정

저는 Wordpress Plugins가 2개 있고, 두 플러그인 작성자 모두 충돌/문제가 자신들의 사이트임을 인정하지 않지만, 당사자 모두 문제를 매우 쉽게 해결할 수 있는 것은 분명합니다.

플러그인 작성자에게 어떤 식으로든 플러그인에 부정적인 영향을 미치지 않는 수정 프로그램을 제공했습니다.두 번째 플러그인이 설치되어 있어도 문제가 발생하지 않습니다만, 다른 플러그인과 호환성이 추가되어도 플러그인에 수정 프로그램을 추가하지 않습니다.

두 번째 플러그인 수정 방법은 알 수 없지만 어떻게 해야 하는지 알고 있습니다.

플러그인 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% 확신할 수는 없지만 충분히 이해하고 있으며 올바른 사용자 이름반환하도록 변경해야 합니다.그러면 이메일 대신 사용자 이름으로 대체됩니다(이메일이 사용되는 경우).

일단 제 워드프레스 버전은

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 );
}

언급URL : https://stackoverflow.com/questions/34647290/modifying-a-function-to-return-username-correctly-for-a-wordpress-plugin

반응형