function _do_import_users()
 {
     //test
     global $wpdb;
     // extract
     extract($_POST);
     // import f*g
     define('MGM_DOING_USERS_IMPORT', TRUE);
     // parese
     $i_response = $this->_parse_import_file();
     // log
     // mgm_log($response, __FUNCTION__);
     // stop
     // $response['status'] = 'error';
     // process data:
     if ($i_response['status'] == 'success' && in_array('user_email', $i_response['header'])) {
         // success
         // extract
         $i_users = $i_response['users'];
         $i_header = $i_response['header'];
         // object
         $mgm_packs = mgm_get_class('mgm_subscription_packs');
         $mgm_roles = mgm_get_class('mgm_roles');
         // types
         $membership_types = mgm_get_class('membership_types')->get_membership_types();
         $memtypes = mgm_get_class('membership_types');
         // check users
         if (!empty($i_users)) {
             // users found
             // init
             $row_count = count($i_users);
             $col_count = count($i_header);
             // limits
             $row_limit = 2000;
             $user_count = 0;
             // log
             // mgm_log(sprintf('Rows: [%d] Cols: [%d]',$row_count, $col_count), __FUNCTION__);
             // user fields
             $user_fields = array('first_name', 'last_name', 'user_nicename', 'user_url', 'display_name', 'nickname', 'user_firstname', 'user_lastname', 'user_description', 'user_registered');
             // flag
             $update_count = $user_count = 0;
             // new users
             $new_users = array();
             $specialchars = array(',', '\'', '"', "\n\r", "\n", '\\', '/', '$', '`', '(', ')', ' ', " ");
             // custom fields
             $cf_register_page = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_register' => true, 'on_profile' => true)));
             // count
             $cf_count = count($cf_register_page);
             // exclude
             $cf_exclude_names = array('subscription_introduction', 'subscription_options', 'terms_conditions', 'privacy_policy', 'description', 'payment_gateways', 'password_conf', 'autoresponder');
             // types
             $cf_exclude_types = array('html', 'label', 'captcha');
             // loop
             foreach ($i_users as $i_user) {
                 // init
                 $update_user = $insert_user = $is_membership_update = $is_multiple_membership_update = $multiple_membership_exists = $update_role = false;
                 // pack
                 $pack = array();
                 // increment
                 $user_count++;
                 // remove N/A ?
                 // $i_user = str_ireplace('N/A', '', $i_user);
                 // init
                 // id
                 $id = isset($i_user['ID']) && is_numeric($i_user['ID']) ? $i_user['ID'] : '';
                 $email = str_replace($specialchars, '', sanitize_email($i_user['user_email']));
                 $user_login = str_replace($specialchars, '', sanitize_user($i_user['user_login']));
                 $user_password = isset($i_user['user_password']) ? $i_user['user_password'] : '';
                 // Issue #1559: Standardize membership type name to use machine name
                 $membership_type = $memtypes->get_type_code($i_user['membership_type']);
                 $pack_id = isset($i_user['pack_id']) ? sanitize_user($i_user['pack_id']) : '';
                 // log
                 // mgm_log(sprintf('step 1: user_count: [%d] id: [%s] email: [%s] user_login: [%s] user_password: [%s]', $user_count, $id, $email, $user_login, $user_password), __FUNCTION__);
                 // user id not valid
                 if (!is_numeric($id)) {
                     // check login/email
                     if (!empty($user_login) && !empty($email)) {
                         // user
                         $_user = get_user_by('login', $user_login);
                         // if update and different email
                         if (isset($_user->ID) && $_user->user_email != $email) {
                             // log
                             // mgm_log(sprintf('step 2: %s %s', $_user->user_email, $email), __FUNCTION__);
                             // continue
                             continue;
                         }
                         // fresh insert/registration:
                         if (!$_user) {
                             // password
                             $user_password = !empty($user_password) ? $user_password : wp_generate_password();
                             $user_password = str_replace($specialchars, '', $user_password);
                             // trim
                             $user_password = trim($user_password);
                             // log
                             // mgm_log('step 2.1 user_password: '******'step 3: %s, %s ', $user_password, $id), __FUNCTION__);
                             // check error
                             if (is_wp_error($id)) {
                                 // log
                                 // mgm_log(sprintf('step 4: %s', print_r($id->get_error_messages(),1)), __FUNCTION__);
                                 // unset
                                 unset($id);
                                 // continue
                                 continue;
                             }
                             // set new user
                             $new_users[$id]['email'] = $email;
                             $new_users[$id]['user_login'] = $user_login;
                             // update option
                             update_user_option($id, 'default_password_nag', true, true);
                             // flag
                             $insert_user = true;
                         } else {
                             // set id to user
                             $id = $_user->ID;
                         }
                         // unset
                         unset($_user);
                     } else {
                         // login/email not present
                         // log
                         // mgm_log(sprintf('step 5: %s, %s ', $user_login, $email), __FUNCTION__);
                         // continue
                         continue;
                         //skip the record
                     }
                 } else {
                     // update
                     $update_user = true;
                 }
                 // get User object:
                 $user = new WP_user($id);
                 // log
                 // mgm_log(sprintf('step 6: %s ', print_r($user,1)), __FUNCTION__);
                 //issue #700
                 $format = mgm_get_date_format('date_format_short');
                 // ------------------------------------------
                 // user to mgm member
                 if (isset($user->ID) && $user->ID > 0) {
                     // get mgm object:
                     $member = mgm_get_member($user->ID);
                     // update custom fields:
                     if (!empty($member)) {
                         // update pack id if not supplied and already exists
                         // This is to make pack_id optional: issue#: 807
                         if (!is_numeric($pack_id) && isset($member->pack_id) && $member->pack_id > 0) {
                             $pack_id = $member->pack_id;
                         }
                         // update misc fields:
                         if (!isset($member->rss_token) || isset($member->rss_token) && empty($member->rss_token)) {
                             $member->rss_token = mgm_create_rss_token();
                         }
                         // init
                         $user_password_enc = mgm_encrypt_password($user_password, $user->ID, $member->rss_token);
                         // mgm_log($user_password_enc, __FUNCTION__);
                         // check
                         if ($cf_count > 0) {
                             // loop custom fields
                             foreach ($cf_register_page as $field) {
                                 // key
                                 $key = $field['name'];
                                 // mgm_log($key, __FUNCTION__);
                                 // skip unwanted fields
                                 if (in_array($field['name'], $cf_exclude_names) || in_array($field['type'], $cf_exclude_types)) {
                                     // log
                                     // mgm_log(sprintf('step 7: %s ', $field['name']), __FUNCTION__);
                                     // continue
                                     continue;
                                 }
                                 // init
                                 $val = '';
                                 //issue #700
                                 // check
                                 if (isset($i_user[$key]) && !empty($i_user[$key]) && preg_match('/date/i', $key)) {
                                     // validate date
                                     if (mgm_is_valid_date($i_user[$key]) && mgm_format_inputdate_to_mysql($i_user[$key], $format)) {
                                         $val = $i_user[$key];
                                     }
                                 } elseif ($key == 'email') {
                                     // email and username custom fields
                                     $val = $email;
                                 } elseif ($key == 'username') {
                                     // username
                                     $val = $user_login;
                                 } elseif ($key == 'password') {
                                     // password
                                     if (!empty($user_password_enc)) {
                                         // set
                                         $val = $user_password_enc;
                                         // log
                                         // mgm_log(sprintf('step 7.1: %s ', $user_password_enc), __FUNCTION__);
                                     }
                                 } else {
                                     $val = isset($i_user[$key]) ? $i_user[$key] : '';
                                 }
                                 // If checkbox, then serialize the value: Issue #1070
                                 if ($field['type'] == 'checkbox' && !empty($val)) {
                                     $val = serialize(explode("|", $val));
                                 }
                                 // update fields:
                                 if (!empty($val) || !isset($member->custom_fields->{$key})) {
                                     // set
                                     $member->custom_fields->{$key} = $val;
                                 }
                                 // unset
                                 unset($field, $val);
                             }
                         }
                         // custom fields updated
                         // log
                         // mgm_log(sprintf('step 8: %s ', print_r($member,1)), __FUNCTION__);
                         // update membership: main mgm_member object
                         if (!empty($membership_type) && is_numeric($pack_id)) {
                             // pack
                             if ($pack = $mgm_packs->get_pack($pack_id)) {
                                 // valid pack
                                 $member->pack_id = $pack_id;
                             } else {
                                 // log
                                 // mgm_log(sprintf('step 9: %s ', print_r($pack,1)), __FUNCTION__);
                                 // error:
                                 continue;
                             }
                             // membership types:
                             $sel_type = '';
                             // loop
                             foreach ($membership_types as $key => $type) {
                                 // check
                                 if ($membership_type == $key || $membership_type == $type) {
                                     // match
                                     $sel_type = $key;
                                     break;
                                 }
                             }
                             // check
                             if (!empty($sel_type)) {
                                 $membership_type = $sel_type;
                             } else {
                                 // log
                                 // mgm_log(sprintf('step 10: %s ', $sel_type), __FUNCTION__);
                                 // continue
                                 continue;
                             }
                             // to distinguish between primary membership and other membership(Y/N)
                             if (!isset($i_user['other_membership']) || isset($i_user['other_membership']) && $i_user['other_membership'] != 'Y') {
                                 // set
                                 $member->membership_type = $membership_type;
                                 // update current membership:
                                 $_response = $this->_update_member_object($member, $pack, $i_user);
                                 // check
                                 if (!$_response['status']) {
                                     // log
                                     // mgm_log(sprintf('step 11: %s ', print_r($_response,1)), __FUNCTION__);
                                     // skip the row
                                     continue;
                                 }
                                 // set
                                 $member = $_response['mgm_member'];
                                 // check guest
                                 if (strtolower($member->membership_type) == 'guest') {
                                     // default
                                     $member->other_membership_types = array();
                                 } else {
                                     // flag
                                     $update_role = true;
                                 }
                             } else {
                                 // init
                                 $multiple_updated = false;
                                 // if multiple mgm_member object:
                                 if (isset($member->other_membership_types) && !empty($member->other_membership_types)) {
                                     // loop
                                     foreach ((array) $member->other_membership_types as $key => $member) {
                                         // convert
                                         $member = mgm_convert_array_to_memberobj($member, $user->ID);
                                         // type
                                         if ($member->membership_type == $membership_type) {
                                             // check
                                             $_response = $this->_update_member_object($member, $pack, $i_user);
                                             // check
                                             if (!$_response['status']) {
                                                 // log
                                                 // mgm_log(sprintf('step 12: %s ', print_r($_response,1)), __FUNCTION__);
                                                 // skip the row:
                                                 continue;
                                             }
                                             // make sure array is saved:
                                             $_response['mgm_member'] = mgm_convert_memberobj_to_array($_response['mgm_member']);
                                             // set
                                             $member->other_membership_types[$key] = $_response['mgm_member'];
                                             // flag
                                             $multiple_updated = true;
                                             // break
                                             break;
                                         }
                                     }
                                 }
                                 //else {mgm_log('skip other_memberships 3', __FUNCTION__);}
                                 // add new to mother_membership_types object:
                                 if (!$multiple_updated) {
                                     // update
                                     $_response = $this->_update_member_object(new stdClass(), $pack, $i_user);
                                     // check
                                     if (!$_response['status']) {
                                         // log
                                         // mgm_log(sprintf('step 13: %s ', print_r($_response,1)), __FUNCTION__);
                                         // skip the row:
                                         continue;
                                     }
                                     // set
                                     $_response['mgm_member'] = mgm_convert_memberobj_to_array($_response['mgm_member']);
                                     // set
                                     $member->other_membership_types[] = $_response['mgm_member'];
                                     // flag
                                     $update_role = true;
                                 }
                             }
                         }
                         // payment type:
                         if (!isset($member->payment_type) || isset($member->payment_type) && empty($member->payment_type)) {
                             $member->payment_type = 'subscription';
                         }
                         // update password:
                         if (!empty($user_password)) {
                             // issue#: 672
                             // generate iss#688
                             /*if(empty($user_password_enc)) {
                             			// set
                             			$user_password_enc = mgm_encrypt_password($user_password, $user->ID);
                             			// log
                             			// mgm_log(sprintf('step 7.2: regenarete password: %s ', $user_password_enc), __FUNCTION__);
                             		}*/
                             // set
                             $member->user_password = $user_password_enc;
                             // md5
                             // $user_password_md5 = wp_hash_password($user_password);
                             //mgm_log($wpdb->prepare("UPDATE ".$wpdb->users." SET user_pass = %s WHERE ID = %d", $user_password_md5, $user->ID), __FUNCTION__);
                             // db update
                             //$wpdb->query( $wpdb->prepare("UPDATE ".$wpdb->users." SET user_pass = %s WHERE ID = %d", $user_password_md5, $user->ID) );
                             // new user
                             if ($insert_user) {
                                 $new_users[$id]['user_password'] = $user_password;
                             }
                         }
                         // save mgm_member object:
                         $member->save();
                         // update role:
                         if ($update_role) {
                             // update role/change order
                             $mgm_roles->add_user_role($user->ID, $pack['role']);
                         }
                         // log
                         // mgm_log(sprintf('step 14: %s ', print_r($member,1)), __FUNCTION__);
                     }
                     // update other user fields:
                     $user_extra = array();
                     if (!empty($user_password)) {
                         $user_extra['user_pass'] = $user_password;
                     }
                     // loop
                     foreach ($i_user as $key => $value) {
                         // check
                         if (in_array($key, $user_fields) && !empty($value)) {
                             if ($key == 'user_registered') {
                                 if (mgm_is_valid_date($value) && ($mysql_date = mgm_format_inputdate_to_mysql($value))) {
                                     $user_extra[$key] = $mysql_date;
                                 }
                             } else {
                                 // set
                                 $user_extra[$key] = $value;
                             }
                         }
                     }
                     // update
                     if (!empty($user_extra)) {
                         // set
                         $user_extra['ID'] = $user->ID;
                         // update
                         wp_update_user($user_extra);
                     }
                     // update
                     $update_count++;
                     // check here:
                     unset($member, $user, $user_extra);
                 }
                 // check limit reached:
                 if ($user_count >= $row_limit) {
                     // check
                     if ($row_count > $row_limit) {
                         // set
                         $response['message'] = sprintf(__('( Import stopped at: %s as limit( %d ) reached. )', 'mgm'), $email, $row_limit);
                     }
                     // break;
                     break;
                 }
                 // ------------------------------------------
                 // unset
                 unset($i_user);
                 // debug
                 // if(function_exists('gc_collect_cycles')) gc_collect_cycles();
                 // wait
                 if (!($user_count % 25)) {
                     sleep(1);
                 }
             }
             // end imported users loop
             //	mgm_log('IMPORT MEMORY PEAK2.5: ' . memory_get_peak_usage(true)/(1024*1024));
             // free unwanted resources
             unset($cf_register_page, $cf_exclude_names, $user_fields, $mgm_packs, $mgm_roles, $user_count);
             // debug
             // if(function_exists('gc_collect_cycles')) gc_collect_cycles();
             // done importing, mail and notify
             if ($update_count) {
                 // unset
                 unset($update_count);
                 // set response
                 $response['status'] = true;
                 $response['users_count'] = count($new_users);
                 // send admin notification:
                 // send to admin
                 if (!empty($new_users)) {
                     $system_obj = mgm_get_class('system');
                     // message
                     $message = sprintf('(%d) %s  %s: <br/><br/>', count($new_users), __('New user registration on your blog', 'mgm'), get_option('blogname'));
                     // loop
                     foreach ($new_users as $user_id => $n_user) {
                         // set
                         $message .= sprintf('%s: %s <br/>', __('Username', 'mgm'), $n_user['user_login']);
                         $message .= sprintf('%s: %s <br/>', __('E-mail', 'mgm'), $n_user['email']);
                         $message .= "-----------------------------------<br/><br/>";
                         // unset
                         unset($n_user);
                         // send email to the user:
                         // mgm_new_user_notification($user_id, $new['user_password'],false);
                     }
                     // unset
                     unset($new_users);
                     // check
                     if (isset($response['message'])) {
                         // set
                         $message .= $response['message'];
                         $message .= "-----------------------------------<br/><br/>";
                     }
                     // admin email:
                     @mgm_mail(get_option('admin_email'), sprintf('[%s] %s', __('New User Registration', 'mgm'), get_option('blogname')), $message);
                     // unset
                     unset($message);
                     // debug
                     // if(function_exists('gc_collect_cycles')) gc_collect_cycles();
                 }
             } else {
                 // none updated
                 $response['error'] = __('No users imported', 'mgm');
             }
         } else {
             // no users
             $response['error'] = __('Empty records', 'mgm');
         }
     } else {
         // no users
         $response['error'] = __('Error in processing users', 'mgm');
     }
     // mgm_log('IMPORT MEMORY PEAK3: ' . memory_get_peak_usage(true)/(1024*1024));
     // mgm_log('$response:' . mgm_array_dump($response, true));
     // return
     return $response;
 }
 /** 
  * get mgm subscriptions
  */
 private function _get_user_subscriptions(&$member, $user)
 {
     // log
     // mgm_log($member, __FUNCTION__);
     // other_membership_types
     $other_membership_types = $member->other_membership_types;
     // unset prefilter
     unset($member->other_membership_types);
     // subscriptions
     $subscriptions = array();
     // set
     $subscriptions[] = $this->_get_user_subscription($member, $user);
     // parse other_membership_types as subscriptions tree
     if (!empty($other_membership_types)) {
         // mgm_log($other_membership_types, 'other_membership_types_'.$user->ID);
         foreach ($other_membership_types as $key => $member_oth) {
             // as object
             $o_mgm_member = mgm_convert_array_to_memberobj($member_oth, $user->ID);
             // set
             $subscriptions[] = $this->_get_user_subscription($o_mgm_member, $user);
             // unset
             unset($o_mgm_member);
         }
     }
     // unset
     unset($member);
     // return
     return $subscriptions;
 }
 function _do_export($export_format, $export_option)
 {
     global $wpdb;
     $status = 'error';
     $message = __('Error while exporting Coupons.', 'mgm');
     // users
     if ($export_option != 'unused') {
         //$users = mgm_get_all_userids(array('ID'), 'get_results');
         $start = 0;
         $limit = 1000;
         //user meta fields
         $fields = array('user_id', 'meta_value');
         // sql
         $user_sql = "SELECT count(*) FROM `{$wpdb->usermeta}` WHERE `meta_key` = 'mgm_member_options' AND `user_id` <> 1";
         $count = $wpdb->get_var($user_sql);
         $users = wp_cache_get('all_mgm_user_meta', 'users');
         // if empty read from db:
         if (empty($users)) {
             $users = array();
             if ($count) {
                 // read again
                 for ($i = $start; $i < $count; $i = $i + $limit) {
                     $users = array_merge($users, (array) mgm_patch_partial_user_member_options($i, $limit, $fields));
                     //a small delay of 0.01 second
                     usleep(10000);
                 }
                 wp_cache_set('all_mgm_user_meta', $users, 'users');
             }
         }
     }
     //mgm_log(mgm_array_dump($users,true),__FUNCTION__);
     //array
     $export_coupons = array();
     //export options issue #1494
     if ($export_option == 'used') {
         $query = " AND `used_count` > 0";
     } elseif ($export_option == 'unused') {
         $query = " AND `used_count` IS NULL";
     } else {
         $query = '';
     }
     // count
     $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . TBL_MGM_COUPON . "` WHERE 1 " . $query);
     //
     $perpage = 50;
     // check
     if ($total > $perpage) {
         $pages = ceil($total / $perpage);
     } else {
         $pages = 1;
     }
     // loop pages
     for ($i = 1; $i <= $pages; $i++) {
         //@set_time_limit(300);//300s
         //@ini_set('memory_limit', 134217728);// 128M
         // offset
         $offset = ($i - 1) * $perpage;
         // coupons
         $sql = "SELECT `id`, `name` FROM `" . TBL_MGM_COUPON . "` WHERE 1 {$query} ORDER BY `create_dt` DESC LIMIT {$offset},{$perpage}";
         // coupons
         $coupons = $wpdb->get_results($sql);
         // log
         // mgm_log('Page: ' .$i. '. '. $wpdb->last_query, __FUNCTION__);
         // loop
         foreach ($coupons as $coupon) {
             // found
             if ($users && $export_option != 'unused') {
                 $coupon_used = false;
                 foreach ($users as $user) {
                     if ($user->user_id) {
                         // member
                         $user_id = $user->user_id;
                         $member = unserialize($user->meta_value);
                         $member = mgm_convert_array_to_memberobj($member, $user_id);
                         // show
                         $show = false;
                         // check
                         if (mgm_member_has_coupon($member, $coupon->id)) {
                             $show = true;
                         } else {
                             if (isset($member->other_membership_types) && !empty($member->other_membership_types) && count($member->other_membership_types) > 0) {
                                 // loop
                                 foreach ($member->other_membership_types as $key => $member_oth) {
                                     // as object
                                     if (is_array($member_oth)) {
                                         $o_mgm_member = mgm_convert_array_to_memberobj($member_oth, $user_id);
                                     } else {
                                         if (is_object($member_oth)) {
                                             $o_mgm_member = $member_oth;
                                         }
                                     }
                                     // check
                                     if (mgm_member_has_coupon($o_mgm_member, $coupon->id)) {
                                         $show = true;
                                         break;
                                     }
                                     // unset
                                     unset($o_mgm_member);
                                 }
                             }
                         }
                         // include
                         if ($show) {
                             //mgm_log(mgm_array_dump($member,true),__FUNCTION__);
                             // user
                             $user = get_userdata($user_id);
                             // int
                             $row = new stdClass();
                             // export fields
                             $row->coupon_id = $coupon->id;
                             $row->coupon_name = $coupon->name;
                             $row->user_id = $user->ID;
                             $row->user_login = $user->user_login;
                             $row->user_email = $user->user_email;
                             $row->user_membership_type = ucwords(str_replace('_', ' ', $member->membership_type));
                             // cache
                             $export_coupons[] = $row;
                             // unset
                             unset($row);
                             $coupon_used = true;
                         }
                         unset($user);
                         unset($member);
                     }
                 }
                 if (!$coupon_used && $export_option == 'all') {
                     // int
                     $row = new stdClass();
                     // export fields
                     $row->coupon_id = $coupon->id;
                     $row->coupon_name = $coupon->name;
                     $row->user_id = '';
                     $row->user_login = '';
                     $row->user_email = '';
                     $row->user_membership_type = '';
                     // cache
                     $export_coupons[] = $row;
                     // unset
                     unset($row);
                 }
             } else {
                 // int
                 $row = new stdClass();
                 // export fields
                 $row->coupon_id = $coupon->id;
                 $row->coupon_name = $coupon->name;
                 $row->user_id = '';
                 $row->user_login = '';
                 $row->user_email = '';
                 $row->user_membership_type = '';
                 // cache
                 $export_coupons[] = $row;
                 // unset
                 unset($row);
             }
         }
     }
     // log
     // mgm_log($export_coupons, 'export_coupons');
     // check
     if (count($export_coupons) > 0) {
         // success
         $success = count($export_coupons);
         // create
         if ($export_format == 'csv') {
             $filename = mgm_create_csv_file($export_coupons, 'export_coupons');
         } else {
             $filename = mgm_create_xls_file($export_coupons, 'export_coupons');
         }
         // src
         $file_src = MGM_FILES_EXPORT_URL . $filename;
         // message
         $message = sprintf(__('Successfully exported %d %s.', 'mgm'), $success, $success > 1 ? 'coupons' : 'coupon');
         //status
         $status = 'success';
         //return
         return array('status' => $status, 'message' => $message, 'action' => 'export', 'src' => $file_src);
     } else {
         $message .= ' ' . __('No coupons found with associated users.', 'mgm');
     }
     // return
     return array('status' => $status, 'message' => $message, 'action' => 'export');
 }
 foreach ($users as $user) {
     // get
     $member = mgm_get_member($user->ID);
     // if users with same membershiptype as that of selected
     if (isset($member->membership_type) && $member->membership_type == $type_code) {
         // set
         $member->membership_type = $new_type_code;
         // save
         $member->save();
     }
     // check if any multiple levels exist:
     if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
         // loop
         foreach ($member->other_membership_types as $key => $memtypes) {
             // make sure its an object:
             $memtypes = mgm_convert_array_to_memberobj($memtypes, $user->ID);
             // verify
             if ($memtypes->membership_type == $type_code) {
                 // set
                 $memtypes->membership_type = $new_type_code;
                 // save
                 mgm_save_another_membership_fields($memtypes, $user->ID, $key);
             }
         }
     }
     // unset
     unset($member);
 }
 //unset
 $membership_types_obj->unset_membership_type($type_code);
 // set
         }
         // update
         update_user_option($user_id, sprintf('mgm_user_billing_num_cycles_%d', $member->pack_id), $user_billing_num_cycles, true);
     }
 }
 // othe membership level
 if (isset($member->other_membership_types) && !empty($member->other_membership_types) && is_object($member)) {
     //loop
     foreach ($member->other_membership_types as $key => $other_membership_type) {
         //filter for empty values
         $other_membership_type = array_filter($other_membership_type);
         //check
         if (!empty($other_membership_type)) {
             // convet
             if (is_array($other_membership_type)) {
                 $other_membership_type = mgm_convert_array_to_memberobj($other_membership_type, $user_id);
             }
             //check
             if (mgm_get_user_option(sprintf('mgm_user_billing_num_cycles_%d', $other_membership_type->pack_id), $user_id) === FALSE) {
                 //othermembership level wise user meta - issue #1681
                 if (isset($other_membership_type->pack_id) && (int) $other_membership_type->pack_id > 0) {
                     // init
                     $user_billing_num_cycles = 'ongoing';
                     // ongoing
                     // check limited
                     if (isset($other_membership_type->active_num_cycles) && (int) $other_membership_type->active_num_cycles >= 1) {
                         // set
                         $user_billing_num_cycles = (int) $other_membership_type->active_num_cycles;
                     } else {
                         // check pack
                         if (isset($other_membership_type->pack_id) && (int) $other_membership_type->pack_id > 0) {
 function get_expected_recurring_earning($date_start, $date_end, $member_type)
 {
     global $wpdb;
     $start = 0;
     $limit = 1000;
     //user meta fields
     $fields = array('user_id', 'meta_value');
     // sql
     $sql = "SELECT count(*) FROM `{$wpdb->usermeta}` WHERE `meta_key` = 'mgm_member_options' AND `user_id` <> 1";
     $count = $wpdb->get_var($sql);
     // init
     $members = array();
     // packs
     $packs = mgm_get_class('subscription_packs');
     $sformat = mgm_get_date_format('date_format_short');
     $curr_date = mgm_get_current_datetime();
     $current_date = $curr_date['timestamp'];
     $on_going = array();
     $recuring_cycles = array();
     $dt = array();
     //setting the default dates
     if (empty($date_end)) {
         $end_date = date('Y-m-d', $current_date);
         $end_date = date('Y-m-d', strtotime("{$end_date} + 6 months"));
     } else {
         $end_date = mgm_format_inputdate_to_mysql($date_end, $sformat);
         //$end_date=str_replace('/','-',$date_end);
     }
     if (!empty($date_start)) {
         $start_date = mgm_format_inputdate_to_mysql($date_start, $sformat);
         //$start_date=str_replace('/','-',$date_start);
         if (strtotime($start_date) > $current_date) {
             $current_date = strtotime($start_date);
         }
     }
     //count
     if ($count) {
         for ($k = $start; $k < $count; $k = $k + $limit) {
             $users = mgm_patch_partial_user_member_options($k, $limit, $fields);
             foreach ($users as $user) {
                 $user_id = $user->user_id;
                 $member = unserialize($user->meta_value);
                 // convert
                 $member = mgm_convert_array_to_memberobj($member, $user_id);
                 $expire_date = $member->expire_date;
                 $membership_type = $member->membership_type;
                 if (!empty($expire_date) && $member->status == 'Active' && $member->amount > 0) {
                     if ($membership_type == $member_type || $member_type == 'all') {
                         if (strtotime($expire_date) >= $current_date) {
                             //echo "<br/>Expire_date : ".$expire_date;
                             //echo "<br/>Current_date : ".date('Y-m-d',$current_date);
                             // check pack
                             $subs_pack = null;
                             if ($member->pack_id) {
                                 $subs_pack = $packs->get_pack($member->pack_id);
                             }
                             if (empty($subs_pack)) {
                                 if ($member_type != 'all') {
                                     $subs_pack = $packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member_type);
                                 } else {
                                     $subs_pack = $packs->validate_pack($member->amount, $member->duration, $member->duration_type, $membership_type);
                                 }
                             }
                             $num_cycles = isset($member->active_num_cycles) && !empty($member->active_num_cycles) ? $member->active_num_cycles : $subs_pack['num_cycles'];
                             $num_cycles = trim($num_cycles);
                             $rebilled = 0;
                             if ($num_cycles > 0) {
                                 $rebilled = $member->rebilled;
                                 if ($num_cycles > $rebilled) {
                                     $num = $num_cycles - $rebilled;
                                     for ($i = 1; $i <= $num; $i++) {
                                         $duration = $i * $subs_pack['duration'];
                                         //days
                                         if ($member->duration_type == 'd') {
                                             $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " days"));
                                         }
                                         //months
                                         if ($member->duration_type == 'm') {
                                             $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " months"));
                                         }
                                         //years
                                         if ($member->duration_type == 'y') {
                                             $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " years"));
                                         }
                                         if (strtotime($d) <= strtotime($end_date)) {
                                             if (!isset($recuring_cycles[$d])) {
                                                 $dt[] = $d;
                                                 $recuring_cycles[$d]['cost'] = $subs_pack['cost'];
                                                 $recuring_cycles[$d]['expire_date'] = $d;
                                             } else {
                                                 $recuring_cycles[$d]['cost'] = $test[$d]['cost'] + $subs_pack['cost'];
                                             }
                                         }
                                     }
                                 }
                             }
                             //num_cycles >0
                             if ($num_cycles == 0 && $num_cycles != '' && !empty($subs_pack)) {
                                 $exp_date = $expire_date;
                                 //days
                                 if ($member->duration_type == 'd') {
                                     $i = 1;
                                     while (strtotime($exp_date) <= strtotime($end_date)) {
                                         $duration = $i * $subs_pack['duration'];
                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " days"));
                                         $exp_date = $d;
                                         $i++;
                                         if (strtotime($d) <= strtotime($end_date)) {
                                             if (!isset($on_going[$d])) {
                                                 $dt[] = $d;
                                                 $on_going[$d]['cost'] = $subs_pack['cost'];
                                                 $on_going[$d]['expire_date'] = $d;
                                             } else {
                                                 $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                             }
                                         }
                                     }
                                 }
                                 //days end
                                 //months
                                 if ($member->duration_type == 'm') {
                                     $i = 1;
                                     while (strtotime($exp_date) <= strtotime($end_date)) {
                                         $duration = $i * $subs_pack['duration'];
                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " months"));
                                         $exp_date = $d;
                                         $i++;
                                         if (strtotime($d) <= strtotime($end_date)) {
                                             if (!isset($on_going[$d])) {
                                                 $dt[] = $d;
                                                 $on_going[$d]['cost'] = $subs_pack['cost'];
                                                 $on_going[$d]['expire_date'] = $d;
                                             } else {
                                                 $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                             }
                                         }
                                     }
                                 }
                                 //moths end
                                 //years
                                 if ($member->duration_type == 'y') {
                                     $i = 1;
                                     while (strtotime($exp_date) <= strtotime($end_date)) {
                                         $duration = $i * $subs_pack['duration'];
                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " years"));
                                         $exp_date = $d;
                                         $i++;
                                         if (strtotime($d) <= strtotime($end_date)) {
                                             if (!isset($on_going[$d])) {
                                                 $dt[] = $d;
                                                 $on_going[$d]['cost'] = $subs_pack['cost'];
                                                 $on_going[$d]['expire_date'] = $d;
                                             } else {
                                                 $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                             }
                                         }
                                     }
                                 }
                                 //years end
                             }
                             //$num_cycles ==0
                         }
                         //EXPIRE DATE GRATER THAN CURRENT DATE
                     }
                     //Membership Type
                 }
                 //EMPTY EXPIRE DATE
                 //checking recurring payments for other membership levels of a user
                 if (isset($member->other_membership_types) && is_object($member->other_membership_types) && !empty($member->other_membership_types)) {
                     foreach ($member->other_membership_types as $key => $other_member) {
                         if (!empty($other_member)) {
                             $other_member = mgm_convert_array_to_memberobj($other_member, $user_id);
                             $membership_type = $other_member->membership_type;
                             $expire_date = $other_member->expire_date;
                             if (!empty($expire_date) && $other_member->status == 'Active' && $other_member->amount > 0) {
                                 if ($membership_type == $member_type || $member_type == 'all') {
                                     if (strtotime($expire_date) >= $current_date) {
                                         //echo "<br/>Expire_date : ".$expire_date;
                                         //echo "<br/>Current_date : ".date('Y-m-d',$current_date);
                                         // check pack
                                         $subs_pack = null;
                                         if ($other_member->pack_id) {
                                             $subs_pack = $packs->get_pack($other_member->pack_id);
                                         }
                                         if (empty($subs_pack)) {
                                             if ($member_type != 'all') {
                                                 $subs_pack = $packs->validate_pack($other_member->amount, $other_member->duration, $other_member->duration_type, $member_type);
                                             } else {
                                                 $subs_pack = $packs->validate_pack($other_member->amount, $other_member->duration, $other_member->duration_type, $membership_type);
                                             }
                                         }
                                         $num_cycles = isset($other_member->active_num_cycles) && !empty($other_member->active_num_cycles) ? $other_member->active_num_cycles : $subs_pack['num_cycles'];
                                         $num_cycles = trim($num_cycles);
                                         $rebilled = 0;
                                         if ($num_cycles > 0) {
                                             $rebilled = $member->rebilled;
                                             if ($num_cycles > $rebilled) {
                                                 $num = $num_cycles - $rebilled;
                                                 for ($i = 1; $i <= $num; $i++) {
                                                     $duration = $i * $subs_pack['duration'];
                                                     //days
                                                     if ($other_member->duration_type == 'd') {
                                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " days"));
                                                     }
                                                     //months
                                                     if ($other_member->duration_type == 'm') {
                                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " months"));
                                                     }
                                                     //years
                                                     if ($other_member->duration_type == 'y') {
                                                         $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " years"));
                                                     }
                                                     if (strtotime($d) <= strtotime($end_date)) {
                                                         if (!isset($recuring_cycles[$d])) {
                                                             $dt[] = $d;
                                                             $recuring_cycles[$d]['cost'] = $subs_pack['cost'];
                                                             $recuring_cycles[$d]['expire_date'] = $d;
                                                         } else {
                                                             $recuring_cycles[$d]['cost'] = $test[$d]['cost'] + $subs_pack['cost'];
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                         //num_cycles >0
                                         if ($num_cycles == 0 && $num_cycles != '' && !empty($subs_pack)) {
                                             $exp_date = $expire_date;
                                             //days
                                             if ($other_member->duration_type == 'd') {
                                                 $i = 1;
                                                 while (strtotime($exp_date) <= strtotime($end_date)) {
                                                     $duration = $i * $subs_pack['duration'];
                                                     $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " days"));
                                                     $exp_date = $d;
                                                     $i++;
                                                     if (strtotime($d) <= strtotime($end_date)) {
                                                         if (!isset($on_going[$d])) {
                                                             $dt[] = $d;
                                                             $on_going[$d]['cost'] = $subs_pack['cost'];
                                                             $on_going[$d]['expire_date'] = $d;
                                                         } else {
                                                             $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                                         }
                                                     }
                                                 }
                                             }
                                             //days end
                                             //months
                                             if ($other_member->duration_type == 'm') {
                                                 $i = 1;
                                                 while (strtotime($exp_date) <= strtotime($end_date)) {
                                                     $duration = $i * $subs_pack['duration'];
                                                     $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " months"));
                                                     $exp_date = $d;
                                                     $i++;
                                                     if (strtotime($d) <= strtotime($end_date)) {
                                                         if (!isset($on_going[$d])) {
                                                             $dt[] = $d;
                                                             $on_going[$d]['cost'] = $subs_pack['cost'];
                                                             $on_going[$d]['expire_date'] = $d;
                                                         } else {
                                                             $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                                         }
                                                     }
                                                 }
                                             }
                                             //moths end
                                             //years
                                             if ($other_member->duration_type == 'y') {
                                                 $i = 1;
                                                 while (strtotime($exp_date) <= strtotime($end_date)) {
                                                     $duration = $i * $subs_pack['duration'];
                                                     $d = date('Y-m-d', strtotime("{$expire_date} + " . $duration . " years"));
                                                     $exp_date = $d;
                                                     $i++;
                                                     if (strtotime($d) <= strtotime($end_date)) {
                                                         if (!isset($on_going[$d])) {
                                                             $dt[] = $d;
                                                             $on_going[$d]['cost'] = $subs_pack['cost'];
                                                             $on_going[$d]['expire_date'] = $d;
                                                         } else {
                                                             $on_going[$d]['cost'] = $on_going[$d]['cost'] + $subs_pack['cost'];
                                                         }
                                                     }
                                                 }
                                             }
                                             //years end
                                         }
                                         //$num_cycles ==0
                                     }
                                     //EXPIRE DATE GRATER THAN CURRENT DATE
                                 }
                                 //Membership Type
                             }
                         }
                     }
                 }
             }
             //users
         }
     }
     //exit;
     sort($dt);
     $dt = array_unique($dt);
     $dcount = count($dt);
     $data[0]['date_start'] = $date_start;
     $data[0]['date_end'] = $date_end;
     $data[0]['member_type'] = $member_type;
     // Migrating the recuring  and on going data to array
     for ($i = 0; $i < $dcount; $i++) {
         $udt = $dt[$i];
         if (!empty($udt)) {
             $data[$i]['date'] = $udt;
             //issue #1311
             if (isset($recuring_cycles[$udt]['cost']) && array_key_exists($udt, $recuring_cycles)) {
                 $data[$i]['cost'] = $data[$i]['cost'] + $recuring_cycles[$udt]['cost'];
             }
             if (isset($on_going[$udt]['cost']) && array_key_exists($udt, $on_going)) {
                 $data[$i]['cost'] = $data[$i]['cost'] + $on_going[$udt]['cost'];
             }
         }
     }
     return $data;
 }
/**
 * check memberships to extend/expire
 *
 * @params array $users
 * @return int $offset
 */
function mgm_check_memberships_to_extend($a_users)
{
    // found
    if (count($a_users) > 0) {
        // current date: timezone formatted
        $current_date = mgm_get_current_datetime('Y-m-d H:i:s');
        // with time part #1023 issue
        // packs
        $spacks_obj = mgm_get_class('subscription_packs');
        // process_inactive_users
        $process_inactive_users = bool_from_yn(mgm_get_class('system')->get_setting('enable_process_inactive_users'));
        // set
        $data['current_date'] = $current_date['date'];
        $data['current_timestamp'] = $current_date['timestamp'];
        $data['duration_exprs'] = $spacks_obj->get_duration_exprs();
        $checked = $offset = 0;
        // loop
        foreach ($a_users as $user) {
            // set limit
            @set_time_limit(300);
            //300s
            @ini_set('memory_limit', 134217728);
            // 128M
            //mem
            // get member
            $member = mgm_get_member($user->ID);
            // reset primary subscripton
            mgm_check_ongoing_member($user, $member, $spacks_obj, $data, false, $process_inactive_users);
            // check other memberships as well
            if (isset($member->other_membership_types) && is_array($member->other_membership_types) && !empty($member->other_membership_types)) {
                // loop
                foreach ($member->other_membership_types as $key => $val) {
                    // convert
                    $val = mgm_convert_array_to_memberobj($val, $user->ID);
                    // check
                    if (isset($val->membership_type) && !empty($val->membership_type) && !in_array($val->membership_type, array('guest'))) {
                        //skip if default value
                        mgm_check_ongoing_member($user, $val, $spacks_obj, $data, true, $process_inactive_users);
                    }
                }
            }
            // increment
            $offset++;
        }
        // return
        return $offset;
    }
    // return
    return 0;
}
/**
 * find members with selected custom filed critera
 * @param string $field
 * @return mixed array|int  
 */
function mgm_get_members_with_customfiled($field, $value)
{
    global $wpdb;
    $start = 0;
    $limit = 1000;
    //user meta fields
    $fields = array('user_id', 'meta_value');
    // sql
    $sql = "SELECT count(*) FROM `{$wpdb->usermeta}` WHERE `meta_key` = 'mgm_member_options' AND `user_id` <> 1";
    $count = $wpdb->get_var($sql);
    // init
    $members = array();
    //count
    if ($count) {
        //for
        for ($i = $start; $i < $count; $i = $i + $limit) {
            //users
            $users = mgm_patch_partial_user_member_options($i, $limit, $fields);
            // check
            if ($users) {
                // loop
                foreach ($users as $user) {
                    // vlid
                    $valid = false;
                    //name
                    $name = '';
                    $user_id = $user->user_id;
                    $member = unserialize($user->meta_value);
                    // convert
                    $member = mgm_convert_array_to_memberobj($member, $user_id);
                    // check
                    if (!empty($value) && isset($member->status) && $member->status == 'Active') {
                        // from custom field
                        if (isset($member->custom_fields->{$field}) && !empty($member->custom_fields->{$field})) {
                            $name = $member->custom_fields->{$field};
                        }
                        // clean
                        $value = mgm_stripslashes_deep($value);
                        // if there is a match
                        if (!empty($name) && strpos(strtolower($name), strtolower($value)) !== false) {
                            $valid = true;
                        } else {
                            $valid = false;
                        }
                    }
                    // store
                    if ($valid) {
                        $members[] = $user_id;
                    }
                    // unset object
                    unset($member);
                    unset($user);
                }
            }
        }
    }
    // return
    return $members;
}
            ?>
						
			<ul id="membership_tree_<?php 
            echo $user->ID;
            ?>
">
				<li>
					<strong class="underline"><?php 
            _e('Other Memberships', 'mgm');
            ?>
</strong>
					<ul>
						<?php 
            foreach ($member->other_membership_types as $key => $member_oth) {
                // other
                $member_oth = mgm_convert_array_to_memberobj($member_oth, $user->ID);
                // check
                if (isset($member_oth->membership_type) && !empty($member_oth->membership_type) && !in_array($member_oth->membership_type, array('trial', 'guest'))) {
                    //issue #: 509
                    if (strtolower($member_oth->membership_type) == 'guest') {
                        $pack_desc_oth = __('N/A', 'mgm');
                    } else {
                        // member data
                        $amount_oth = esc_html($member_oth->amount);
                        $currency_oth = esc_html($member_oth->currency);
                        $duration_oth = esc_html($member_oth->duration);
                        $duration_type_oth = $member_oth->duration_type;
                        $membership_type_oth = esc_html($member_oth->membership_type);
                        $pack_id_oth = $member_oth->pack_id;
                        $num_cycles_oth = isset($member_oth->active_num_cycles) ? $member_oth->active_num_cycles : null;
                        // get pack desc
/**
 * user unsubscribe
 */
function mgm_user_unsubscribe_info($user_id = NULL, $args = array())
{
    // current user
    if (!$user_id) {
        $user = wp_get_current_user();
    } else {
        // by user id
        $user = get_userdata($user_id);
    }
    // return when no user
    if (!isset($user->ID) || isset($user->ID) && (int) $user->ID == 0) {
        return sprintf(__('Please <a href="%s">login</a> to see your unsubscribe button.', 'mgm'), mgm_get_custom_url('login'));
    }
    // member
    $member = mgm_get_member($user->ID);
    // init
    $html = '';
    // button
    $html .= mgm_get_unsubscribe_status_button($member, $user);
    //other members count
    $subs_count = 0;
    // check
    if (isset($member->other_membership_types) && !empty($member->other_membership_types)) {
        // loop
        foreach ($member->other_membership_types as $key => $other_member) {
            //check
            if (!empty($other_member)) {
                //check
                if (is_array($other_member)) {
                    $other_member = mgm_convert_array_to_memberobj($other_member, $user->ID);
                }
                // status button
                $html .= mgm_get_other_unsubscribe_status_button($other_member, $user, $subs_count);
                //check
                if ($subs_count == 0) {
                    $subs_count++;
                }
            }
        }
    }
    //return
    return $html;
}
/**
 * authenticate user
 * 
 * @param object $user 
 * @param boolean $return 
 * @return mixed object or boolean
 */
function mgm_authenticate_user($user, $return = false)
{
    // user name
    $user_name = $user->user_login;
    // user is administrator, no check applied
    if (is_super_admin($user->ID)) {
        return $return ? true : $user;
    }
    // issue #1783- user is administrator, no check applied for multisite also
    if (is_multisite()) {
        //check
        if ($user->allcaps['delete_users']) {
            return $return ? true : $user;
        }
    }
    // issue #1711
    if (isset($_REQUEST['pwd']) && !wp_check_password($_REQUEST['pwd'], $user->user_pass, $user->ID)) {
        return new WP_Error('incorrect_password', sprintf(__('<strong>ERROR</strong>: The password you entered for the username <strong>%s</strong> is incorrect.'), $user_name));
    }
    // apply action
    do_action('mgm_pre_authenticate_user', $user->ID);
    // get member
    $member = mgm_get_member($user->ID);
    // check pack access
    if ($pack = mgm_get_class('subscription_packs')->get_pack($member->pack_id)) {
        // range
        if ($pack['duration_type'] == 'dr') {
            if (time() < strtotime($pack['duration_range_start_dt']) || time() > strtotime($pack['duration_range_end_dt'])) {
                // error
                return mgm_get_login_error($user, 'date_range', 'upgrade', $return, $pack);
            }
        }
        /// multiple user(IP checking)
        if (mgm_check_multiple_logins_violation($user, $member, $pack)) {
            // error
            return mgm_get_login_error($user, 'multiple_logins', 'upgrade', $return, $pack);
        }
    }
    // no status
    if ($member->status === FALSE) {
        return $return ? true : $user;
    }
    // allowed statuses
    $allowed_statuses = array(MGM_STATUS_ACTIVE, MGM_STATUS_AWAITING_CANCEL);
    // active, awaiting cancelled
    if (in_array($member->status, $allowed_statuses)) {
        // never expire
        if (empty($member->expire_date)) {
            return $return ? true : $user;
        }
        // check expire
        if (!empty($member->expire_date) && time() > strtotime($member->expire_date)) {
            // old status
            $old_status = $member->status;
            // set new status
            $member->status = $new_status = strtolower($member->membership_type) == 'trial' ? MGM_STATUS_TRIAL_EXPIRED : MGM_STATUS_EXPIRED;
            // update
            $member->save();
            // action
            do_action('mgm_user_status_change', $user->ID, $new_status, $old_status, 'authenticate_user', $member->pack_id);
        } else {
            // return
            return $return ? true : $user;
            // account is current. Let the user login.
        }
    } else {
        // multiple membership (issue#: 400) modification
        $others_active = 0;
        // check any other membership exists with active status
        if (isset($member->other_membership_types) && is_array($member->other_membership_types) && !empty($member->other_membership_types)) {
            // loop
            foreach ($member->other_membership_types as $key => $mem_obj) {
                // object
                $mem_obj = mgm_convert_array_to_memberobj($mem_obj, $user->ID);
                // check
                if (is_numeric($mem_obj->pack_id) && in_array($mem_obj->status, $allowed_statuses)) {
                    // check for expiry
                    if (!empty($mem_obj->expire_date) && time() > strtotime($mem_obj->expire_date)) {
                        // old status
                        $old_status = $mem_obj->status;
                        // set new status
                        $mem_obj->status = $new_status = MGM_STATUS_EXPIRED;
                        // update member object
                        mgm_save_another_membership_fields($mem_obj, $user->ID);
                        // action
                        do_action('mgm_user_status_change', $user->ID, $new_status, $old_status, 'authenticate_user', $mem_obj->pack_id);
                    } else {
                        $others_active++;
                    }
                }
            }
            // one of the other memberships is active. Let the user login.
            if ($others_active > 0) {
                // return
                return $return ? true : $user;
            }
        }
        // Force upgrade if status: Expired and free user
        $action = mgm_force_upgrade_if_freepack($member);
    }
    // if reached this, then there is error ---------------------------------------
    // set temp login cookie for editing user data
    if (isset($_POST['pwd']) && wp_check_password($_POST['pwd'], $user->user_pass, $user->ID)) {
        setcookie('wp_tempuser_login', $user->ID, time() + 60 * 60, SITECOOKIEPATH);
        // 1 hr
    }
    // default action
    if (!isset($action)) {
        $action = 'complete_payment';
    }
    // error
    return mgm_get_login_error($user, $member->status, $action, $return);
}
 function membership_type_update()
 {
     global $wpdb;
     extract($_POST);
     // init
     $message = $status = '';
     // new type -------------------------------------------------------------------
     if (isset($new_membership_type) && !empty($new_membership_type)) {
         // new type
         $new_membership_type = trim($new_membership_type);
         // allowed only
         if (strtolower($new_membership_type) != 'none') {
             // set
             $membership_types_obj = mgm_get_class('membership_types');
             // set type, check duplicate
             $success = $membership_types_obj->set_membership_type($new_membership_type);
             // update
             if ($success) {
                 // add redirect url
                 $n_login_redirect_url = isset($new_login_redirect_url) ? $new_login_redirect_url : '';
                 $n_logout_redirect_url = isset($new_logout_redirect_url) ? $new_logout_redirect_url : '';
                 $n_type_code = $membership_types_obj->get_type_code($new_membership_type);
                 // set url
                 $membership_types_obj->set_login_redirect($n_type_code, $n_login_redirect_url);
                 $membership_types_obj->set_logout_redirect($n_type_code, $n_logout_redirect_url);
                 // update
                 $membership_types_obj->save();
                 // message
                 $message = sprintf(__('Successfully created new membership type: %s.', 'mgm'), mgm_stripslashes_deep($new_membership_type));
                 $status = 'success';
             } else {
                 $message = sprintf(__('Error while creating new membership type: %s. Duplicate type.', 'mgm'), mgm_stripslashes_deep($new_membership_type));
                 $status = 'error';
             }
         } else {
             $message = sprintf(__('Error while creating new membership type: %s. Not allowed.', 'mgm'), mgm_stripslashes_deep($new_membership_type));
             $status = 'error';
         }
     }
     // delete/move account ------------------------------------------------------------
     if (isset($remove_membership_type) && count($remove_membership_type) > 0) {
         // get object
         $membership_types_obj = mgm_get_class('membership_types');
         // users
         $users = mgm_get_all_userids(array('ID'), 'get_results');
         // how many removed
         $removed = 0;
         // loop
         foreach ($remove_membership_type as $type_code) {
             // unset
             $membership_types_obj->unset_membership_type($type_code);
             // move
             if (isset($move_membership_type_to[$type_code]) && $move_membership_type_to[$type_code] != 'none') {
                 // loop
                 foreach ($users as $user) {
                     // get
                     $member = mgm_get_member($user->ID);
                     // if users with same membershiptype as that of selected
                     if ($member->membership_type == $type_code) {
                         // set
                         $member->membership_type = $move_membership_type_to[$type_code];
                         // save
                         $member->save();
                     } else {
                         // check if any multiple levels exist:
                         if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
                             // loop
                             foreach ($member->other_membership_types as $key => $memtypes) {
                                 // make sure its an object:
                                 $memtypes = mgm_convert_array_to_memberobj($memtypes, $user->ID);
                                 // verify
                                 if ($memtypes->membership_type == $type_code) {
                                     // set
                                     $memtypes->membership_type = $move_membership_type_to[$type_code];
                                     // save
                                     mgm_save_another_membership_fields($memtypes, $user->ID, $key);
                                     break;
                                 }
                             }
                         }
                     }
                     // unset
                     unset($member);
                 }
             }
             // remove packs
             $subscription_packs = mgm_get_class('subscription_packs');
             // empty
             $packs = array();
             // set
             foreach ($subscription_packs->packs as $i => $pack) {
                 // if membership_type is same as being deleted
                 if ($pack['membership_type'] == $type_code) {
                     continue;
                     // skip
                 }
                 // filtered
                 $packs[] = $pack;
             }
             // set
             $subscription_packs->set_packs($packs);
             // update
             $subscription_packs->save();
             // removed
             $removed++;
         }
         // ends remove pack:
         // save
         $membership_types_obj->save();
         // message
         $message .= (!empty($message) ? '<br>' : '') . sprintf(__('Successfully removed %d membership type(s).', 'mgm'), $removed);
         // set status
         $status = 'success';
     }
     // update name/redirects ------------------------------------------------------------------------
     // get object
     $membership_types_obj = mgm_get_class('membership_types');
     // ge all users
     $users = mgm_get_all_userids(array('ID'), 'get_results');
     // init
     $updated = 0;
     // loop types
     foreach ($membership_types_obj->get_membership_types() as $type_code => $type_name) {
         // skip new type, in edit otherwise overwritten
         if (isset($n_type_code) && !empty($n_type_code) && $n_type_code == $type_code) {
             continue;
         }
         // urls
         $_login_redirect_url = isset($login_redirect_url[$type_code]) ? $login_redirect_url[$type_code] : '';
         $_logout_redirect_url = isset($logout_redirect_url[$type_code]) ? $logout_redirect_url[$type_code] : '';
         // set urls
         $membership_types_obj->set_login_redirect($type_code, $_login_redirect_url);
         $membership_types_obj->set_logout_redirect($type_code, $_logout_redirect_url);
         // set name
         if (isset($membership_type_names[$type_code]) && !empty($membership_type_names[$type_code]) && $membership_type_names[$type_code] != $type_name) {
             //issue #1127
             $new_type_code = $membership_types_obj->get_type_code($membership_type_names[$type_code]);
             //check
             if ($new_type_code != $type_code) {
                 // get object
                 $obj_sp = mgm_get_class('subscription_packs');
                 //update new
                 foreach ($obj_sp->packs as $key => $pack) {
                     if ($obj_sp->packs[$key]['membership_type'] == $type_code) {
                         $obj_sp->packs[$key]['membership_type'] = $new_type_code;
                         $obj_sp->save();
                     }
                 }
                 // loop
                 foreach ($users as $user) {
                     // get
                     $member = mgm_get_member($user->ID);
                     // if users with same membershiptype as that of selected
                     if (isset($member->membership_type) && $member->membership_type == $type_code) {
                         // set
                         $member->membership_type = $new_type_code;
                         // save
                         $member->save();
                     }
                     // check if any multiple levels exist:
                     if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
                         // loop
                         foreach ($member->other_membership_types as $key => $memtypes) {
                             // make sure its an object:
                             $memtypes = mgm_convert_array_to_memberobj($memtypes, $user->ID);
                             // verify
                             if ($memtypes->membership_type == $type_code) {
                                 // set
                                 $memtypes->membership_type = $new_type_code;
                                 // save
                                 mgm_save_another_membership_fields($memtypes, $user->ID, $key);
                             }
                         }
                     }
                     // unset
                     unset($member);
                 }
                 //issue #1336
                 $membership_posts = mgm_get_posts_for_level($type_code);
                 if (isset($membership_posts['total']) && $membership_posts['total'] > 0) {
                     foreach ($membership_posts['posts'] as $id => $obj) {
                         $post_id = $obj->ID;
                         // get object
                         $post_obj = mgm_get_post($post_id);
                         // if access set
                         if (is_array($post_obj->access_membership_types)) {
                             $access_membership_types = $post_obj->access_membership_types;
                             foreach ($post_obj->access_membership_types as $key => $access_membership_type) {
                                 if ($access_membership_type == $type_code) {
                                     //update rename
                                     $access_membership_types[$key] = $new_type_code;
                                     // set
                                     $post_obj->access_membership_types = $access_membership_types;
                                 }
                             }
                         }
                         // if access delay set
                         if (is_array($post_obj->access_delay)) {
                             $access_delay = $post_obj->access_delay;
                             if (isset($access_delay[$type_code])) {
                                 $access_delay[$new_type_code] = $access_delay[$type_code];
                                 unset($access_delay[$type_code]);
                                 $post_obj->access_delay = $access_delay;
                             }
                         }
                         // apply filter
                         $post_obj = apply_filters('mgm_post_update', $post_obj, $post_id);
                         // save meta
                         $post_obj->save();
                         // unset
                         unset($post_obj);
                     }
                 }
                 //unset
                 $membership_types_obj->unset_membership_type($type_code);
                 // set
                 $membership_types_obj->set_name($membership_type_names[$type_code], $new_type_code);
             } else {
                 // set
                 $membership_types_obj->set_name($membership_type_names[$type_code], $type_code);
             }
         }
         // update
         $updated++;
     }
     // update
     $membership_types_obj->save();
     // notify
     if (empty($message)) {
         // message
         $message = sprintf(__('Successfully updated %d membership type(s).', 'mgm'), $updated);
         // set status
         $status = 'success';
     }
     // return response
     echo json_encode(array('status' => $status, 'message' => $message));
     exit;
 }
/**
 * Save member object after Multiple Membership Upgrade
 * replace upgrade mgm_member with old mgm_member
 * @param array $data
 * @param int $trans_id
 */
function mgm_multiple_upgrade_save_memberobject($data, $trans_id)
{
    if (empty($data['multiple_upgrade_prev_packid'])) {
        return;
    }
    if (isset($data['user_id'])) {
        $member = mgm_get_member($data['user_id']);
        if (isset($member->other_membership_types) && is_array($member->other_membership_types) && count($member->other_membership_types) > 0) {
            // loop
            $prev_index = null;
            $new_index = null;
            foreach ($member->other_membership_types as $index => $member) {
                $member = mgm_convert_array_to_memberobj($member, $data['user_id']);
                //skip default values:
                //if(strtolower($memtypes->membership_type) == 'guest' || $memtypes->status == MGM_STATUS_NULL )	continue;
                if (strtolower($member->membership_type) == 'guest') {
                    continue;
                }
                // find previous member object index to be replaced
                if ($data['multiple_upgrade_prev_packid'] == $member->pack_id) {
                    $prev_index = $index;
                }
                // find newsly inserted member object index
                // consider only for success state
                if ($member->status == MGM_STATUS_ACTIVE && $data['pack_id'] == $member->pack_id) {
                    $new_index = $index;
                }
            }
            if (is_numeric($prev_index) && is_numeric($new_index)) {
                // swap old with new
                $member->other_membership_types[$prev_index] = $member->other_membership_types[$new_index];
                // remove old member object as it is an upgrade
                unset($member->other_membership_types[$new_index]);
                // save all
                $member->save();
                // update transacton - reset multiple_upgrade_prev_packid
                // to not consider next time
                // get
                $trans = mgm_get_transaction($trans_id);
                // reset
                $trans['data']['multiple_upgrade_prev_packid'] = '';
                // update
                mgm_update_transaction(array('data' => json_encode($trans['data'])), $trans_id);
            }
        }
    }
}