public function prepare_items()
 {
     $this->_column_headers = array($this->get_columns(), $this->get_hidden_columns(), $this->get_sortable_columns());
     $total_items = MS_Addon_Invitation_Model::get_invitation_count();
     $per_page = $this->get_items_per_page('invitation_per_page', 10);
     $current_page = $this->get_pagenum();
     $args = array('posts_per_page' => $per_page, 'offset' => ($current_page - 1) * $per_page);
     $this->items = apply_filters('ms_addon_invitation_helper_listtable_invitation_items', MS_Addon_Invitation_Model::get_invitations($args));
     $this->set_pagination_args(array('total_items' => $total_items, 'per_page' => $per_page));
 }
 /**
  * Completely whipe all Membership data from Database.
  *
  * Note: This function is not used currently...
  *
  * @since  1.0.0
  */
 private static function cleanup_db()
 {
     global $wpdb;
     $sql = array();
     $trash_ids = array();
     // Delete membership meta-data from users.
     $users = MS_Model_Member::get_members();
     foreach ($users as $user) {
         $user->delete_all_membership_usermeta();
         $user->save();
     }
     // Determine IDs of Membership Pages.
     $page_types = MS_Model_Pages::get_page_types();
     foreach ($page_types as $type => $name) {
         $page_id = MS_Model_Pages::get_setting($type);
         $trash_ids[] = $page_id;
     }
     /**
      * Delete all plugin settings.
      * Settings are saved by classes that extend MS_Model_option
      */
     foreach (MS_Model_Gateway::get_gateways() as $option) {
         $option->delete();
     }
     MS_Factory::load('MS_Model_Addon')->delete();
     MS_Factory::load('MS_Model_Pages')->delete();
     MS_Factory::load('MS_Model_Settings')->delete();
     /**
      * Delete transient data
      * Transient data is saved by classed that extend MS_Model_Transient
      */
     MS_Factory::load('MS_Model_Simulate')->delete();
     /**
      * Delete all plugin content.
      * Content is saved by classes that extend MS_Model_CustomPostType
      */
     $ms_posttypes = array(MS_Model_Communication::get_post_type(), MS_Model_Event::get_post_type(), MS_Model_Invoice::get_post_type(), MS_Model_Transactionlog::get_post_type(), MS_Model_Membership::get_post_type(), MS_Model_Relationship::get_post_type(), MS_Addon_Coupon_Model::get_post_type(), MS_Addon_Invitation_Model::get_post_type());
     foreach ($ms_posttypes as $type) {
         $sql[] = $wpdb->prepare("DELETE FROM {$wpdb->posts} WHERE post_type = %s;", $type);
     }
     // Remove orphaned post-metadata.
     $sql[] = "\n\t\tDELETE FROM {$wpdb->postmeta}\n\t\tWHERE NOT EXISTS (\n\t\t\tSELECT 1 FROM {$wpdb->posts} tmp WHERE tmp.ID = post_id\n\t\t);\n\t\t";
     // Clear all WP transient cache.
     $sql[] = "\n\t\tDELETE FROM {$wpdb->options}\n\t\tWHERE option_name LIKE '_transient_%';\n\t\t";
     foreach ($sql as $s) {
         $wpdb->query($s);
     }
     // Move Membership pages to trash.
     foreach ($trash_ids as $id) {
         wp_delete_post($id, true);
     }
     // Clear all data from WP Object cache.
     wp_cache_flush();
     // Redirect to the main page.
     wp_safe_redirect(MS_Controller_Plugin::get_admin_url());
     exit;
 }
 /**
  * Called right before the payment form on the front end is displayed.
  * We check if the user already specified an invitation code or not.
  *
  * If no code was specified then we remove all payment buttons and display
  * an input field for the invitation code instead.
  *
  * @since  1.0.1.0
  * @param  array $data
  * @param  int $membership_id
  * @param  MS_Model_Relationship $subscription
  * @param  MS_Model_Member $member
  */
 public function check_invitation_code($data, $membership_id, $subscription, $member)
 {
     $membership = MS_Factory::load('MS_Model_Membership', $membership_id);
     $is_public = lib3()->is_true($membership->get_custom_data('no_invitation'));
     if ($is_public) {
         // This membership is not require an invitation code.
         return $data;
     }
     // invitation_code can be set via URL param or input field in form.
     if (!empty($_REQUEST['invitation_code'])) {
         $invitation = apply_filters('ms_addon_invitation_model', MS_Addon_Invitation_Model::load_by_code($_REQUEST['invitation_code']));
         $invitation->save_application($subscription);
     } else {
         $invitation = MS_Addon_Invitation_Model::get_application($member->id, $membership_id);
     }
     if ($invitation && !empty($_POST['remove_invitation_code'])) {
         $invitation->remove_application($member->id, $membership_id);
         $invitation = false;
     }
     $data['invitation'] = $invitation;
     if ($invitation) {
         $data['invitation_valid'] = $invitation->is_valid($membership_id);
     } else {
         $data['invitation_valid'] = false;
     }
     if (!$data['invitation_valid']) {
         // User has no valid invitation yet, hide all payment buttons
         remove_all_actions('ms_view_frontend_payment_purchase_button');
         // Also remove any other input fields from the payment form, like coupon.
         remove_all_actions('ms_view_frontend_payment_after_total_row');
         remove_all_actions('ms_view_frontend_payment_after');
     }
     // Show Coupon form in the payment-form.
     $this->add_action('ms_view_frontend_payment_purchase_button', 'payment_form_fields', 5, 3);
     return $data;
 }