Files
2018-07-09 12:34:06 +02:00

143 lines
4.1 KiB
PHP

<?php
/**
* Booster for WooCommerce - Module - Coupon Code Generator
*
* @version 3.2.3
* @since 3.2.3
* @author Algoritmika Ltd.
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if ( ! class_exists( 'WCJ_Coupon_Code_Generator' ) ) :
class WCJ_Coupon_Code_Generator extends WCJ_Module {
/**
* Constructor.
*
* @version 3.2.3
* @since 3.2.3
* @todo user ID in coupon code
* @todo add option to generate code only on button (in meta box) pressed
* @todo `wp_ajax_nopriv_wcj_generate_coupon_code` ?
*/
function __construct() {
$this->id = 'coupon_code_generator';
$this->short_desc = __( 'Coupon Code Generator', 'woocommerce-jetpack' );
$this->desc = __( 'Coupon code generator.', 'woocommerce-jetpack' );
$this->link_slug = 'woocommerce-coupon-code-generator';
parent::__construct();
if ( $this->is_enabled() ) {
if ( 'yes' === get_option( 'wcj_coupons_code_generator_enabled', 'no' ) ) {
add_action( 'wp_ajax_wcj_generate_coupon_code', array( $this, 'ajax_generate_coupon_code' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_generate_coupon_code_script' ) );
}
}
}
/**
* enqueue_generate_coupon_code_script.
*
* @version 3.1.3
* @since 3.1.3
*/
function enqueue_generate_coupon_code_script() {
global $pagenow;
if ( 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) && 'shop_coupon' === $_GET['post_type'] ) {
wp_enqueue_script( 'wcj-coupons-code-generator', wcj_plugin_url() . '/includes/js/wcj-coupons-code-generator.js', array( 'jquery' ), WCJ()->version, true );
wp_localize_script( 'wcj-coupons-code-generator', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
}
/**
* random_string.
*
* @version 3.2.3
* @since 3.2.3
* @todo (maybe) $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
*/
function random_string( $length = 32, $characters = 'abcdefghijklmnopqrstuvwxyz' ) {
$characters_length = strlen( $characters );
$random_string = '';
for ( $i = 0; $i < $length; $i++ ) {
$random_string .= $characters[ rand( 0, $characters_length - 1 ) ];
}
return $random_string;
}
/**
* generate_coupon_code.
*
* @version 3.2.3
* @since 3.1.3
* @todo (maybe) more algorithms
*/
function generate_coupon_code( $str = '', $algorithm = '', $length = '' ) {
if ( '' === $str ) {
$str = time();
}
if ( '' === $algorithm ) {
$algorithm = apply_filters( 'booster_option', 'crc32', get_option( 'wcj_coupons_code_generator_algorithm', 'crc32' ) );
}
switch ( $algorithm ) {
case 'random_letters_and_numbers':
$code = $this->random_string( 32, '0123456789abcdefghijklmnopqrstuvwxyz' );
break;
case 'random_letters':
$code = $this->random_string( 32, 'abcdefghijklmnopqrstuvwxyz' );
break;
case 'random_numbers':
$code = $this->random_string( 32, '0123456789' );
break;
case 'md5':
$code = md5( $str );
break;
case 'sha1':
$code = sha1( $str );
break;
default: // 'crc32'
$code = sprintf( '%08x', crc32( $str ) );
break;
}
if ( '' === $length ) {
$length = apply_filters( 'booster_option', 0, get_option( 'wcj_coupons_code_generator_length', 0 ) );
}
if ( $length > 0 && strlen( $code ) > $length ) {
$code = substr( $code, 0, $length );
}
return $code;
}
/**
* ajax_generate_coupon_code.
*
* @version 3.1.3
* @since 3.1.3
* @todo (maybe) optionally generate some description for coupon (e.g. "Automatically generated coupon [YYYY-MM-DD]")
*/
function ajax_generate_coupon_code() {
$attempts = 0;
while ( true ) {
$coupon_code = $this->generate_coupon_code();
$coupon = new WC_Coupon( $coupon_code );
if ( ! $coupon->get_id() ) {
echo $coupon_code;
die();
}
$attempts++;
if ( $attempts > 100 ) { // shouldn't happen, but just in case...
echo '';
die();
}
}
}
}
endif;
return new WCJ_Coupon_Code_Generator();