Forked from travislima/one_time_trial_delay_pmpro_registration_checks.php
Last active
September 5, 2024 13:12
-
-
Save kimwhite/054d79c70eab946ba8dae44bd13c5d8c to your computer and use it in GitHub Desktop.
Offer one-time trials using the Subscription Delays Add On - updated for an array of Level IDs
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. Updated for an array of Level IDs | |
* 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 an array of your trial level IDs. | |
$trial_level_ids = array(1, 2, 3); // Replace with actual trial level IDs | |
if ( in_array( $level_id, $trial_level_ids ) ) { | |
// Add user meta to record that the user has received their one-time trial. | |
update_user_meta( $user_id, 'pmpro_trial_level_used', $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 ) ) { | |
echo 'Trial period for level ID ' . $already . ' 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 an array of your trial level IDs. | |
$trial_level_ids = array(1, 2, 3); // Replace with actual trial level IDs | |
if ( ! empty( $_REQUEST['level'] ) ) { | |
$checkout_level_id = intval( $_REQUEST['level'] ); | |
} | |
if ( ! empty( $current_user->ID ) && ! empty( $checkout_level_id ) && in_array( $checkout_level_id, $trial_level_ids ) ) { | |
// 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 amount 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