Forked from kimcoleman/one_time_trial_delay_pmpro_registration_checks.php
Last active
September 5, 2024 13:10
-
-
Save travislima/2631b2b9c7e3f68d87b2727ab5fe2a90 to your computer and use it in GitHub Desktop.
Offer one-time trials using the Subscription Delays Add On
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* This code stores data when a user checks out for a level. | |
* If that user tries to checkout for the same level, the Subscription Delay is removed. | |
* The user is instead charged for their first subscription payment at checkout. | |
* | |
*/ | |
// Record when users gain the trial level. | |
function one_time_trial_save_trial_level_used( $level_id, $user_id ) { | |
// Set this to the ID of your trial level. | |
$trial_level_id = 1; // Membership Level ID | |
if ( $level_id == $trial_level_id ) { | |
// Add user meta to record that the user has received their one-time trial. | |
update_user_meta( $user_id, 'pmpro_trial_level_used', $trial_level_id ); | |
} | |
} | |
add_action( 'pmpro_after_change_membership_level', 'one_time_trial_save_trial_level_used', 10, 2 ); | |
// Show the user's trial meta setting for admins on the Edit Profile page. | |
function one_time_trial_show_trial_level_used( $user ) { | |
if ( current_user_can( 'edit_users' ) ) { ?> | |
<h3>One-Time Trial</h3> | |
<table class="form-table"> | |
<tbody> | |
<tr> | |
<th scope="row"></th> | |
<td> | |
<?php | |
$already = get_user_meta( $user->ID, 'pmpro_trial_level_used', true ); | |
if ( ! empty( $already ) && $already == '1' ) { | |
echo 'Trial period has been claimed.'; | |
} else { | |
echo 'Trial period not claimed.'; | |
} | |
?> | |
</td> | |
</tr> | |
</tbody> | |
</table> | |
<?php | |
} | |
} | |
add_action( 'show_user_profile', 'one_time_trial_show_trial_level_used' ); | |
add_action( 'edit_user_profile', 'one_time_trial_show_trial_level_used' ); | |
// Check if the user has received their one-time trial at checkout. | |
function one_time_trial_delay_pmpro_registration_checks() { | |
global $current_user; | |
//set this to the id of your trial level | |
$trial_level_id = 1; // Membership Level ID | |
if ( ! empty( $_REQUEST['level'] ) ) { | |
$checkout_level_id = intval( $_REQUEST['level'] ); | |
} | |
if ( ! empty( $current_user->ID ) && ! empty( $checkout_level_id ) && $checkout_level_id == $trial_level_id ) { | |
// Check the current user's meta. | |
$already = get_user_meta( $current_user->ID, 'pmpro_trial_level_used', true ); | |
// Remove the subscription delay from checkout. Charge the subscripton immediately. | |
if ( $already ) { | |
remove_filter( 'pmpro_profile_start_date', 'pmprosd_pmpro_profile_start_date', 10, 2); | |
remove_action( 'pmpro_after_checkout', 'pmprosd_pmpro_after_checkout' ); | |
remove_filter( 'pmpro_next_payment', 'pmprosd_pmpro_next_payment', 10, 3); | |
remove_filter( 'pmpro_level_cost_text', 'pmprosd_level_cost_text', 10, 2); | |
remove_action( 'pmpro_save_discount_code_level', 'pmprosd_pmpro_save_discount_code_level', 10, 2); | |
} | |
} | |
} | |
add_filter( 'init', 'one_time_trial_delay_pmpro_registration_checks' ); | |
// Filter the price on the levels page to remove one-time trial. | |
function one_time_trial_delay_pmpro_level_cost_text( $cost, $level ) { | |
global $current_user, $pmpro_pages; | |
// Not logged in? | |
if ( empty( $current_user->ID ) ) { | |
return $cost; | |
} | |
// Check the current user's meta. | |
$already = get_user_meta( $current_user->ID, 'pmpro_trial_level_used', true ); | |
// If the user already had the trial for this level, make initial payment = billing amount. | |
if ( $level->id == $already && is_page( $pmpro_pages[ 'levels' ] ) ) { | |
$cost = sprintf( __( '<strong>%1$s per %2$s</strong>.', 'paid-memberships-pro' ), pmpro_formatPrice( $level->billing_amount ), pmpro_translate_billing_period( $level->cycle_period ) ); | |
} | |
return $cost; | |
} | |
add_filter( 'pmpro_level_cost_text', 'one_time_trial_delay_pmpro_level_cost_text', 15, 2 ); | |
// Filter the price at checkout to charge the billing ammount immediately. | |
function one_time_trial_delay_pmpro_checkout_level( $level ) { | |
global $current_user, $discount_code, $wpdb; | |
// Not logged in? | |
if ( empty( $current_user->ID ) ) { | |
return $level; | |
} | |
// Not if using a discount code. | |
if ( ! empty( $discount_code ) || ! empty( $_REQUEST[ 'discount_code' ] ) ) { | |
return $level; | |
} | |
// Check the current user's meta. | |
$already = get_user_meta( $current_user->ID, 'pmpro_trial_level_used', true ); | |
// If the user already had the trial for this level, make initial payment = billing amount. | |
if ( $level->id == $already ) { | |
$level->initial_payment = $level->billing_amount; | |
} | |
return $level; | |
} | |
add_filter( 'pmpro_checkout_level', 'one_time_trial_delay_pmpro_checkout_level', 5 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This recipe is included in the blog post on "Using Subscription Delays Add On for One-Time, Credit Card Required Trials" at Paid Memberships Pro here: https://www.paidmembershipspro.com/subscription-delay-one-time-credit-card-required-trial/