Forked from kimcoleman/one_time_trial_delay_pmpro_registration_checks.php
Last active
May 13, 2020 05:29
-
-
Save ipokkel/f1bb3f12f24b04fff1ac04573edbe061 to your computer and use it in GitHub Desktop.
Offer one-time trials using the Subscription Delays Add On
This file contains hidden or 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 recipe 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. | |
* | |
* You can add this recipe to your site by creating a custom plugin | |
* or using the Code Snippets plugin available for free in the WordPress repository. | |
* Read this companion article for step-by-step directions on either method. | |
* https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ | |
*/ | |
// Record when users gain the trial level. | |
function one_time_trial_save_trial_level_used( $level_id, $user_id ) { | |
// Set this to the ID(s) of your trial level(s). | |
$trial_level_ids = array( 16, 2 ); | |
if ( ! is_array( $trial_level_ids ) ) { | |
$trial_level_ids = array( $trial_level_ids ); | |
} | |
foreach ( $trial_level_ids as $trial_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 ) { | |
$trial_level_ids = array( 16, 2 ); | |
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 ) && in_array( intval( $already ), $trial_level_ids, true ) ) { | |
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(s) of your trial level(s). | |
$trial_level_ids = array( 16, 2 ); | |
if ( ! is_array( $trial_level_ids ) ) { | |
$trial_level_ids = array( $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 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