/** * Get the nice name for a user membership status * * @since 1.0.0 * @param string $status * @return string */ function wc_memberships_get_user_membership_status_name($status) { $statuses = wc_memberships_get_user_membership_statuses(); $status = 'wcm-' === substr($status, 0, 4) ? substr($status, 4) : $status; $status = isset($statuses['wcm-' . $status]) ? $statuses['wcm-' . $status] : $status; return is_array($status) && isset($status['label']) ? $status['label'] : $status; }
/** * Updates status of membership * * @param string $new_status Status to change the order to. No internal wcm- prefix is required. * @param string $note (default: '') Optional note to add */ public function update_status($new_status, $note = '') { if (!$this->get_id()) { return; } // Standardise status names. $new_status = 'wcm-' === substr($new_status, 0, 4) ? substr($new_status, 4) : $new_status; $old_status = $this->get_status(); // Get valid statuses $valid_statuses = wc_memberships_get_user_membership_statuses(); // Only update if they differ - and ensure post_status is a 'wcm' status. if ($new_status !== $old_status && in_array('wcm-' . $new_status, array_keys($valid_statuses))) { // Note will be added to the membership by the general User_Memberships utility class, // so that we add only 1 note instead of 2 when updating the status. wc_memberships()->user_memberships->set_membership_status_transition_note($note); // Update the order wp_update_post(array('ID' => $this->get_id(), 'post_status' => 'wcm-' . $new_status)); $this->status = 'wcm-' . $new_status; } }
/** * Init WooCommerce Memberships post statuses * * @since 1.0.0 */ private static function init_post_statuses() { $statuses = wc_memberships_get_user_membership_statuses(); foreach ($statuses as $status => $labels) { register_post_status($status, array('label' => $labels['label'], 'public' => false, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => $labels['label_count'])); } }
/** * Render dropdowns for user membership filters * * @since 1.0.0 */ public function restrict_user_memberships() { global $typenow; if ('wc_user_membership' != $typenow) { return; } // membership plan options $membership_plans = wc_memberships_get_membership_plans(); $selected_plan = isset($_GET['post_parent']) ? $_GET['post_parent'] : null; $statuses = wc_memberships_get_user_membership_statuses(); $selected_status = isset($_GET['post_status']) ? $_GET['post_status'] : null; /** * Filter the expiry terms dropdown menu * * @param array $terms Associative array of expiry term keys and labels. * @since 1.0.0 */ $expires = apply_filters('wc_memberships_expiry_terms_dropdown_options', array('today' => __('Today', WC_Memberships::TEXT_DOMAIN), 'this_week' => __('This week', WC_Memberships::TEXT_DOMAIN), 'this_month' => __('This month', WC_Memberships::TEXT_DOMAIN))); $selected_expiry_term = isset($_GET['expires']) ? $_GET['expires'] : null; ?> <select name="post_parent"> <option value=""><?php _e('All plans', WC_Memberships::TEXT_DOMAIN); ?> </option> <?php if (!empty($membership_plans)) { foreach ($membership_plans as $membership_plan) { echo "\t<option value='" . esc_attr($membership_plan->get_id()) . "'" . selected($membership_plan->get_id(), $selected_plan, false) . '>' . esc_html($membership_plan->get_name()) . '</option>' . PHP_EOL; } } ?> </select> <select name="post_status"> <option value=""><?php _e('All statuses', WC_Memberships::TEXT_DOMAIN); ?> </option> <?php if (!empty($statuses)) { foreach ($statuses as $status => $labels) { echo "\t<option value='" . esc_attr($status) . "'" . selected($status, $selected_status, false) . '>' . esc_html($labels['label']) . '</option>' . PHP_EOL; } } ?> </select> <select name="expires"> <option value=""><?php _e('Expires', WC_Memberships::TEXT_DOMAIN); ?> </option> <?php if (!empty($expires)) { foreach ($expires as $expiry_term => $label) { echo "\t<option value='" . esc_attr($expiry_term) . "'" . selected($expiry_term, $selected_expiry_term, false) . '>' . esc_html($label) . '</option>' . PHP_EOL; } } ?> </select> <?php }
/** * Display the membership data meta box * * @param WP_Post $post * @since 1.0.0 */ public function output(WP_Post $post) { global $pagenow; // Prepare variables $user_membership = wc_memberships_get_user_membership($post->ID); $user_id = 'post.php' == $pagenow ? $user_membership->get_user_id() : (isset($_GET['user']) ? $_GET['user'] : null); // Bail out if no user ID if (!$user_id) { return; } // Get user details $user = get_userdata($user_id); // All the user memberships $user_memberships = wc_memberships_get_user_memberships($user->ID); // Prepare options $status_options = array(); foreach (wc_memberships_get_user_membership_statuses() as $status => $labels) { $status_options[$status] = $labels['label']; } /** * Filter status options that appear in the edit user membership screen * * @since 1.0.0 * @param array $options Associative array of option value => label pairs * @param int $user_membership_id User membership ID */ $status_options = apply_filters('wc_memberships_edit_user_membership_screen_status_options', $status_options, $post->ID); // prepare membership plan options $membership_plan_options = array(); $membership_plans = wc_memberships_get_membership_plans(array('post_status' => array('publish', 'private', 'future', 'draft', 'pending', 'trash'))); if (!empty($membership_plans)) { foreach ($membership_plans as $membership_plan) { $exists = false; // Each user can only have 1 membership per plan. // Check if user already has a membership for this plan. if (!empty($user_memberships)) { foreach ($user_memberships as $membership) { if ($membership->get_plan_id() == $membership_plan->get_id()) { $exists = true; break; } } } // Only add plan to options if user is not a member of this plan or // if the current membership has this plan. // Todo: instead of removing, disable the option once // https://github.com/woothemes/woocommerce/pull/8024 lands in stable if (!$exists || $user_membership->get_plan_id() == $membership_plan->get_id()) { $membership_plan_options[$membership_plan->get_id()] = $membership_plan->get_name(); } } } $current_membership = null; $order = $user_membership->get_order(); $product = $user_membership->get_product(); ?> <h3 class="membership-plans"> <ul class="sections"> <?php if (!empty($user_memberships)) { foreach ($user_memberships as $membership) { ?> <li <?php if ($membership->get_id() == $post->ID) { $current_membership = $membership->get_id(); ?> class="active"<?php } ?> ><a href="<?php echo esc_url(get_edit_post_link($membership->get_id())); ?> "><?php echo wp_kses_post($membership->get_plan()->get_name()); ?> </a></li> <?php } } ?> <?php if (count($user_memberships) != count($membership_plans)) { ?> <li <?php if (!$current_membership) { ?> class="active"<?php } ?> ><a href="<?php echo admin_url('post-new.php?post_type=wc_user_membership&user='******'Add a plan...', WC_Memberships::TEXT_DOMAIN); ?> </a></li> <?php } ?> </ul> </h3> <div class="plan-details"> <h4><?php esc_html_e('Membership Details', WC_Memberships::TEXT_DOMAIN); ?> </h4> <div class="woocommerce_options_panel"> <?php /** * Fires before the membership details in edit user membership screen * * @since 1.0.0 * @param WC_Memberships_User_Membership */ do_action('wc_memberships_before_user_membership_details', $user_membership); ?> <?php woocommerce_wp_select(array('id' => 'post_parent', 'label' => __('Plan:', WC_Memberships::TEXT_DOMAIN), 'options' => $membership_plan_options, 'value' => $user_membership->get_plan_id(), 'class' => 'wide', 'wrapper_class' => 'js-membership-plan')); ?> <?php woocommerce_wp_select(array('id' => 'post_status', 'label' => __('Status:', WC_Memberships::TEXT_DOMAIN), 'options' => $status_options, 'value' => 'wcm-' . $user_membership->get_status(), 'class' => 'wide')); ?> <?php woocommerce_wp_text_input(array('id' => '_start_date', 'label' => __('Member since:', WC_Memberships::TEXT_DOMAIN), 'class' => 'js-user-membership-date', 'description' => __('YYYY-MM-DD', WC_Memberships::TEXT_DOMAIN), 'value' => 'post.php' == $pagenow ? $user_membership->get_start_date('Y-m-d') : date('Y-m-d'))); ?> <?php woocommerce_wp_text_input(array('id' => '_end_date', 'label' => __('Expires:', WC_Memberships::TEXT_DOMAIN), 'class' => 'js-user-membership-date', 'description' => __('YYYY-MM-DD', WC_Memberships::TEXT_DOMAIN), 'value' => $user_membership->get_end_date('Y-m-d', false))); ?> <?php if ($user_membership->get_paused_date()) { ?> <p class="form-field"><span class="description"><?php printf(esc_html__('Paused since %s', WC_Memberships::TEXT_DOMAIN), date_i18n(get_option('date_format'), $user_membership->get_paused_date('timestamp'))); ?> </span></p> <?php } ?> <?php /** * Fires after the membership details in edit user membership screen * * @since 1.0.0 * @param WC_Memberships_User_Membership */ do_action('wc_memberships_after_user_membership_details', $user_membership); ?> </div> </div> <div class="billing-details"> <h4><?php esc_html_e('Billing Details', WC_Memberships::TEXT_DOMAIN); ?> </h4> <?php /** * Fires before the billing details in edit user membership screen * * @since 1.0.0 * @param WC_Memberships_User_Membership */ do_action('wc_memberships_before_user_membership_billing_details', $user_membership); ?> <?php if ($order) { ?> <table> <tr> <td><?php esc_html_e('Purchased in:', WC_Memberships::TEXT_DOMAIN); ?> </td> <td><a href="<?php echo esc_url(get_edit_post_link($order->id)); ?> "><?php printf(esc_html__('Order %s', WC_Memberships::TEXT_DOMAIN), $order->get_order_number()); ?> </a></td> </tr> <tr> <td><?php esc_html_e('Order Date:', WC_Memberships::TEXT_DOMAIN); ?> </td> <td><?php echo date_i18n(get_option('date_format'), strtotime($order->order_date)); ?> </td> </tr> <tr> <td><?php esc_html_e('Order Total:', WC_Memberships::TEXT_DOMAIN); ?> </td> <td><?php echo $order->get_formatted_order_total(); ?> </td> </tr> </table> <?php } else { ?> <p><?php esc_html_e('No billing details - this membership was created manually.', WC_Memberships::TEXT_DOMAIN); ?> </p> <?php } ?> <?php /** * Fires after the billing details in edit user membership screen * * @since 1.0.0 * @param WC_Memberships_User_Membership */ do_action('wc_memberships_after_user_membership_billing_details', $user_membership); ?> </div> <div class="clear"></div> <ul class="user_membership_actions submitbox"> <?php /** * Fires at the start of the user membership actions meta box * * @since 1.0.0 * @param int $post_id The post id of the wc_user_membership post */ do_action('wc_memberships_user_membership_actions_start', $post->ID); ?> <li class="wide"> <div id="delete-action"> <?php if (current_user_can("delete_post", $post->ID)) { ?> <a class="submitdelete deletion" href="<?php echo esc_url(get_delete_post_link($post->ID, '', true)); ?> "><?php esc_html_e('Delete User Membership', WC_Memberships::TEXT_DOMAIN); ?> </a><?php } ?> </div> <input type="submit" class="button save_user_membership save_action button-primary tips" value="<?php esc_attr_e('Save Membership', WC_Memberships::TEXT_DOMAIN); ?> " data-tip="<?php esc_attr_e('Save/update the membership', WC_Memberships::TEXT_DOMAIN); ?> " /> </li> <?php /** * Fires at the end of the user membership actions meta box * * @since 1.0.0 * @param int $post_id The post id of the wc_user_membership post */ do_action('wc_memberships_user_membership_actions_end', $post->ID); ?> </ul> <?php // Render JS to have the admin confirm they really do indeed want to permanently // delete a member wc_enqueue_js("\n\t\t\tjQuery( '.user_membership_actions .submitdelete' ).click( function( e ) {\n\t\t\t\treturn confirm( '" . esc_html__('Are you sure you want to permanently delete this membership?', WC_Memberships::TEXT_DOMAIN) . "' );\n\t\t\t} );\n\t\t"); }