public function get_dripped_page_ids($data) { // Legacy rule, dripped doesn't apply if ($this->is_legacy_rule($data)) { return $data; } // Get the key variables $page_ids = $this->get_page_ids($data); $page_drip = $this->get_page_days($data); $page_unit = $this->get_page_days_units($data); // New array of ids $drip_page_ids = array(); $dates = Membership_Model_Level::get_dates($this->level_data); if (!empty($dates)) { // If the user has multiple start dates because of different subscriptions, pick the first start date $start = strtotime($dates[0]->startdate); foreach ($dates as $date) { $new_start = strtotime($date->startdate); $start = $start > $new_start ? $new_start : $start; } $now = time(); $datediff = $now - $start; $days = floor($datediff / (60 * 60 * 24)); // could be negative, but that doesn't matter // Get the key variables $page_ids = $this->get_page_ids($data); $page_drip = $this->get_page_days($data); $page_unit = $this->get_page_days_units($data); // Check each page against dripped requirements foreach ($page_ids as $key => $page) { $days_required = $page_drip[$key]; switch ($page_unit[$key]) { case 'd': $days_required = $days_required; break; case 'w': $days_required = $days_required * 7; break; case 'm': $days_required = $days_required * 30; break; } if ($days >= $days_required || 0 == $days_required) { $drip_page_ids[$key] = $page; } } } else { $drip_page_ids = $page_ids; } return $drip_page_ids; }
public function move_subscription($fromsub_id, $tosub_id, $tolevel_id, $to_order) { if (!apply_filters('pre_membership_move_subscription', true, $fromsub_id, $tosub_id, $tolevel_id, $to_order, $this->ID)) { return false; } membership_debug_log(sprintf(__('MEMBER: Moving subscription from %d to %d', 'membership'), $fromsub_id, $tosub_id)); $factory = Membership_Plugin::factory(); // Check if existing level matches new one but it is a serial or indefinite level $subscription = $factory->get_subscription($tosub_id); $nextlevel = $subscription->get_next_level($tolevel_id, $to_order); if (!$this->on_level($tolevel_id, true, $to_order) || $this->on_level($tolevel_id, true, $to_order) && ($nextlevel->sub_type == 'serial' || $nextlevel->sub_type == 'indefinite') && $this->on_sub($fromsub_id)) { membership_debug_log(sprintf(__('MEMBER: New level to move to %d on order %d', 'membership'), $tolevel_id, $to_order)); // Get the level for this subscription before removing it $fromlevel_id = $this->get_level_for_sub($fromsub_id); // grab the level information for this position $subscription = $factory->get_subscription($tosub_id); $level = $subscription->get_level_at($tolevel_id, $to_order); if ($level) { $period = 'days'; $now = current_time('mysql'); $start = strtotime($now); switch ($level->level_period_unit) { case 'd': $period = 'days'; break; case 'w': $period = 'weeks'; break; case 'm': $period = 'months'; break; case 'y': $period = 'years'; break; } //subscription start and end date $start_sub = $tosub_id == $fromsub_id ? get_user_meta($this->ID, 'start_current_' . $fromsub_id, true) : $start; $expires_sub = $this->get_subscription_expire_date($subscription, $tolevel_id, $fromsub_id, $fromlevel_id); //level end date $expires = gmdate('Y-m-d H:i:s', strtotime('+' . $level->level_period . ' ' . $period, $start)); // Update users start and expiry meta delete_user_meta($this->ID, 'start_current_' . $fromsub_id); delete_user_meta($this->ID, 'expire_current_' . $fromsub_id); delete_user_meta($this->ID, 'sent_msgs_' . $fromsub_id); // get the gateway and then remove it from the usermeta $gateway = get_user_meta($this->ID, 'using_gateway_' . $fromsub_id, true); delete_user_meta($this->ID, 'using_gateway_' . $fromsub_id); update_user_meta($this->ID, 'start_current_' . $tosub_id, $start_sub); update_user_meta($this->ID, 'expire_current_' . $tosub_id, $expires_sub); update_user_meta($this->ID, 'using_gateway_' . $tosub_id, $gateway); $this->_wpdb->update(MEMBERSHIP_TABLE_RELATIONS, array('sub_id' => $tosub_id, 'level_id' => $tolevel_id, 'updateddate' => $now, 'expirydate' => $expires, 'order_instance' => $level->level_order), array('sub_id' => $fromsub_id, 'user_id' => $this->ID)); // Update the associated role $this->set_role(Membership_Model_Level::get_associated_role($level->level_id)); membership_debug_log(sprintf(__('MEMBER: Completed move to %d on order %d on sub %d', 'membership'), $tolevel_id, $to_order, $tosub_id)); do_action('membership_move_subscription', $fromsub_id, $fromlevel_id, $tosub_id, $tolevel_id, $to_order, $this->ID); } } else { membership_debug_log(sprintf(__('MEMBER: Already on level %d on order %d', 'membership'), $tolevel_id, $to_order)); } }