/** * Returns a query arg structure tailored to give the defined results * * @since 1.0.0 * @return array Query args */ protected function prepare_query_args($args) { lib2()->array->equip_request('s', 'membership_id', 'search_options', 'status'); // Prepare order by statement. if (!empty($_REQUEST['orderby']) && !empty($_REQUEST['order'])) { $args['orderby'] = $_REQUEST['orderby']; $args['order'] = $_REQUEST['order']; } // Filter by search-term $search_filter = $_REQUEST['s']; if (!empty($search_filter)) { $this->search_string = $search_filter; $search_option = $_REQUEST['search_options']; switch ($search_option) { case 'email': case 'username': $args['search'] = sprintf('*%s*', $search_filter); break; default: $args['meta_query'][$search_option] = array('key' => $search_option, 'value' => $search_filter, 'compare' => 'LIKE'); break; } $args['posts_per_page'] = -1; $args['number'] = false; $args['offset'] = 0; } // Filter by membership_id and membership status $membership_id = $_REQUEST['membership_id']; $members = array(); $filter = array(); if (!empty($membership_id)) { $filter['membership_id'] = $membership_id; } if (!empty($status)) { $filter['status'] = $status; } if (!empty($filter)) { $subscriptions = MS_Model_Relationship::get_subscriptions($filter); foreach ($subscriptions as $subscription) { $members[$subscription->user_id] = $subscription->user_id; } // Workaround to invalidate query if (empty($members)) { $members[0] = 0; } $args['include'] = $members; } return $args; }
/** * Returns the contens of the dialog * * @since 1.0.0 * * @return object */ public function get_contents($data) { $member = $data['model']; $currency = MS_Plugin::instance()->settings->currency; $show_trial = MS_Model_Addon::is_enabled(MS_Model_Addon::ADDON_TRIAL); $all_subscriptions = MS_Model_Relationship::get_subscriptions(array('user_id' => $member->id, 'status' => 'all', 'meta_key' => 'expire_date', 'orderby' => 'meta_value', 'order' => 'DESC')); // Prepare the form fields. $inp_dialog = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'dialog', 'value' => 'View_Member_Dialog'); $inp_id = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'member_id', 'value' => $member->id); $inp_nonce = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => '_wpnonce', 'value' => wp_create_nonce(self::ACTION_SAVE)); $inp_action = array('type' => MS_Helper_Html::INPUT_TYPE_HIDDEN, 'name' => 'dialog_action', 'value' => self::ACTION_SAVE); $inp_save = array('type' => MS_Helper_Html::INPUT_TYPE_SUBMIT, 'value' => __('Save', 'membership2'), 'class' => 'ms-submit-form', 'data' => array('form' => 'ms-edit-member')); $inp_cancel = array('type' => MS_Helper_Html::INPUT_TYPE_BUTTON, 'value' => __('Close', 'membership2'), 'class' => 'close'); ob_start(); ?> <div> <form class="ms-form wpmui-ajax-update ms-edit-member" data-wpmui-ajax="<?php echo esc_attr('save'); ?> "> <div class="ms-form wpmui-form wpmui-grid-8"> <table class="widefat"> <thead> <tr> <th class="column-membership"> <?php _e('Membership', 'membership2'); ?> </th> <th class="column-status"> <?php _e('Status', 'membership2'); ?> </th> <th class="column-start"> <?php _e('Subscribed on', 'membership2'); ?> </th> <th class="column-expire"> <?php _e('Expires on', 'membership2'); ?> </th> <?php if ($show_trial) { ?> <th class="column-trialexpire"> <?php _e('Trial until', 'membership2'); ?> </th> <?php } ?> <th class="column-payments"> <?php _e('Payments', 'membership2'); ?> </th> </tr> </thead> <tbody> <?php foreach ($all_subscriptions as $subscription) { $membership = $subscription->get_membership(); $payments = $subscription->get_payments(); $num_payments = count($payments); $amount_payments = 0; foreach ($payments as $payment) { $amount_payments += $payment['amount']; } $subscription_info = array('subscription_id' => $subscription->id); $update_info = array('subscription_id' => $subscription->id, 'statuscheck' => 'yes'); ?> <tr> <td class="column-membership"> <?php $membership->name_tag(); ?> </td> <td class="column-status"> <?php printf('<a href="#" data-ms-dialog="View_Member_Subscription" data-ms-data="%2$s">%1$s</a> <a href="#" data-ms-dialog="View_Member_Subscription" data-ms-data="%3$s" title="%5$s">%4$s</a>', $subscription->status, esc_attr(json_encode($subscription_info)), esc_attr(json_encode($update_info)), '<i class="dashicons dashicons-update"></i>', __('Check and update subscription status', 'membership2')); ?> </td> <td class="column-start"> <?php echo $subscription->start_date; ?> </td> <td class="column-expire"> <?php echo $subscription->expire_date; ?> </td> <?php if ($show_trial) { ?> <td class="column-trialexpire"> <?php if ($subscription->start_date == $subscription->trial_expire_date) { echo '-'; } else { echo $subscription->trial_expire_date; } ?> </td> <?php } ?> <td class="column-payments"> <?php $total = sprintf('<b>%1$s</b> (%3$s %2$s)', $num_payments, MS_Helper_Billing::format_price($amount_payments), $currency); printf('<a href="#" data-ms-dialog="View_Member_Payment" data-ms-data="%1$s">%2$s</a>', esc_attr(json_encode($subscription_info)), $total); ?> </td> </tr> <?php } ?> </tbody> </table> </div> <?php MS_Helper_Html::html_element($inp_id); MS_Helper_Html::html_element($inp_dialog); MS_Helper_Html::html_element($inp_nonce); MS_Helper_Html::html_element($inp_action); ?> </form> <div class="buttons"> <?php MS_Helper_Html::html_element($inp_cancel); // MS_Helper_Html::html_element( $inp_save ); ?> </div> </div> <?php $html = ob_get_clean(); return apply_filters('ms_view_member_dialog_to_html', $html); }
/** * Display Membership Overview page. * * @since 1.0.0 */ public function page_overview() { $membership = $this->load_membership(); $membership_id = $membership->id; $data = array(); $data['step'] = $this->get_step(); $data['action'] = self::ACTION_SAVE; $data['membership'] = $membership; $data['bread_crumbs'] = $this->get_bread_crumbs(); $data['members'] = array(); $subscriptions = MS_Model_Relationship::get_subscriptions(array('membership_id' => $membership->id)); foreach ($subscriptions as $subscription) { $data['members'][] = $subscription->get_member(); } switch ($membership->type) { case MS_Model_Membership::TYPE_DRIPPED: $view = MS_Factory::create('MS_View_Membership_Overview_Dripped'); break; default: case MS_Model_Membership::TYPE_STANDARD: $view = MS_Factory::create('MS_View_Membership_Overview_Simple'); break; } // Select Events args $args = array(); $args['meta_query']['membership_id'] = array('key' => 'membership_id', 'value' => array($membership_id, 0), 'compare' => 'IN'); $data['events'] = MS_Model_Event::get_events($args); $view = apply_filters('ms_view_membership_overview', $view); $view->data = apply_filters('ms_view_membership_overview_data', $data, $this); $view->render(); }
/** * Membership account page shortcode callback function. * * @since 1.0.0 * * @param mixed[] $atts Shortcode attributes. */ public function membership_account($atts) { MS_Helper_Shortcode::did_shortcode(MS_Helper_Shortcode::SCODE_MS_ACCOUNT); $data = apply_filters('ms_controller_shortcode_membership_account_atts', shortcode_atts(array('show_membership' => true, 'show_membership_change' => true, 'membership_title' => __('Your Membership', 'membership2'), 'membership_change_label' => __('Change', 'membership2'), 'show_profile' => true, 'show_profile_change' => true, 'profile_title' => __('Personal details', 'membership2'), 'profile_change_label' => __('Edit', 'membership2'), 'show_invoices' => true, 'limit_invoices' => 10, 'show_all_invoices' => true, 'invoices_title' => __('Invoices', 'membership2'), 'invoices_details_label' => __('View all', 'membership2'), 'show_activity' => true, 'limit_activities' => 10, 'show_all_activities' => true, 'activity_title' => __('Activities', 'membership2'), 'activity_details_label' => __('View all', 'membership2')), $atts)); $data['show_membership'] = lib3()->is_true($data['show_membership']); $data['show_membership_change'] = lib3()->is_true($data['show_membership_change']); $data['show_profile'] = lib3()->is_true($data['show_profile']); $data['show_profile_change'] = lib3()->is_true($data['show_profile_change']); $data['show_invoices'] = lib3()->is_true($data['show_invoices']); $data['show_all_invoices'] = lib3()->is_true($data['show_all_invoices']); $data['show_activity'] = lib3()->is_true($data['show_activity']); $data['show_all_activities'] = lib3()->is_true($data['show_all_activities']); $data['limit_invoices'] = absint($data['limit_invoices']); $data['limit_activities'] = absint($data['limit_activities']); $data['member'] = MS_Model_Member::get_current_member(); $data['membership'] = array(); $subscriptions = MS_Model_Relationship::get_subscriptions(array('user_id' => $data['member']->id, 'status' => 'all')); if (is_array($subscriptions)) { foreach ($subscriptions as $subscription) { // Do not display system-memberships in Account if ($subscription->is_system()) { continue; } // Do not display deactivated memberships in Account if ($subscription->get_status() == MS_Model_Relationship::STATUS_DEACTIVATED) { continue; } $data['subscription'][] = $subscription; } } $data['invoices'] = MS_Model_Invoice::get_public_invoices($data['member']->id, $data['limit_invoices']); $data['events'] = MS_Model_Event::get_events(array('author' => $data['member']->id, 'posts_per_page' => $data['limit_activities'])); $view = MS_Factory::create('MS_View_Shortcode_Account'); $view->data = apply_filters('ms_view_shortcode_account_data', $data, $this); return $view->to_html(); }
/** * Get members list of this membership. * * This will also count members that have "cancelled" or "expired" * subscriptions but not "pending" or "deactivated". * * To change this use the filter parameter: * $args = array( 'status' => 'all' ) * * @since 1.0.1.0 * @api * * @param array $args The query post args * @return array List of members. */ public function get_members($args = null) { $args = wp_parse_args(array('membership_id' => $this->id), $args); // Get a list of subscriptions. $items = MS_Model_Relationship::get_subscriptions($args); // Get a list of members. $result = array(); foreach ($items as $item) { $result[$item->user_id] = $item->get_member(); } return apply_filters('ms_model_membership_get_members', $result, $args, $this); }
/** * Removes all subscriptions and memberships from the current site. * This is done before the import if the "Replace existing data" flag is set. * * @since 1.0.0 */ protected function clear_memberships() { // Delete all Relationships. $subscriptions = MS_Model_Relationship::get_subscriptions(array('status' => 'all')); foreach ($subscriptions as $subscription) { $subscription->delete(); } // Delete all Memberships. $memberships = MS_Model_Membership::get_memberships(); foreach ($memberships as $membership) { if ($membership->is_base()) { continue; } $membership->delete(true); } }
/** * Load MS_Model_Member Object. * * Load from user and user meta. * This data is always network-wide. * * @since 1.0.0 * * @param MS_Model_Member $model The empty member instance. * @param int $user_id The user/member ID. * * @return MS_Model_Member The retrieved object. */ protected static function load_from_wp_user($model, $user_id, $name = null) { $class = get_class($model); $cache = wp_cache_get($user_id, $class); if ($cache) { $model = $cache; } else { $wp_user = new WP_User($user_id, $name); if (!empty($wp_user->ID)) { $member_details = get_user_meta($user_id); $model->id = $wp_user->ID; $model->username = $wp_user->user_login; $model->email = $wp_user->user_email; $model->name = $wp_user->user_nicename; $model->first_name = $wp_user->first_name; $model->last_name = $wp_user->last_name; $model->wp_user = $wp_user; self::populate_model($model, $member_details, 'ms_'); // Load membership_relationships $model->subscriptions = MS_Model_Relationship::get_subscriptions(array('user_id' => $model->id)); } } return apply_filters('ms_factory_load_from_wp_user', $model, $class, $user_id); }
/** * Check membership status. * * Execute actions when time/period condition are met. * E.g. change membership status, add communication to queue, create invoices. * * @since 1.0.0 */ public function check_membership_status() { do_action('ms_model_plugin_check_membership_status_before', $this); if ($this->member->is_simulated_user()) { return; } $args = apply_filters('ms_model_plugin_check_membership_status_get_subscription_args', array('status' => 'valid')); $subscriptions = MS_Model_Relationship::get_subscriptions($args); foreach ($subscriptions as $subscription) { $subscription->check_membership_status(); } do_action('ms_model_plugin_check_membership_status_after', $this); }
/** * Check membership status. * * Execute actions when time/period condition are met. * E.g. change membership status, add communication to queue, create invoices. * * @since 1.0.0 */ public function check_membership_status() { do_action('ms_model_plugin_check_membership_status_before', $this); if ($this->member->is_simulated_user()) { return; } /* * For performance reasons we only process a small batch at once. * Here we find out, which subscriptions should be processed during * the current request. */ $offset = (int) MS_Factory::get_option('ms_batch_check_offset_flag'); // Find the next X subscriptions from DB. $args = apply_filters('ms_model_plugin_check_membership_status_get_subscription_args', array('status' => 'valid', 'orderby' => 'ID', 'posts_per_page' => $this->_process_per_batch, 'offset' => $offset, 'nopaging' => false)); $subscriptions = MS_Model_Relationship::get_subscriptions($args); if (count($subscriptions) < $this->_process_per_batch) { // We processed all subscriptions. Clean up. MS_Factory::delete_option('ms_batch_check_offset_flag'); } else { // We did not process all subscriptions. Remember where to continue. MS_Factory::update_option('ms_batch_check_offset_flag', $offset + $this->_process_per_batch); // Re-scheduling the cron job will run it again on next page load. $hook = 'ms_cron_check_membership_status'; wp_clear_scheduled_hook($hook); $this->setup_cron_services($hook); } // Perform the actual status checks! foreach ($subscriptions as $subscription) { error_log('This is ' . $subscription->id); $subscription->check_membership_status(); } do_action('ms_model_plugin_check_membership_status_after', $this); }
/** * Load MS_Model_Member Object. * * Load from user and user meta. * This data is always network-wide. * * @since 1.0.0 * * @param MS_Model_Member $model The empty member instance. * @param int $user_id The user/member ID. * * @return MS_Model_Member The retrieved object. */ protected static function load_from_wp_user($model, $user_id, $name = null) { $class = get_class($model); $cache = wp_cache_get($user_id, $class); if ($cache) { $model = $cache; } else { $wp_user = new WP_User($user_id, $name); if (!empty($wp_user->ID)) { $member_details = get_user_meta($user_id); $model->id = $wp_user->ID; $model->username = $wp_user->user_login; $model->email = $wp_user->user_email; $model->name = $wp_user->display_name; $model->first_name = $wp_user->first_name; $model->last_name = $wp_user->last_name; $model->wp_user = $wp_user; if (!$model->name) { if ($model->first_name) { $model->name = $model->first_name . ' ' . $model->last_name; } else { $model->name = $wp_user->user_login; } $model->name = ucwords(strtolower($model->name)); } $model->name = trim($model->name); /** * Manually customize the display name of the user via a filter. * * @since 1.0.1.2 * @param string $name The default display name used by M2. * @param WP_User $wp_user The user object used to populate the name. */ $model->name = apply_filters('ms_model_user_set_name', $model->name, $wp_user); // Remove automatic populated values from metadata, if present. unset($member_details['ms_username']); unset($member_details['ms_email']); unset($member_details['ms_name']); unset($member_details['ms_first_name']); unset($member_details['ms_last_name']); self::populate_model($model, $member_details, 'ms_'); // Load membership_relationships $model->subscriptions = MS_Model_Relationship::get_subscriptions(array('user_id' => $model->id)); } } return apply_filters('ms_factory_load_from_wp_user', $model, $class, $user_id); }