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; //토큰 정보 반환
이상입니다. 긴 글 읽어주셔서 감사합니다. 다음 업데이트 때 꼭 반영되면 좋겠습니다.
안녕하세요~^^
코스모스팜 회원관리 플러그인에 버그와 새로운 기능을 제안해주신 점 너무 감사드립니다.
남겨주신 코드를 확인한 후 버그는 빠른 시일 내에 수정해 보도록 하겠습니다.
그리고 제안 주신 추가 기능은 저희가 내부 회의를 거쳐 필요한 기능이라고 판단이 되면
다음 업데이트에 적용해 보도록 하겠습니다.
고맙습니다.