워드프레스 플러그인에 대해 사용자 이름을 올바르게 반환하도록 함수 수정
저는 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
'programing' 카테고리의 다른 글
스프링 부트: 기본값을 구성 가능한 속성으로 설정 (0) | 2023.03.17 |
---|---|
Visual Composer 사용자 지정 쇼트코드 템플릿 - custom_markup 표시 사용자 입력 (0) | 2023.03.17 |
워드프레스 스타일시트를 주문하시겠습니까? (0) | 2023.03.17 |
레일 3: Ajax 콜에서 "redirect_to"를 하려면 어떻게 해야 합니까? (0) | 2023.03.17 |
카테고리를 제품 woocomme로 설정하는 방법 (0) | 2023.03.17 |