Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Hide Free Levels to all users with a Membership
- */
- function pmproc_hide_free_levels($levels){
- if( is_user_logged_in() && pmpro_hasMembershipLevel() ){ //check if user is logged in and has a membership level
- $newlevels = array();
- foreach($levels as $level){
- if(!pmpro_isLevelFree($level)){
- $newlevels[] = $level;
- }
- }
- return $newlevels;
- }
- return $levels;
- }
- add_filter("pmpro_levels_array", "pmproc_hide_free_levels");
- /*
- Hide Renew Level for Free Members
- */
- function pmproc_hide_renew_free($levels){
- if( is_user_logged_in() && pmpro_hasMembershipLevel("5",$user->ID) ){ //check if user is logged in and has a membership level
- $newlevels = array();
- foreach($levels as $level){
- if($level->id=="4"){
- $newlevels[] = $level;
- }
- }
- return $newlevels;
- }
- return $levels;
- }
- add_filter("pmpro_levels_array", "pmproc_hide_renew_free");
- /*
- Hide Club Members Level for Club Members
- */
- function pmproc_hide_club_members($levels){
- if( is_user_logged_in() && pmpro_hasMembershipLevel("1",$user->ID) ){ //check if user is logged in and has a membership level
- $newlevels = array();
- foreach($levels as $level){
- if($level->id=="4"){
- $newlevels[] = $level;
- }
- }
- return $newlevels;
- }
- return $levels;
- }
- add_filter("pmpro_levels_array", "pmproc_hide_club_members");
- /*
- Hide Club Members Level for Renewal
- */
- function pmproc_hide_club_renewal($levels){
- if( is_user_logged_in() && pmpro_hasMembershipLevel("4",$user->ID) ){ //check if user is logged in and has a membership level
- $newlevels = array();
- foreach($levels as $level){
- if($level->id=="4"){
- $newlevels[] = $level;
- }
- }
- return $newlevels;
- }
- return $levels;
- }
- add_filter("pmpro_levels_array", "pmproc_hide_club_renewal");
- /*
- Hide Renew Level for Guests and Login Users without any Membership plan
- */
- function pmproc_hide_renew_guests($levels){
- if( !pmpro_hasMembershipLevel() ){ //check if user is logged in and has not a membership level
- $newlevels = array();
- foreach($levels as $level){
- if($level->id=="1"){
- $newlevels[] = $level;
- }
- }
- return $newlevels;
- }
- return $levels;
- }
- add_filter("pmpro_levels_array", "pmproc_hide_renew_guests");
- /*
- Don't let guests checkout for Renew level.
- */
- function my_pmpro_registration_guests_checks($okay)
- {
- //only check if things are okay so far
- if($okay)
- {
- global $pmpro_level;
- if( ( !pmpro_hasMembershipLevel() && $pmpro_level->id == 4 ))
- {
- pmpro_setMessage("You need to be a Club Member to Renew at this price.", "pmpro_error");
- $okay = false;
- }
- }
- return $okay;
- }
- add_action("pmpro_registration_checks", "my_pmpro_registration_guests_checks");
- /*
- When users cancel (are changed to membership level 0) we give them another "cancelled" level.
- Can be used to downgrade someone to a free level when they cancel.
- Will allow members to the "cancel level" to cancel from that though.
- */
- function my_pmpro_after_change_membership_level_0($level_id, $user_id)
- {
- //set this to the id of the level you want to give members when they cancel
- $cancel_level_id = 5;
- //are they cancelling?
- if($level_id == 0 )
- {
- //check if they are cancelling from level $cancel_level_id
- global $wpdb;
- $last_level_id = $wpdb->get_var("SELECT membership_id FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . $user_id . "' ORDER BY id DESC");
- if($last_level_id == $cancel_level_id)
- return; //let them cancel
- //otherwise give them level $cancel_level_id instead
- pmpro_changeMembershipLevel($cancel_level_id, $user_id);
- }
- }
- add_action("pmpro_after_change_membership_level", "my_pmpro_after_change_membership_level_0", 10, 2);
- /* Change cancellation to set expiration date for next payment instead of cancelling immediately.
- Assumes orders are generated for each payment (i.e. your webhooks/etc are setup correctly).
- Since 2015-09-21 and PMPro v1.8.5.6 contains code to look up next payment dates via Stripe and PayPal Express APIs.
- */
- //before cancelling, save the next_payment_timestamp to a global for later use. (Requires PMPro 1.8.5.6 or higher.)
- function my_pmpro_before_change_membership_level($level_id, $user_id) {
- //are we on the cancel page?
- global $pmpro_pages, $wpdb, $pmpro_stripe_event, $pmpro_next_payment_timestamp;
- if($level_id == 0 && (is_page($pmpro_pages['cancel']) || (is_admin() && (empty($_REQUEST['from']) || $_REQUEST['from'] != 'profile')))) {
- //get last order
- $order = new MemberOrder();
- $order->getLastMemberOrder($user_id, "success");
- //get level to check if it already has an end date
- if(!empty($order) && !empty($order->membership_id))
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE membership_id = '" . $order->membership_id . "' AND user_id = '" . $user_id . "' ORDER BY id DESC LIMIT 1");
- //figure out the next payment timestamp
- if(empty($level) || (!empty($level->enddate) && $level->enddate != '0000-00-00 00:00:00')) {
- //level already has an end date. set to false so we really cancel.
- $pmpro_next_payment_timestamp = false;
- } elseif(!empty($order) && $order->gateway == "stripe") {
- //if stripe, try to use the API
- if(!empty($pmpro_stripe_event)) {
- //cancel initiated from Stripe webhook
- if(!empty($pmpro_stripe_event->data->object->current_period_end)) {
- $pmpro_next_payment_timestamp = $pmpro_stripe_event->data->object->current_period_end;
- }
- } else {
- //cancel initiated from PMPro
- $pmpro_next_payment_timestamp = PMProGateway_stripe::pmpro_next_payment("", $user_id, "success");
- }
- } elseif(!empty($order) && $order->gateway == "paypalexpress") {
- //if PayPal, try to use the API
- if(!empty($_POST['next_payment_date']) && $_POST['next_payment_date'] != 'N/A') {
- //cancel initiated from IPN
- $pmpro_next_payment_timestamp = strtotime($_POST['next_payment_date'], current_time('timestamp'));
- } else {
- //cancel initiated from PMPro
- $pmpro_next_payment_timestamp = PMProGateway_paypalexpress::pmpro_next_payment("", $user_id, "success");
- }
- } else {
- //use built in PMPro function to guess next payment date
- $pmpro_next_payment_timestamp = pmpro_next_payment($user_id);
- }
- }
- }
- add_action('pmpro_before_change_membership_level', 'my_pmpro_before_change_membership_level', 10, 2);
- //give users their level back with an expiration
- function my_pmpro_after_change_membership_level($level_id, $user_id) {
- global $pmpro_pages, $wpdb, $pmpro_next_payment_timestamp;
- if($pmpro_next_payment_timestamp !== false && //this is false if the level already has an enddate
- $level_id == 0 && //make sure we're cancelling
- (is_page($pmpro_pages['cancel']) || (is_admin() && (empty($_REQUEST['from']) || $_REQUEST['from'] != 'profile')))) { //on the cancel page or in admin/adminajax/webhook and not the edit user page
- /*
- okay, let's give the user his old level back with an expiration based on his subscription date
- */
- //get last order
- $order = new MemberOrder();
- $order->getLastMemberOrder($user_id, "cancelled");
- //can't do this if we can't find the order
- if(empty($order->id))
- return false;
- //get the last level they had
- $level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE membership_id = '" . $order->membership_id . "' AND user_id = '" . $user_id . "' ORDER BY id DESC LIMIT 1");
- //can't do if we can't find an old level
- if(empty($level))
- return false;
- //last payment date
- $lastdate = date("Y-m-d", $order->timestamp);
- /*
- next payment date
- */
- //if stripe or PayPal, try to use the API
- if(!empty($pmpro_next_payment_timestamp)) {
- $nextdate = $pmpro_next_payment_timestamp;
- } else {
- $nextdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP('" . $lastdate . "' + INTERVAL " . $level->cycle_number . " " . $level->cycle_period . ")");
- }
- //if the date in the future?
- if($nextdate - time() > 0) {
- //give them their level back with the expiration date set
- $old_level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_memberships_users WHERE membership_id = '" . $order->membership_id . "' AND user_id = '" . $user_id . "' ORDER BY id DESC LIMIT 1", ARRAY_A);
- $old_level['enddate'] = date("Y-m-d H:i:s", $nextdate);
- //disable this hook so we don't loop
- remove_action("pmpro_after_change_membership_level", "my_pmpro_after_change_membership_level", 10, 2);
- remove_filter('pmpro_cancel_previous_subscriptions', 'my_pmpro_before_change_membership_level', 10, 2);
- //disable the action to set the default level on cancels
- remove_action('pmpro_after_change_membership_level', 'pmpro_after_change_membership_level_default_level', 10, 2);
- //change level
- pmpro_changeMembershipLevel($old_level, $user_id);
- //add the action back just in case
- add_action("pmpro_after_change_membership_level", "my_pmpro_after_change_membership_level", 10, 2);
- add_filter('pmpro_cancel_previous_subscriptions', 'my_pmpro_before_change_membership_level', 10, 2);
- //add the action back to set the default level on cancels
- remove_action('pmpro_after_change_membership_level', 'pmpro_after_change_membership_level_default_level', 10, 2);
- //change message shown on cancel page
- add_filter("gettext", "my_gettext_cancel_text", 10, 3);
- }
- }
- //clear up this global in case we're changing many levels at once (e.g. expiration script running)
- unset($pmpro_next_payment_timestamp);
- }
- add_action("pmpro_after_change_membership_level", "my_pmpro_after_change_membership_level", 10, 2);
- //this replaces the cancellation text so people know they'll still have access for a certain amount of time
- function my_gettext_cancel_text($translated_text, $text, $domain) {
- if(($domain == "pmpro" || $domain == "paid-memberships-pro") && $text == "Your membership has been cancelled.") {
- global $current_user;
- $translated_text = "Your recurring subscription has been cancelled. Your active membership will expire on " . date(get_option("date_format"), pmpro_next_payment($current_user->ID, "cancelled")) . ".";
- }
- return $translated_text;
- }
- //want to update the cancellation email as well
- function my_pmpro_email_body($body, $email) {
- if($email->template == "cancel") {
- global $wpdb;
- $user_id = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_email = '" . esc_sql($email->email) . "' LIMIT 1");
- if(!empty($user_id)) {
- $expiration_date = pmpro_next_payment($user_id);
- //if the date in the future?
- if($expiration_date - time() > 0) {
- $body .= "<p>Your access will expire on " . date(get_option("date_format"), $expiration_date) . ".</p>";
- }
- }
- }
- return $body;
- }
- add_filter("pmpro_email_body", "my_pmpro_email_body", 10, 2);
- /*
- Show a renew link instead of Your Level
- for recurring subscriptions on the levels page.
- */
- function pmpro_is_level_expiring_soon_yes_on_levels_page($expiring) {
- //only adjust this on the levels page so we don't mess anything up
- global $pmpro_pages;
- if(!is_admin() && !empty($pmpro_pages) && is_page($pmpro_pages['levels']))
- $expiring = true;
- return $expiring;
- }
- add_action('pmpro_is_level_expiring_soon', 'pmpro_is_level_expiring_soon_yes_on_levels_page');
- /*
- Update the SSLVERSION for CURL to support PayPal Express moving to TLS 1.2
- More info: https://devblog.paypal.com/upcoming-security-changes-notice/
- Your server will need to be updated to a supported version of OpenSSL for this to work.
- */
- function my_http_api_curl($handle) {
- curl_setopt( $handle, CURLOPT_SSLVERSION, 6 );
- }
- add_action('http_api_curl', 'my_http_api_curl');
- /* Cancel subscriptions when a recurring payment fails. As of PMPro version 1.5.9.1, failed payments reported via Stripe webhook, PayPal IPN handler, or Authorize.net silent post kick off the pmpro_subscription_payment_failed action.
- Also make sure to edit the default billing_failure.html email to mention that users are cancelled upon failure. To do so, copy paid-memberships-pro/email/billing_failure.html into themes/{active theme}/paid-memberships-pro/email/ and edit the text to suit your need.
- Note: This cancels on the first failure.
- */
- function my_pmpro_subscription_payment_failed($order)
- {
- //cancel the membership
- pmpro_changeMembershipLevel(0, $order->user_id);
- }
- add_action("pmpro_subscription_payment_failed", "my_pmpro_subscription_payment_failed");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement