/** * Output memberships table in My Account * * @since 1.0.0 */ public function my_account_memberships() { $customer_memberships = wc_memberships_get_user_memberships(); if (!empty($customer_memberships)) { wc_get_template('myaccount/my-memberships.php', array('customer_memberships' => $customer_memberships)); } }
/** * Do not grant membership access to purchasers if they already hold any membership, regardless of status * * @param bool $grant_access true if the purchaser should get memberships access from this order * @param array $args { * @type int $user_id purchaser's WordPress user ID * @type int $product_id the ID of the access-granting product * @type int $order_id the ID of order for this purchase * } * @return bool $grant_access */ function sv_wc_memberships_limit_to_one_membership($grant_access, $args) { // get all active memberships for the purchaser, regardless of status $memberships = wc_memberships_get_user_memberships($args['user_id']); // if there are any memberships returned, do not grant access from purchase if (!empty($memberships)) { return false; } return $grant_access; }
/** * Do not grant membership access to purchasers if they already hold an active membership * * @param bool $grant_access true if the purchaser should get memberships access from this order * @param array $args { * @type int $user_id purchaser's WordPress user ID * @type int $product_id the ID of the access-granting product * @type int $order_id the ID of order for this purchase * } * @return bool $grant_access */ function sv_wc_memberships_limit_membership_count($grant_access, $args) { // get all active memberships for the purchaser // you can remove any of these if you don't want to allow multiples // ie you may not want to count complimentary memberships $statuses = array('status' => array('active', 'complimentary', 'pending', 'free_trial')); $active_memberships = wc_memberships_get_user_memberships($args['user_id'], $statuses); // if there are any active memberships returned, do not grant access from purchase if (!empty($active_memberships)) { return false; } return $grant_access; }
/** * Modify membership product pricing display for non-members: * hides price display if purchasing is restricted to members; * active members will see the price instead of a message * * @param string $price the WC price HTML * @return string $price the updated price HTML */ function sv_wc_memberships_change_member_product_price_display($price) { // bail if Memberships isn't active if (!function_exists('wc_memberships')) { return; } // get any active user memberships (requires Memberships 1.4+) $user_id = get_current_user_id(); $args = array('status' => array('active', 'complimentary', 'pending')); $active_memberships = wc_memberships_get_user_memberships($user_id, $args); // only proceed if the user has no active memberships if (empty($active_memberships)) { // change price display if purchasing is restricted if (wc_memberships_is_product_purchasing_restricted()) { $price = 'Price for members only'; } } return $price; }
/** * Display the member details meta box * * @param WP_Post $post * @since 1.0.0 */ public function output(WP_Post $post) { global $pagenow; // Prepare variables $user_id = 'post.php' == $pagenow ? $post->post_author : (isset($_GET['user']) ? $_GET['user'] : null); // Bail out if no user ID if (!$user_id) { return; } // Get user details $user = get_userdata($user_id); // User memberships $user_memberships = wc_memberships_get_user_memberships($user->ID); $memberships = array(); $notes = null; if (!empty($user_memberships)) { foreach ($user_memberships as $user_membership) { $memberships[$user_membership->get_id()] = $user_membership; } $args = array('post__in' => array_keys($memberships), 'approve' => 'approve', 'type' => 'user_membership_note', 'number' => 5); $notes = get_comments($args); } echo '<ul class="wc-user-membership-recent-activity">'; if (!empty($notes)) { foreach ($notes as $note) { $membership = $memberships[$note->comment_post_ID]; $plan = $membership->get_plan(); /* translators: Placeholder for plan name if a plan has been removed */ $plan_name = $plan ? $plan->get_name() : __('[Plan removed]', WC_Memberships::TEXT_DOMAIN); $note_classes = get_comment_meta($note->comment_ID, 'notified', true) ? array('notified', 'note') : array('note'); include 'views/html-membership-recent-activity-note.php'; } } else { echo '<li>' . esc_html__("It's been quiet here. No activity yet.", WC_Memberships::TEXT_DOMAIN) . '</li>'; } echo '</ul>'; }
/** * Display the member details meta box * * @param WP_Post $post * @since 1.0.0 */ public function output(WP_Post $post) { global $pagenow; // Prepare variables $user_id = 'post.php' == $pagenow ? $post->post_author : (isset($_GET['user']) ? $_GET['user'] : null); // Bail out if no user ID if (!$user_id) { return; } // Get user details $user = get_userdata($user_id); // Get user memberships $user_memberships = wc_memberships_get_user_memberships($user_id); // Determine the member since date. Earliest membership wins! $member_since = null; if (!empty($user_memberships)) { foreach ($user_memberships as $user_membership) { if (!$member_since || $member_since > $user_membership->get_start_date('timestamp')) { $member_since = $user_membership->get_start_date('timestamp'); } } } /** * Fires at the beginning of the member details meta box * * @since 1.0.0 * @param int $user_id The member (user) ID * @param int $user_membership_id The post id of the user membership post */ do_action('wc_memberships_before_user_membership_member_details', $user->ID, $post->ID); echo get_avatar($user->ID, 256); ?> <h2><?php echo esc_html($user->display_name); ?> </h2> <p> <a href="mailto:<?php echo esc_attr($user->user_email); ?> " class="member-email"><?php echo esc_html($user->user_email); ?> </a><br /> <?php if ($member_since) { ?> <span class="member-since"><?php printf(esc_html__('Member since %s', WC_Memberships::TEXT_DOMAIN), date_i18n(get_option('date_format'), $member_since)); ?> </span> <?php } ?> </p> <address> <?php $address = apply_filters('woocommerce_my_account_my_address_formatted_address', array('first_name' => get_user_meta($user->ID, 'billing_first_name', true), 'last_name' => get_user_meta($user->ID, 'billing_last_name', true), 'company' => get_user_meta($user->ID, 'billing_company', true), 'address_1' => get_user_meta($user->ID, 'billing_address_1', true), 'address_2' => get_user_meta($user->ID, 'billing_address_2', true), 'city' => get_user_meta($user->ID, 'billing_city', true), 'state' => get_user_meta($user->ID, 'billing_state', true), 'postcode' => get_user_meta($user->ID, 'billing_postcode', true), 'country' => get_user_meta($user->ID, 'billing_country', true)), $user->ID, 'billing'); $formatted_address = WC()->countries->get_formatted_address($address); if (!$formatted_address) { esc_html_e('User has not set up their billing address yet.', WC_Memberships::TEXT_DOMAIN); } else { echo $formatted_address; } ?> </address> <?php /** * Fires at the end of the member detail meta box * * @since 1.0.0 * @param int $user_id The member (user) ID * @param int $user_membership_id The post id of the user membership post */ do_action('wc_memberships_after_user_membership_member_details', $user->ID, $post->ID); }
/** * Prevent adding a user membership if user is already a member of all plans * * @since 1.0.0 */ public function maybe_prevent_adding_user_membership() { global $pagenow; if ('post-new.php' === $pagenow) { // Get user details $user_id = isset($_GET['user']) ? $_GET['user'] : null; $user = $user_id ? get_userdata($user_id) : null; if (!$user_id || !$user) { wc_memberships()->admin->message_handler->add_error(__('Please select a user to add as a member.', WC_Memberships::TEXT_DOMAIN)); wp_redirect(wp_get_referer()); exit; } // All the user memberships $user_memberships = wc_memberships_get_user_memberships($user->ID); $membership_plans = wc_memberships_get_membership_plans(array('post_status' => array('publish', 'private', 'future', 'draft', 'pending', 'trash'))); if (count($user_memberships) == count($membership_plans)) { wc_memberships()->admin->message_handler->add_message(__('This user is already a member of every plan.', WC_Memberships::TEXT_DOMAIN)); wp_redirect(wp_get_referer()); exit; } } }
/** * 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"); }
/** * Show user memberships on user profile page * * @since 1.0.0 * @param WP_User $user */ public function show_user_memberships(WP_User $user) { $user_memberships = wc_memberships_get_user_memberships($user->ID); echo '<h3>' . esc_html__('User memberships', WC_Memberships::TEXT_DOMAIN) . '</h3>'; if (!empty($user_memberships)) { $plan_links = array(); foreach ($user_memberships as $membership) { $plan_links[] = '<a href="' . esc_url(get_edit_post_link($membership->get_id())) . '">' . wp_kses_post($membership->get_plan()->get_name()) . '</a>'; } printf(esc_html__('This user is a member of %s. %sAdd another membership%s.', WC_Memberships::TEXT_DOMAIN), wc_memberships()->list_items($plan_links), '<a href="' . admin_url('post-new.php?post_type=wc_user_membership&user='******'">', '</a>'); } else { printf(esc_html__('This user has no memberships yet. %sAdd a membership manually%s.', WC_Memberships::TEXT_DOMAIN), '<a href="' . admin_url('post-new.php?post_type=wc_user_membership&user='******'">', '</a>'); } }