코스모스팜 회원관리 몇가지 오류와 해결코드, 추가기능 제안

1. 정확한 제품 또는 플러그인 이름

코스모스팜 회원관리 3.5

 

2. 상세 내용

안녕하세요! 코스모스팜 회원관리 플러그인 3.3 버전 때 설치하여 이용하면서, 지금까지 직접 발견하고 코드를 수정해서 사용하고 있는 오류들과 기능들이 있어서 제보드립니다.

매번 업데이트될 때마다 직접 코드 수정하는 게 번거로워서, 정식 버전에 반영해주시길 부탁드립니다..

 

- 설정에서 포인트 입력이 안 되어 있으면 발생하는 정수*문자열 오류 수정: Cosmosfarm_Members_Controller.class.php
  $product->earn_points() 메소드가 작동하는 모든 곳에 현재는 if($product->is_use_earn_points()) 조건만 있는데, 여기에 is_numeric($product->earn_points()) 조건 추가(9곳)
 

- 어드민 페이지에서 알림&쪽지 보내기 버튼 반응 없음: Cosmosfarm_Members.class.php 238&285번째 줄: intval() => sanitize_text_field()
 

- 어드민 페이지에서 알림 보내기 시 URL 정보 추가하기: 
  - admin/ notification_setting.php:50 ~63,
  - Cosmosfarm_Members.class.php:277 ~278에 다음 두 줄 추가:
    $url = $notification->get_url();
    $url_name = $notification->get_url_name();
  - Cosmosfarm_Members_Notification.class.php:211 ~225
  - Cosmosfarm_Members_Controller.class.php:
    628번째 줄에 아래 두 줄 추가:
      $notification_url = isset($_POST['notification_url']) ? sanitize_text_field($_POST['notification_url']) : '';
      $notification_url_name = isset($_POST['notification_url_name']) ? sanitize_text_field($_POST['notification_url_name']) : '';
    이후 668 줄에 아래 두 줄 추가:
      update_post_meta($notification->ID, 'url', $notification_url);
      update_post_meta($notification->ID, 'url_name', $notification_url_name);
    이후 679 줄에 아래 meta_input 항목 추가:
      'meta_input'   => array(
        url' => $notification_url,
        url_name' => $notification_url_name,
      )
 

- 현재 멤버스 링크 항목 중에 '보유 포인트' 표시하는 버튼을 누르면 단순히 '고맙습니다.'라고만 alert창이 표시되는데, 별도의 링크로 이동할 수 있는 옵션이 있었으면 좋겠습니다.(저는 직접 a태그 수정함)
 

- 이건 오류라고 하긴 뭐하지만, 회원가입 시나 회원정보 수정 페이지에서 전화번호 입력 시 자동으로 하이픈(-)이 삽입되도록 하는 옵션이 있으면 좋겠습니다. 저는 /skin/사용하는 스킨/script.js 파일을 직접 수정했습니다.

jQuery('input[name=billing_phone]').keyup(function(){
        jQuery(this).val( jQuery(this).val().replace(/[^0-9]/g, "").replace(/(^02|^0502|^0504|^0505|^0506|^0507|^1[0-9]{3}|^0[0-9]{2})([0-9]+)?([0-9]{4})/,"$1-$2-$3").replace("--", "-") );
  });


- 알림 확인하기 클릭 시 읽음 표시(cosmosfarm-members/skin/사용중인스킨/notifications-list-item-default.php:21)

<div class="add-item-middot item-button-url"><a href="<?php echo esc_url($item->url)?>" onclick="cosmosfarm_members_notifications_read(this, '<?php echo $item->ID?>'); window.open(this.href);return false;"><?php echo $item->url_name ? $item->url_name : $item->url?></a></div>


- 알림 리스트 개수 설정(cosmosfarm-members/skin/사용중인스킨/notifications-list.php:7)
  'posts_per_page' 항목이 숫자 그대로 하드코딩되어 있는데, 옵션으로 설정할 수 있으면 좋겠습니다.
 

- 알림 [전체보기/안읽은알림] 기본선택 변경(cosmosfarm-members/class/Cosmosfarm_Members_Skin.class.php : $notifications_view)
  $notifications_view 변수 정의문의 삼항조건식에서 notifications_view 파라미터가 없을 시 'inbox'로 설정되는데, 이것 또한 옵션으로 unread와 바꿀 수 있으면 좋을 것 같습니다.
 

- 소셜로그인 시 기존 회원 계정이 있을 경우, 새로 계정을 만들지 않고 기존 계정에 연동
  cosmosfarm-members/class/ Cosmosfarm_Members_Controller.class : public function social_login_callback($channel) 함수 수정

public function social_login_callback($channel){
		if(is_object($api = $this->get_social_api($channel))){
			$access_token = $api->init_access_token();
			$profile = $api->get_profile();
			
			if($profile->id){
				if($channel == 'naver'){
					if($profile->naver_enc_id){
						$social_id = "{$channel}@{$profile->naver_enc_id}";
						$user = get_users(array('meta_key'=>'cosmosfarm_members_social_id','meta_value'=>$social_id, 'number'=>1, 'count_total'=>false));
						$user = reset($user);
					}
					
					if(!isset($user->ID) || !$user->ID){
						$social_id = "{$channel}@{$profile->id}";
						$user = get_users(array('meta_key'=>'cosmosfarm_members_social_id','meta_value'=>$social_id, 'number'=>1, 'count_total'=>false));
						$user = reset($user);
					}
				}
				else{
					$social_id = "{$channel}@{$profile->id}";
					$user = get_users(array('meta_key'=>'cosmosfarm_members_social_id','meta_value'=>$social_id, 'number'=>1, 'count_total'=>false));
					$user = reset($user);
				}
				
				$random_password = wp_generate_password(128, true, true);
				
				if(!isset($user->ID) || !$user->ID){
					//$existing_user_id = 0;
					$all_users = get_users();
					foreach ($all_users as $userss) {
						$user_phone = preg_replace("/[^0-9]/", "", get_user_meta($userss->ID, 'billing_phone', true));
						$profile_phone = preg_replace("/[^0-9]/", "", $profile->phone);
						
						if ($user_phone == $profile_phone) {
							$existing_user_id = $userss->ID;
							//break;
						} elseif ($userss->user_login == $profile->user_login) {
							wp_die('이미 해당 아이디로 가입되어 있는 계정이 있습니다.<br>' . $profile->user_login);
							return;
						} elseif ($userss->user_email == $profile->email) {
							wp_die('이미 해당 이메일로 가입되어 있는 계정이 있습니다.<br>' . $profile->email);
							return;
						}
					}
				
					if ($existing_user_id) {
						update_user_meta($existing_user_id, 'cosmosfarm_members_social_id', $social_id);
						update_user_meta($existing_user_id, 'cosmosfarm_members_social_channel', $channel);
						update_user_meta($existing_user_id, 'cosmosfarm_members_social_picture', $profile->picture);
						update_user_meta($existing_user_id, 'social_login_first_update', 1);
						update_user_meta($existing_user_id, 'cosmosfarm_members_social_access_token', $access_token);
						do_action('cosmosfarm_members_user_social_register', $existing_user_id, $social_login);
						$user = new WP_User($existing_user_id);
					} else {
						$profile->user_login = sanitize_user($profile->user_login);
						$profile->email = sanitize_email($profile->email);
						$profile->nickname = sanitize_text_field($profile->nickname);
						$profile->picture = sanitize_text_field($profile->picture);
						$profile->url = sanitize_text_field($profile->url);
						
						if(!$profile->user_login){
							$profile->user_login = "{$channel}_" . uniqid();
						}
						
						if(!$profile->email || email_exists($profile->email)){
							// 무작위 이메일 주소로 회원 등록후, 등록된 이메일을 지우기 위해서 $update_email에 빈 값을 등록해준다.
							$profile->email = "{$channel}_" . uniqid() . '@example.com';
							$update_email = '';
						}
						else{
							$update_email = $profile->email;
						}
						
						include_once COSMOSFARM_MEMBERS_DIR_PATH . '/class/Cosmosfarm_Members_Social_Login.class.php';
						$social_login = new Cosmosfarm_Members_Social_Login();
						$social_login->social_id    = $social_id;
						$social_login->channel      = $channel;
						$social_login->picture      = $profile->picture;
						$social_login->user_url     = $profile->url;
						$social_login->user_email   = $update_email;
						$social_login->display_name = $profile->nickname;
						$social_login->nickname     = $profile->nickname;
						$social_login->phone        = isset($profile->phone)?$profile->phone:'';
						$social_login->raw_data     = $profile->raw_data;
						
						add_action('user_register', array($social_login, 'user_register'), 5, 1);

						$user_id = wp_create_user($profile->user_login, $random_password, $profile->email);
						$user = new WP_User($user_id);
					}
				}
				else{
					//wp_set_password($random_password, $user->ID);
					update_user_meta($user->ID, 'cosmosfarm_members_social_picture', $profile->picture);
					update_user_meta($user->ID, 'cosmosfarm_members_social_access_token', $access_token);
				}
				
				do_action('cosmosfarm_members_social_login_callback', $channel, $profile, $user, $random_password);
				
				wp_set_current_user($user->ID, $user->user_login);
				wp_set_auth_cookie($user->ID, true, is_ssl());
				do_action('wp_login', $user->user_login, $user);
				
				// 필수 정보 체크
				$option = get_cosmosfarm_members_option();
				if($option->user_required){
					$current_user = $user;
					$profile_url = get_cosmosfarm_members_profile_url();
					
					if($profile_url){
						$profile_url = add_query_arg(array('a'=>'edit'), $profile_url);
					}
					else{
						$profile_url = admin_url('profile.php');
					}
					
					$wpmem_fields = apply_filters('wpmem_register_fields_arr', wpmem_fields(), 'user_required');
					
					$meta_arr = array('username', 'password', 'confirm_password', 'password_confirm');
					
					foreach($wpmem_fields as $meta_key=>$field){
						if($field['required'] && !in_array($meta_key, $meta_arr)){
							if($meta_key == 'confirm_email') $meta_key = 'user_email';
							if(!$current_user->{$meta_key}){
								wp_redirect($profile_url);
								exit;
							}
						}
					}
				}
				
				$redirect_to = home_url();
				$option = get_cosmosfarm_members_option();
				
				if($option->login_redirect_page == 'main'){
					$redirect_to = home_url();
				}
				else if($option->login_redirect_page == 'url' && $option->login_redirect_url){
					$redirect_to = $option->login_redirect_url;
				}
				else if(isset($_SESSION['cosmosfarm_members_social_login_redirect_to']) && $_SESSION['cosmosfarm_members_social_login_redirect_to']){
					$redirect_to = $_SESSION['cosmosfarm_members_social_login_redirect_to'];
					$_SESSION['cosmosfarm_members_social_login_redirect_to'] = '';
					unset($_SESSION['cosmosfarm_members_social_login_redirect_to']);
				}
				
				$redirect_to = apply_filters('cosmosfarm_members_social_login_redirect_to', $redirect_to, $profile, $user, $random_password);
				
				wp_redirect($redirect_to);
				exit;
			}
		}
		wp_redirect(home_url());
		exit;
	}

/class/api 각 파일에서 public function init_access_token() 함수 마지막에 토큰 정보를 반환하도록 한 줄 추가:
  return $data->access_token; //토큰 정보 반환

이상입니다. 긴 글 읽어주셔서 감사합니다. 다음 업데이트 때 꼭 반영되면 좋겠습니다.

 

워드프레스 에러 기술지원 서비스 전문가에게 맡기세요
좋은 정보와 인맥을 동시에, 워드프레스 사용자 단톡방 참여하기
워드프레스 에러 기술지원 서비스 전문가에게 맡기세요