Created
October 4, 2014 03:36
-
-
Save renventura/9a645b904279862614a4 to your computer and use it in GitHub Desktop.
Create randomly generated discount codes for Easy Digital Downloads on Gravity Forms submission
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 //* Mind this opening php tag and header information below | |
/* | |
Plugin Name: Create EDD Discounts with Gravity Forms | |
Plugin URI: http://engagewp.com/create-random-discount-codes-edd-gravity-forms | |
Description: Allows discount codes for Easy Digital Downloads to be randomly generated on Gravity Forms submissions. Code credit to David Smith of GravityWiz.com. Modified and put into plugin format by Ren Ventura. | |
Author: David Smith / Ren Ventura | |
Version: 1.0 | |
*/ | |
/** | |
* Gravity Wiz // Gravity Forms // Create Coupons with Gravity Forms for Gravity Forms, WooCommerce, or Easy Digital Downloads | |
* | |
* Create coupons via Gravity Forms submissions. Map the coupon code to a field on the GF form and voila! | |
* | |
* @version 1.0 | |
* @author David Smith <[email protected]> | |
* @license GPL-2.0+ | |
* @link http://gravitywiz.com/creating-coupons-woocommerce-gravity-forms/ | |
*/ | |
//* Define options/constants | |
define( 'ENGWP_FORM_ID', 3 ); // The ID of the form (integer) | |
define( 'ENGWP_SOURCE_FIELD_ID', 4 ); // The ID of the form field holding the code (integer) | |
define( 'ENGWP_CODE_LENGTH', 12 ); // Length of code (integer) | |
define( 'ENGWP_CODE_CHARS', '1234567890QWERTYUIOPASDFGHJKLZXCVBNM' ); // Available character for the code; default 0-9 and uppercase letters (string) | |
define( 'ENGWP_CODE_PREFIX', '' ); // Custom prefix for the code (string); default empty | |
define( 'ENGWP_DISCOUNT_TYPE', 'flat' ); // 'flat' or 'percent' (string) | |
define( 'ENGWP_DISCOUNT_AMOUNT', 10 ); // Value of discount (integer); $ if 'type' is 'flat' and % if 'type' is 'percent' | |
define( 'ENGWP_MAX_USES', 1 ); // Maximum number of uses per customer (integer) | |
define( 'ENGWP_MIN_PRICE', 0 ); // Minimum price for discount to apply (integer); default none | |
define( 'ENGWP_PRODUCT_REQS', '' ); // A comma-separated list of product IDs (string) the coupons apply to | |
define( 'ENGWP_REQS_CONDITION', '' ); // How to apply the discount to those products (string); accepts 'any' (at least one product ID must be in the cart) or 'all' (all products must be in the cart) | |
define( 'ENGWP_SINGLE_USE', 'use_once' ); // Whether the coupons generated can be used more than once by a single customer; default is set to one-time usage but can be set to false (boolean) for allowing multiple uses | |
define( 'ENGWP_EXCLUDE_PRODUCTS', '' ); // A comma-separated list of product IDs (string) to exclude from discount-applicability | |
/* | |
Set start and expiration dates | |
Default start date is the current date; | |
Default expiration date is +30 days; | |
To use a static date or no date at all, comment out the default line(s) and uncomment the line(s) for your preferences | |
*/ | |
$start_date = ''; # no date | |
// $start_date = '01/01/1900'; # static date | |
// $start_date = date( 'm/d/Y', strtotime("yesterday") ); | |
$exp_date = date( 'm/d/Y', strtotime("+30 days") ); | |
// $exp_date = '01/01/1900'; # static date | |
// $exp_date = ''; # no date | |
class GW_Create_Coupon { | |
public function __construct( $args = array() ) { | |
// set our default arguments, parse against the provided arguments, and store for use throughout the class | |
$this->_args = wp_parse_args( $args, array( | |
'form_id' => false, | |
'source_field_id' => false, | |
'plugin' => 'edd', | |
'amount' => 0, | |
'type' => '', | |
'meta' => array() | |
) ); | |
// do version check in the init to make sure if GF is going to be loaded, it is already loaded | |
add_action( 'init', array( $this, 'init' ) ); | |
} | |
public function init() { | |
// make sure we're running the required minimum version of Gravity Forms | |
if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) ) { | |
return; | |
} | |
add_action( 'gform_after_submission', array( $this, 'create_coupon' ), 10, 2 ); | |
} | |
public function create_coupon( $entry, $form ) { | |
if( ! $this->is_applicable_form( $form ) ) { | |
return; | |
} | |
$coupon_code = rgar( $entry, $this->_args['source_field_id'] ); | |
$amount = $this->_args['amount']; | |
$type = $this->_args['type']; | |
$plugin_func = array( $this, sprintf( 'create_coupon_%s', $this->_args['plugin'] ) ); | |
if( is_callable( $plugin_func ) ) { | |
call_user_func( $plugin_func, $coupon_code, $amount, $type ); | |
} | |
} | |
public function create_coupon_edd( $coupon_code, $amount, $type ) { | |
if( ! is_callable( 'edd_store_discount' ) ) { | |
return; | |
} | |
$meta = wp_parse_args( $this->_args['meta'], array( | |
'name' => $coupon_code, | |
'code' => $coupon_code, | |
'type' => $type, | |
'amount' => $amount, | |
'excluded_products' => array(), | |
'expiration' => '', | |
'is_not_global' => false, | |
'is_single_use' => false, | |
'max_uses' => '', | |
'min_price' => '', | |
'product_condition' => '', | |
'product_reqs' => array(), | |
'start' => '', | |
'uses' => '', | |
) ); | |
// EDD will set it's own defaults in the edd_store_discount() so let's filter out our own empty defaults (their just here for easier reference) | |
$meta = array_filter( $meta ); | |
// EDD takes a $details array which has some different keys than the meta, let's map the keys to the expected format | |
$edd_post_keys = array( | |
'max_uses' => 'max', | |
'product_reqs' => 'products', | |
'excluded_products' => 'excluded-products', | |
'is_not_global' => 'not_global', | |
'is_single_use' => 'use_once' | |
); | |
foreach( $meta as $key => $value ) { | |
$mod_key = rgar( $edd_post_keys, $key ); | |
if( $mod_key ) { | |
$meta[$mod_key] = $value; | |
} | |
} | |
edd_store_discount( $meta ); | |
} | |
function is_applicable_form( $form ) { | |
$form_id = isset( $form['id'] ) ? $form['id'] : $form; | |
return $form_id == $this->_args['form_id']; | |
} | |
} | |
//* Instantiate the class for EDD | |
new GW_Create_Coupon( array( | |
'form_id' => ENGWP_FORM_ID, | |
'source_field_id' => ENGWP_SOURCE_FIELD_ID, | |
'amount' => ENGWP_DISCOUNT_AMOUNT, | |
'type' => ENGWP_DISCOUNT_TYPE, | |
'meta' => array( | |
'excluded_products' => array( ENGWP_EXCLUDE_PRODUCTS ), | |
'expiration' => $exp_date, | |
'is_not_global' => 'not_global', | |
'is_single_use' => ENGWP_SINGLE_USE, | |
'max_uses' => ENGWP_MAX_USES, | |
'min_price' => ENGWP_MIN_PRICE, | |
'product_condition' => ENGWP_REQS_CONDITION, | |
'product_reqs' => array( ENGWP_PRODUCT_REQS ), | |
'start' => $start_date, | |
) | |
) ); | |
/** | |
* Generate the random codes to be used for the EDD discounts | |
*/ | |
//* Generates and returns the code | |
add_filter( 'gform_field_value_uuid', 'gw_generate_unique_code' ); | |
function gw_generate_unique_code() { | |
$length = ENGWP_CODE_LENGTH; | |
$chars = ENGWP_CODE_CHARS; | |
$prefix = ENGWP_CODE_PREFIX; | |
$unique = ''; | |
$chars_length = strlen( $chars )-1; | |
for( $i = 0 ; $i < $length ; $i++ ) { | |
$unique .= $chars[ rand( 0, $chars_length ) ]; | |
} | |
do { | |
$unique = $prefix . str_shuffle( $unique ); | |
} while ( !gw_check_unique_code( $unique ) ); | |
return $unique; | |
} | |
//* Checks to make sure the code generated is unique (not already in use) | |
function gw_check_unique_code( $unique ) { | |
global $wpdb; | |
$table = $wpdb->prefix . 'rg_lead_detail'; | |
$form_id = ENGWP_FORM_ID; // update to the form ID your unique id field belongs to | |
$field_id = ENGWP_SOURCE_FIELD_ID; // update to the field ID your unique id is being prepopulated in | |
$result = $wpdb->get_var( "SELECT value FROM $table WHERE form_id = '$form_id' AND field_number = '$field_id' AND value = '$unique'" ); | |
if ( empty ( $result ) ) { | |
return true; | |
} else return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment