Skip to content

Instantly share code, notes, and snippets.

@strangerstudios
Last active October 30, 2020 21:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save strangerstudios/6e7fd15b9c83638d5623 to your computer and use it in GitHub Desktop.
Save strangerstudios/6e7fd15b9c83638d5623 to your computer and use it in GitHub Desktop.
Example of how to show different payment option levels at checkout with Paid Memberships Pro.
/*
Show payment options (as levels) at checkout.
*/
// Define groups of levels. array(1,2) means that levels 1 and 2 are in a group and options will be shown for both levels at checkout for those levels.
global $pmpro_level_groups;
$pmpro_level_groups = array(array(1,2));
//show options at checkout
function pmprogl_pmpro_checkout_boxes()
{
global $pmpro_level_groups, $pmpro_level, $discount_code, $wpdb;
//no groups? return
if(empty($pmpro_level_groups) || empty($pmpro_level))
return;
//get id for discount code
if(!empty($discount_code))
$discount_code_id = $wpdb->get_var("SELECT id FROM $wpdb->pmpro_discount_codes WHERE code = '" . $discount_code . "' LIMIT 1");
//get first group this level is in
foreach($pmpro_level_groups as $group)
{
if(in_array($pmpro_level->id, $group))
{
//show options for these levels
?>
<table id="pmpro_level_options" class="pmpro_checkout top1em" width="100%" cellpadding="0" cellspacing="0" border="0">
<thead>
<tr>
<th>Select a payment plan.</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div>
<?php
foreach($group as $level_id)
{
$level = pmpro_getLevel($level_id);
//apply discount code
if(!empty($discount_code))
{
$code_check = pmpro_checkDiscountCode($discount_code, $level_id, true);
if ($code_check[0] == false) {
//doesn't apply to this level
} else {
$sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM $wpdb->pmpro_discount_codes_levels cl LEFT JOIN $wpdb->pmpro_membership_levels l ON cl.level_id = l.id LEFT JOIN $wpdb->pmpro_discount_codes dc ON dc.id = cl.code_id WHERE dc.code = '" . $discount_code . "' AND cl.level_id = '" . (int)$level_id . "' LIMIT 1";
$level = $wpdb->get_row($sqlQuery);
//if the discount code doesn't adjust the level, let's just get the straight level
if (empty($level))
$level = $wpdb->get_row("SELECT * FROM $wpdb->pmpro_membership_levels WHERE id = '" . $level_id . "'");
//filter adjustments to the level
$level->code_id = $discount_code_id;
$level = apply_filters("pmpro_discount_code_level", $level, $discount_code_id);
}
}
//apply filters
$level = apply_filters("pmpro_checkout_level", $level);
?>
<input type="radio" id="pmpro_level_<?php echo $level_id;?>" name="level" value="<?php echo $level_id;?>" <?php checked($pmpro_level->id, $level_id);?>>
<label class="pmpro_normal" for="pmpro_level_<?php echo $level_id;?>" /><?php echo pmpro_getLevelCost($level, false, true);?></label>
&nbsp;
<?php
}
?>
</div>
</td>
</tr>
</tbody>
</table>
<?php
}
}
}
add_action('pmpro_checkout_boxes', 'pmprogl_pmpro_checkout_boxes');
@cdgdigital
Copy link

My requirement for "payment options" on each specific membership level is, for example:

  • Option-1: 12 installments of $35, on PayPal;
  • Option-2: Single payment of $350, on PayPal;
  • Option-3: Single payment of $350, on BankTransfer/Check.

Using "pmpro_level_groups.php" also does not attend that requirement, since:
(i) I have to create "multiple levels" anyway (there are no "options" on a single membership);
(ii) Outcome gets confused on which payment method should use, mixing PayPal and Check.

Needs improvement.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment