Skip to content

Instantly share code, notes, and snippets.

@kimcoleman
Last active September 30, 2020 13:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kimcoleman/b410cad122824332f3bdb50330801a36 to your computer and use it in GitHub Desktop.
Save kimcoleman/b410cad122824332f3bdb50330801a36 to your computer and use it in GitHub Desktop.
Offer one-time trials using the Subscription Delays Add On
<?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;
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;
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