Skip to content

Instantly share code, notes, and snippets.

@wpmudev-sls
Created June 13, 2019 08:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wpmudev-sls/5af42dac7bd929e00ce209fdf07e9eca to your computer and use it in GitHub Desktop.
Save wpmudev-sls/5af42dac7bd929e00ce209fdf07e9eca to your computer and use it in GitHub Desktop.
[Membership 2] - Master Membership. One Master Membership is available to subscribe. Only after subscribing to Master the member can subscribe to others
<?php
/**
* Plugin Name: [Membership 2] - Master Membership
* Plugin URI: https://premium.wpmudev.org/
* Description: One Master Membership is available to subscribe. Only after subscribing to Master the member can subscribe to others
* Author: Panos Lyrakis @ WPMUDEV
* Author URI: https://premium.wpmudev.org/
* License: GPLv2 or later
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WPMUDEV_MS_Master_Membership' ) ) {
class WPMUDEV_MS_Master_Membership {
const MASTER_MEMBERSHIP = 46;
private static $_instance = null;
public static function get_instance() {
if( is_null( self::$_instance ) ){
self::$_instance = new WPMUDEV_MS_Master_Membership();
}
return self::$_instance;
}
private function __construct() {
add_filter( 'ms_shortcode_signup', array( $this, 'shortcode_html' ), 20, 2 );
// When Master is expired or Canceled, Expire the rest
add_action( 'ms_model_relationship_after', array( $this, 'maybe_expire_sub_subscriptions' ), 20 );
}
public function maybe_expire_sub_subscriptions( $subscription ) {
if ( MS_Model_Relationship::STATUS_ACTIVE == $subscription->status ) {
return;
}
if ( self::MASTER_MEMBERSHIP != $subscription->membership_id ) {
return;
}
$member = $subscription->get_member();
$memberships_ids = ( array ) $member->get_membership_ids();
if( ! empty( $memberships_ids ) ) {
foreach( $memberships_ids as $memberships_id ) {
if ( self::MASTER_MEMBERSHIP == $memberships_id ) {
continue;
}
$member->drop_membership( $memberships_id );
}
}
}
public function shortcode_html( $html, $data ) {
$member = $data['member'];
if ( $member->has_membership( self::MASTER_MEMBERSHIP ) ) {
$subscription = $member->get_subscription( self::MASTER_MEMBERSHIP );
if ( $subscription->status == MS_Model_Relationship::STATUS_ACTIVE ) {
return $html;
}
}
$settings = MS_Factory::load( 'MS_Model_Settings' );
$subscriptions = $data['subscriptions'];
$memberships = $data['memberships'];
ob_start();
?>
<div class="ms-membership-form-wrapper">
<?php
if ( count( $subscriptions ) > 0 ) {
foreach ( $subscriptions as $subscription ) {
$msg = $subscription->get_status_description();
$membership = MS_Factory::load(
'MS_Model_Membership',
$subscription->membership_id
);
$membership->_move_from = $member->cancel_ids_on_subscription(
$membership->id
);
switch ( $subscription->status ) {
case MS_Model_Relationship::STATUS_CANCELED:
$this->membership_box_html(
$membership,
MS_Helper_Membership::MEMBERSHIP_ACTION_RENEW,
$msg,
$subscription,
$data
);
break;
case MS_Model_Relationship::STATUS_EXPIRED:
$this->membership_box_html(
$membership,
MS_Helper_Membership::MEMBERSHIP_ACTION_RENEW,
$msg,
$subscription,
$data
);
break;
case MS_Model_Relationship::STATUS_TRIAL:
case MS_Model_Relationship::STATUS_ACTIVE:
$this->membership_box_html(
$membership,
MS_Helper_Membership::MEMBERSHIP_ACTION_CANCEL,
$msg,
$subscription,
$data
);
break;
case MS_Model_Relationship::STATUS_WAITING:
case MS_Model_Relationship::STATUS_PENDING:
if ( $membership->is_free() ) {
$memberships[] = $membership;
} else {
if ( ! empty( $membership->_move_from ) ) {
$m_action = MS_Helper_Membership::MEMBERSHIP_ACTION_MOVE;
} else {
$m_action = MS_Helper_Membership::MEMBERSHIP_ACTION_PAY;
}
$this->membership_box_html(
$membership,
$m_action,
$msg,
$subscription,
$data
);
}
break;
default:
$this->membership_box_html(
$membership,
MS_Helper_Membership::MEMBERSHIP_ACTION_CANCEL,
$msg,
$subscription,
$data
);
break;
}
}
}
if ( $member->has_membership() && ! empty( $memberships ) ) {
?>
<legend class="ms-move-from">
<?php _e( 'Available Memberships', 'membership2' ); ?>
</legend>
<?php
}
?>
<div class="ms-form-price-boxes">
<?php
do_action(
'ms_view_shortcode_membershipsignup_form_before_memberships',
$data
);
foreach ( $memberships as $membership ) {
if ( $membership->id != self::MASTER_MEMBERSHIP ) {
continue;
}
if ( ! empty( $membership->_move_from ) ) {
$action = MS_Helper_Membership::MEMBERSHIP_ACTION_MOVE;
} else {
$action = MS_Helper_Membership::MEMBERSHIP_ACTION_SIGNUP;
}
$this->membership_box_html(
$membership,
$action,
null,
null,
$data
);
}
do_action(
'ms_view_shortcode_membershipsignup_form_after_memberships',
$data
);
do_action( 'ms_show_prices' );
?>
</div>
</div>
<div style="clear:both;"></div>
<?php
return ob_get_clean();
}
private function membership_box_html( $membership, $action, $msg = null, $subscription = null, $data ) {
$fields = $this->prepare_fields(
$membership->id,
$action,
$data['step'],
$membership->_move_from
);
$settings = MS_Factory::load( 'MS_Model_Settings' );
if ( 0 == $membership->price ) {
$price = __( 'Free', 'membership2' );
} else {
$price = sprintf(
'%s %s',
$settings->currency,
MS_Helper_Billing::format_price( $membership->total_price ) // Includes Tax
);
}
$price = apply_filters( 'ms_membership_price', $price, $membership );
if ( is_user_logged_in() ) {
$current = MS_Model_Pages::MS_PAGE_MEMBERSHIPS;
} else {
$current = MS_Model_Pages::MS_PAGE_REGISTER;
}
$url = MS_Model_Pages::get_page_url( $current );
$classes = array(
'ms-membership-details-wrapper',
'ms-signup',
'ms-membership-' . $membership->id,
'ms-type-' . $membership->type,
'ms-payment-' . $membership->payment_type,
$membership->trial_period_enabled ? 'ms-with-trial' : 'ms-no-trial',
'ms-status-' . ( $subscription ? $subscription->status : 'none' ),
'ms-subscription-' . ($subscription ? $subscription->id : 'none' ),
);
$action_url = esc_url( $url );
$membership_id = esc_attr( $membership->id );
$membership_wrapper_classes = esc_attr( implode( ' ', $classes ) );
$membership_name = esc_html( $membership->name );
$membership_description = $membership->get_description();
$membership_price = esc_html( $price );
$class = apply_filters(
'ms_view_shortcode_membershipsignup_form_button_class',
'ms-signup-button ' . esc_attr( $action )
);
$button = array(
'id' => 'submit',
'type' => MS_Helper_Html::INPUT_TYPE_SUBMIT,
'value' => esc_html( $data[ "{$action}_text" ] ),
'class' => $class,
);
/**
* Allow customizing the Signup button.
*
* Either adjust the array properties or return a valid HTML
* string that will be directly output.
*
* @since 1.0.1.2
* @param array|string $button
* @param MS_Model_Membership $membership
* @param MS_Model_Subscription $subscription
*/
$button = apply_filters(
'ms_view_shortcode_membershipsignup_button',
$button,
$membership,
$subscription
);
if ( MS_Helper_Membership::MEMBERSHIP_ACTION_CANCEL === $action ) {
/**
* PayPal Standard Gateway uses a special Cancel button.
*
* @see MS_Controller_Gateway
*/
$button = apply_filters(
'ms_view_shortcode_membershipsignup_cancel_button',
$button,
$subscription,
$this
);
} elseif ( MS_Helper_Membership::MEMBERSHIP_ACTION_PAY === $action ) {
// Paid membership: Display a Cancel button
$cancel_action = MS_Helper_Membership::MEMBERSHIP_ACTION_CANCEL;
$url = $this->get_action_url(
$membership->id,
$cancel_action,
'', // step is not required for cancel
$data
);
$link = array(
'url' => $url,
'class' => 'ms-cancel-button button',
'value' => esc_html( $data[ "{$cancel_action}_text" ] ),
);
}
/**
* If membership is not active, we won't allow to renew
*/
if( ! $membership->active ) {
$button = '';
}
$template_data = array(
'membership_id' => $membership_id,
'membership_wrapper_classes' => $membership_wrapper_classes,
'membership_name' => $membership_name,
'membership_description' => $membership_description,
'membership_price' => $membership_price,
'msg' => $msg,
'action' => $action,
'link' => isset( $link ) ? $link : '',
'fields' => $fields,
'button' => $button,
'm2_obj' => $this
);
MS_Helper_Template::$ms_single_box = $template_data;
?>
<form action="<?php echo $action_url; ?>" class="ms-membership-form" method="post">
<?php
wp_nonce_field( $fields['action']['value'] );
if( $path = MS_Helper_Template::template_exists( 'membership_box_html.php' ) ) {
require $path;
}
?>
</form>
<?php
do_action( 'ms_show_prices' );
}
protected function prepare_fields( $membership_id, $action, $step, $move_from_id = null ) {
$fields = array(
'membership_id' => array(
'id' => 'membership_id',
'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN,
'value' => $membership_id,
),
'action' => array(
'id' => 'action',
'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN,
'value' => $action,
),
'step' => array(
'id' => 'step',
'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN,
'value' => $step,
),
);
if ( $move_from_id ) {
if ( is_array( $move_from_id ) ) {
$move_from_id = implode( ',', $move_from_id );
}
$fields['move_from_id'] = array(
'id' => 'move_from_id',
'type' => MS_Helper_Html::INPUT_TYPE_HIDDEN,
'value' => $move_from_id,
);
}
if ( MS_Helper_Membership::MEMBERSHIP_ACTION_CANCEL == $action ) {
unset( $fields['step'] );
}
return $fields;
}
protected function get_action_url( $membership, $action, $step, $data ) {
if ( empty( $data['member'] ) ) {
$member = MS_Model_Member::get_current_member();
} else {
$member = $data['member'];
}
if ( is_numeric( $membership ) ) {
$membership = MS_Factory::load(
'MS_Model_Membership',
$membership
);
}
$membership->_move_from = $member->cancel_ids_on_subscription(
$membership->id
);
$fields = $this->prepare_fields(
$membership->id,
$action,
$step,
$membership->_move_from
);
if ( is_user_logged_in() ) {
$current = MS_Model_Pages::MS_PAGE_MEMBERSHIPS;
} else {
$current = MS_Model_Pages::MS_PAGE_REGISTER;
}
$url = MS_Model_Pages::get_page_url( $current );
if ( $action == MS_Helper_Membership::MEMBERSHIP_ACTION_SIGNUP ) {
// Only add the membership_id to the URL.
$url = esc_url_raw(
add_query_arg(
'membership_id',
$membership->id,
$url
)
);
} else {
$url = esc_url_raw(
add_query_arg(
'_wpnonce',
wp_create_nonce( $action ),
$url
)
);
foreach ( $fields as $field ) {
$url = esc_url_raw(
add_query_arg(
$field['id'],
$field['value'],
$url
)
);
}
}
return apply_filters(
'ms_view_shortcode_membershipsignup_action_url',
$url,
$action,
$membership,
$this
);
}
}
if ( ! function_exists( 'wpmudev_ms_master_membership' ) ) {
function wpmudev_ms_master_membership(){
return WPMUDEV_MS_Master_Membership::get_instance();
};
add_action( 'plugins_loaded', 'wpmudev_ms_master_membership', 10 );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment