/**
  * 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>');
     }
 }