Link Paid Memberships Pro discount codes to affiliate accounts from another plugin/service.
<?php | |
/* | |
Plugin Name: E20R - Link PMPro Discount Codes to Affiliate Accounts | |
Plugin URI: https://eighty20results.com/paid-memberships-pro/do-it-for-me/ | |
Description: Link a PMPro Discount Code to the account of an affiliate | |
Version: 1.0 | |
Requires at least: 4.5 | |
Tested up to: 4.9.8 | |
Author: Eighty / 20 Results by Wicked Strong Chicks, LLC <thomas@eighty20results.com> | |
Author URI: https://eighty20results.com/thomas-sjolshagen/ | |
License URI: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html | |
License: GPLv2 or later | |
Text Domain: scba-customizations | |
Domain Path: /languages | |
*/ | |
/* | |
* This is the parameter we're looking for to find affiliates | |
* Choose the 'define()' to uncomment, based on the plugin you are using to manage your affiliates | |
*/ | |
define('PMPRO_LDC2AFF_KEY', 'wpam_id'); //Affiliates Manager Plugin | |
// define('PMPRO_LDC2AFF_KEY', 'pa'); //WordPress Lightweight Affiliates | |
// define('PMPRO_LDC2AFF_KEY', 'ref'); //AffiliateWP | |
/** | |
* Get the values from options and make sure they are an array | |
* | |
* @return array | |
*/ | |
function pmpro_ld2aff_getOptions() { | |
$d2a = get_option('pmpro_ldc2aff', array()); | |
if(!is_array($d2a)) { | |
$d2a = array(); | |
} | |
return $d2a; | |
} | |
/** | |
* Add a discount code/affiliate pair | |
* | |
* @param int $code_id | |
* @param string|int $affiliate | |
* | |
*/ | |
function pmpro_ldc2aff_updateCode($code_id, $affiliate) { | |
$d2a = pmpro_ld2aff_getOptions(); | |
if(empty($affiliate) && !empty($d2a[$code_id])) { | |
unset($d2a[$code_id]); | |
update_option('pmpro_ldc2aff', $d2a, 'no'); | |
} elseif(!empty($affiliate)) { | |
$d2a[$code_id] = $affiliate; | |
update_option('pmpro_ldc2aff', $d2a, 'no'); | |
} | |
} | |
/** | |
* Get a discount code from an affiliate | |
* | |
* @param string $affiliate | |
* | |
* @return int|string | |
*/ | |
function pmpro_ldc2aff_getCodeByAffiliate($affiliate) { | |
$d2a = pmpro_ld2aff_getOptions(); | |
return array_search($affiliate, $d2a); | |
} | |
/** | |
* Get an affiliate id from a discount code | |
* | |
* @param int $code_id | |
*/ | |
function pmpro_ldc2aff_getAffiliateByCode($code_id) { | |
$d2a = pmpro_ld2aff_getOptions(); | |
if(isset($d2a[$code_id])) { | |
return $d2a[$code_id]; | |
} | |
return ""; | |
} | |
/** | |
* Try to sync the affiliate id and discount code | |
*/ | |
function pmpro_ldc2aff_init() { | |
global $wpdb; | |
// Cancel exeuction if key isn't set | |
if ( ! defined( 'PMPRO_LDC2AFF_KEY' ) ) { | |
return; | |
} | |
// Is PMPro active? | |
if ( ! defined( 'PMPRO_VERSION' ) ) { | |
return; | |
} | |
//TODO: Should check if the specifed affiliate plugin is also running | |
// Have an affiliate id? Then set the/a discount code | |
if( ! empty( $_REQUEST[ PMPRO_LDC2AFF_KEY ] ) ) { | |
// Quit if another discount code is already set | |
if( ! empty($_REQUEST[ 'discount_code' ] ) ) { | |
return; | |
} | |
// Let's figure out which code to use | |
$affiliate = sanitize_text_field( $_REQUEST[ PMPRO_LDC2AFF_KEY ] ); | |
$code_id = pmpro_ldc2aff_getCodeByAffiliate( $affiliate ); | |
if( !empty( $code_id ) ) { | |
$code = $wpdb->get_var( | |
$wpdb->prepare( "SELECT dc.code FROM {$wpdb->pmpro_discount_codes} AS dc WHERE dc.id = %d LIMIT 1", $code_id ) | |
); | |
$_REQUEST['discount_code'] = $code; | |
$_GET['discount_code'] = $code; | |
$_POST['discount_code'] = $code; | |
} | |
} | |
// Have a discount code? Set the affiliate id | |
if( ! empty( $_REQUEST[ 'discount_code' ] ) ) { | |
$code = sanitize_text_field( $_REQUEST[ 'discount_code' ] ); | |
$code_id = $wpdb->get_var( | |
$wpdb->prepare( "SELECT dc.id FROM {$wpdb->pmpro_discount_codes} AS dc WHERE dc.code = %s LIMIT 1", $code ) | |
); | |
if( ! empty( $code_id ) ) { | |
$affiliate = pmpro_ldc2aff_getAffiliateByCode( $code_id ); | |
$_REQUEST[PMPRO_LDC2AFF_KEY] = $affiliate; | |
$_GET[PMPRO_LDC2AFF_KEY] = $affiliate; | |
$_POST[PMPRO_LDC2AFF_KEY] = $affiliate; | |
} | |
} | |
} | |
add_action('init', 'pmpro_ldc2aff_init', 1); | |
/** | |
* Show options on the Edit Discont Code page | |
* | |
* @param int $code_id | |
*/ | |
function pmpro_ldc2aff_pmpro_discount_code_after_settings( $code_id ) { | |
$affiliate = pmpro_ldc2aff_getAffiliateByCode($code_id); ?> | |
<hr /> | |
<h3>Affiliate</h3> | |
<php | |
printf( '<p>Link this discount code to an affiliate. Currently monitoring the "%s" parameter. When the affiliate ID is set, this discount code will be defaulted to be used at checkout, and when a discount code is used the affiliate ID will be set.</p>', PMPRO_LDC2AFF_KEY ); | |
printf( '<p><label for="pmpro_ldc2aff_affiliate">Affiliate ID:</label>' ); | |
printf( '<input type="text" id="pmpro_ldc2aff_affiliate" name="pmpro_ldc2aff_affiliate" value="%s" />', esc_attr($affiliate) ); | |
printf( '</p>' ); ?> | |
<hr /><?php | |
} | |
add_action('pmpro_discount_code_after_settings', 'pmpro_ldc2aff_pmpro_discount_code_after_settings'); | |
/** | |
* Save the options when an affiliate discount code is updated | |
* @param int $code_id | |
*/ | |
function pmpro_ldc2aff_pmpro_save_discount_code($code_id) { | |
if($code_id < 1) { | |
return; | |
} | |
$affiliate = isset($_REQUEST['pmpro_ldc2aff_affiliate']) ? sanitize_text_field( $_REQUEST['pmpro_ldc2aff_affiliate']) : null; | |
if ( !empty( $affiliate ) ) { | |
pmpro_ldc2aff_updateCode($code_id, $affiliate); | |
} | |
} | |
add_action('pmpro_save_discount_code', 'pmpro_ldc2aff_pmpro_save_discount_code'); | |
/** | |
* Delete affiliate options when their discount code is deleted | |
* | |
* @param int $code_id | |
*/ | |
function pmpro_ldc2aff_pmpro_delete_discount_code($code_id) { | |
if($code_id < 1) { | |
return; | |
} | |
pmpro_ldc2aff_updateCode($code_id, false); | |
} | |
add_action('pmpro_delete_discount_code', 'pmpro_ldc2aff_pmpro_delete_discount_code'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment