WooCommerce Extended Coupon Features - Version 2.3.4

Version Description

  • FIX: WooCommerce 2.6 and UPS / USPS Shipping method compatibility ( those plugins use : as separator )
  • FIX: Coupon by url (hook on wp_loaded instead of init)
  • FIX: Admin pages invalid parsing of Chosen inputboxes WooCommerce < 2.3.0
  • FIX: Free product on WooCommerce < 2.3.0
  • INTERNAL: Rewritten overwrite_success_message methods
  • (PRO) Ajax 'Apply coupon' support for free product selection on cart and checkout page. (OVERRIDEABLE TEMPLATE FILES UPDATED!)
  • (PRO) FEATURE: Remember coupons that are not valid when applying (on the cart page) and apply them automatically when they validate
Download this release

Release Info

Developer josk79
Plugin Icon 128x128 WooCommerce Extended Coupon Features
Version 2.3.4
Comparing to
See all releases

Code changes from version 2.3.3 to 2.3.4

includes/admin/wjecf-admin-auto-upgrade.php CHANGED
@@ -8,6 +8,10 @@ class WJECF_Admin_Auto_Upgrade extends Abstract_WJECF_Plugin {
8
 
9
  //Upgrade options on version change
10
  public function auto_upgrade() {
 
 
 
 
11
  //WJECF()->options['db_version'] = 1;update_option( 'wjecf_options' , WJECF()->options, false ); // Will force all upgrades
12
  global $wpdb;
13
  $prev_version = WJECF()->options['db_version'];
8
 
9
  //Upgrade options on version change
10
  public function auto_upgrade() {
11
+ if ( ! class_exists('WC_Coupon') ) {
12
+ return;
13
+ }
14
+
15
  //WJECF()->options['db_version'] = 1;update_option( 'wjecf_options' , WJECF()->options, false ); // Will force all upgrades
16
  global $wpdb;
17
  $prev_version = WJECF()->options['db_version'];
includes/admin/wjecf-admin.php CHANGED
@@ -10,13 +10,14 @@ class WJECF_Admin extends Abstract_WJECF_Plugin {
10
 
11
  public function __construct() {
12
  add_action( 'admin_init', array( $this, 'admin_init' ) );
 
13
  }
14
 
15
  /* ADMIN HOOKS */
16
  public function admin_init() {
17
  if ( ! WJECF()->check_woocommerce_version('2.3.0') ) {
18
  $this->enqueue_notice( '<p>' .
19
- __( '<strong>WooCommerce Extended Coupon Features:</strong> You are using a WooCommerce version prior to 2.3.0. Updating of WooCommerce is recommended as using an outdated version might cause unexpected behaviour in combination with modern plugins.' )
20
  . '</p>', 'notice-warning' );
21
  }
22
  //Admin hooks
@@ -60,7 +61,34 @@ class WJECF_Admin extends Abstract_WJECF_Plugin {
60
  // END - ADMIN NOTICES
61
  // ===========================================================================
62
 
63
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  //Add tabs to the coupon option page
65
  public function admin_coupon_options_tabs( $tabs ) {
66
 
@@ -383,17 +411,31 @@ class WJECF_Admin extends Abstract_WJECF_Plugin {
383
  $wjecf_payment_methods = isset( $_POST['wjecf_payment_methods'] ) ? $_POST['wjecf_payment_methods'] : '';
384
  update_post_meta( $post_id, '_wjecf_payment_methods', $wjecf_payment_methods );
385
 
386
- $wjecf_customer_ids = implode(",", array_filter( array_map( 'intval', explode(",", $_POST['wjecf_customer_ids']) ) ) );
387
  update_post_meta( $post_id, '_wjecf_customer_ids', $wjecf_customer_ids );
388
 
389
  $wjecf_customer_roles = isset( $_POST['wjecf_customer_roles'] ) ? $_POST['wjecf_customer_roles'] : '';
390
  update_post_meta( $post_id, '_wjecf_customer_roles', $wjecf_customer_roles );
391
 
392
- $wjecf_excluded_customer_roles = isset( $_POST['wjecf_excluded_customer_roles'] ) ? $_POST['wjecf_excluded_customer_roles'] : '';
393
  update_post_meta( $post_id, '_wjecf_excluded_customer_roles', $wjecf_excluded_customer_roles );
394
 
395
  }
396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  public function render_admin_cat_selector( $dom_id, $field_name, $selected_ids, $placeholder = null ) {
398
  if ( $placeholder === null ) $placeholder = __( 'Search for a product…', 'woocommerce' );
399
 
@@ -435,7 +477,7 @@ class WJECF_Admin extends Abstract_WJECF_Plugin {
435
  private function render_admin_chosen_product_selector( $dom_id, $field_name, $selected_keys_and_values, $placeholder ) {
436
  // $selected_keys_and_values must be an array of [ id => name ]
437
 
438
- echo '<select id="' . esc_attr( $dom_id ) . '" name="' . esc_attr( $field_name ) . '" class="ajax_chosen_select_products_and_variations" multiple="multiple" data-placeholder="' . esc_attr( $placeholder ) . '">';
439
  foreach ( $selected_keys_and_values as $product_id => $product_name ) {
440
  echo '<option value="' . $product_id . '" selected="selected">' . $product_name . '</option>';
441
  }
10
 
11
  public function __construct() {
12
  add_action( 'admin_init', array( $this, 'admin_init' ) );
13
+ //FUTURE: ADMIN MENU add_action('admin_menu', array( &$this, 'action_admin_menu' ) );
14
  }
15
 
16
  /* ADMIN HOOKS */
17
  public function admin_init() {
18
  if ( ! WJECF()->check_woocommerce_version('2.3.0') ) {
19
  $this->enqueue_notice( '<p>' .
20
+ __( '<strong>WooCommerce Extended Coupon Features:</strong> You are using an old version of WooCommerce. Updating of WooCommerce is recommended as using an outdated version might cause unexpected behaviour in combination with modern plugins.' )
21
  . '</p>', 'notice-warning' );
22
  }
23
  //Admin hooks
61
  // END - ADMIN NOTICES
62
  // ===========================================================================
63
 
64
+ /* FUTURE: ADMIN MENU
65
+ public function action_admin_menu() {
66
+ add_options_page( __( 'WooCommerce Extended Coupon Features', 'soft79-wc-pricing-rules' ), __( 'WooCommerce Extended Coupon Features', 'soft79-wc-pricing-rules' ), 'manage_options', 'wjecf_settings', array( &$this, 'action_admin_config_page' ) );
67
+ }
68
+
69
+ public function action_admin_config_page() {
70
+ ?>
71
+ <h2><?php _e( 'WooCommerce Extended Coupon Features', 'soft79-wc-pricing-rules' ); ?></h2>
72
+ <form method="post" action="options.php">
73
+ <?php
74
+ settings_fields( 'wjecf_settings' );
75
+ do_settings_sections( 'wjecf_settings' );
76
+ ?>
77
+ <?php submit_button(); ?>
78
+ </form>
79
+ <h3><?php _e( 'Plugins', 'soft79-wc-pricing-rules' ); ?></h3>
80
+ <ul>
81
+ <?php
82
+ foreach ( WJECF()->get_plugins() as $name => $plugin ) {
83
+ echo "<li>" . $name . "</li>\n";
84
+ }
85
+ ?>
86
+ </ul>
87
+ <?php
88
+
89
+ }
90
+ */
91
+
92
  //Add tabs to the coupon option page
93
  public function admin_coupon_options_tabs( $tabs ) {
94
 
411
  $wjecf_payment_methods = isset( $_POST['wjecf_payment_methods'] ) ? $_POST['wjecf_payment_methods'] : '';
412
  update_post_meta( $post_id, '_wjecf_payment_methods', $wjecf_payment_methods );
413
 
414
+ $wjecf_customer_ids = $this->comma_separated_int_array( $_POST['wjecf_customer_ids'] );
415
  update_post_meta( $post_id, '_wjecf_customer_ids', $wjecf_customer_ids );
416
 
417
  $wjecf_customer_roles = isset( $_POST['wjecf_customer_roles'] ) ? $_POST['wjecf_customer_roles'] : '';
418
  update_post_meta( $post_id, '_wjecf_customer_roles', $wjecf_customer_roles );
419
 
420
+ $wjecf_excluded_customer_roles = isset( $_POST['wjecf_excluded_customer_roles'] ) ? $_POST['wjecf_excluded_customer_roles'] : '';
421
  update_post_meta( $post_id, '_wjecf_excluded_customer_roles', $wjecf_excluded_customer_roles );
422
 
423
  }
424
 
425
+ /**
426
+ * 2.3.4
427
+ * Parse an array or comma separated string; make sure they are valid ints and return as comma separated string
428
+ * @param array|string $int_array
429
+ * @return string comma separated int array
430
+ */
431
+ public function comma_separated_int_array( $int_array ) {
432
+ //Source can be a comma separated string (select2) , or an int array (chosen)
433
+ if ( ! is_array( $int_array) ) {
434
+ $int_array = explode( ',', $int_array );
435
+ }
436
+ return implode( ',', array_filter( array_map( 'intval', $int_array ) ) );
437
+ }
438
+
439
  public function render_admin_cat_selector( $dom_id, $field_name, $selected_ids, $placeholder = null ) {
440
  if ( $placeholder === null ) $placeholder = __( 'Search for a product…', 'woocommerce' );
441
 
477
  private function render_admin_chosen_product_selector( $dom_id, $field_name, $selected_keys_and_values, $placeholder ) {
478
  // $selected_keys_and_values must be an array of [ id => name ]
479
 
480
+ echo '<select id="' . esc_attr( $dom_id ) . '" name="' . esc_attr( $field_name ) . '[]" class="ajax_chosen_select_products_and_variations" multiple="multiple" data-placeholder="' . esc_attr( $placeholder ) . '">';
481
  foreach ( $selected_keys_and_values as $product_id => $product_name ) {
482
  echo '<option value="' . $product_id . '" selected="selected">' . $product_name . '</option>';
483
  }
includes/wjecf-autocoupon.php CHANGED
@@ -41,9 +41,9 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
41
  add_filter('option_woocommerce_cart_redirect_after_add', array ( &$this, 'option_woocommerce_cart_redirect_after_add') );
42
 
43
  if ( ! is_ajax() ) {
44
- add_action( 'init', array( &$this, 'coupon_by_url' ), 23); //Coupon through url
 
45
  }
46
-
47
  }
48
 
49
  /* ADMIN HOOKS */
@@ -210,13 +210,14 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
210
 
211
  //Apply coupon by url
212
  if ( isset( $_GET['apply_coupon'] ) ) {
 
213
  $this->_executed_coupon_by_url = true;
214
  $split = explode( ",", wc_clean( $_GET['apply_coupon'] ) );
215
  //2.2.2 Make sure a session cookie is set
216
  if( ! WC()->session->has_session() )
217
  {
218
  WC()->session->set_customer_session_cookie( true );
219
- }
220
 
221
  $cart = WC()->cart;
222
  foreach ( $split as $coupon_code ) {
@@ -228,32 +229,6 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
228
  if ( $valid ) {
229
  $cart->add_discount( $coupon_code );
230
  }
231
-
232
- //2.3.3 Keep track of apply_coupon coupons and apply when they validate
233
- if ( WJECF()->is_pro() ) {
234
- $by_url_coupon_codes = $this->get_by_url_coupon_codes();
235
- if ( ! in_array( $coupon_code, $by_url_coupon_codes ) ) {
236
- $by_url_coupon_codes[] = $coupon_code;
237
- $this->set_by_url_coupon_codes( $by_url_coupon_codes );
238
- }
239
- if ( ! $valid ) {
240
- wc_add_notice( sprintf( __( 'Coupon \'%s\' will be applied when it\'s conditions are met.', 'woocommerce-jos-autocoupon' ), $coupon_code ) );
241
- $must_redirect = true;
242
- }
243
- }
244
- }
245
- }
246
- }
247
-
248
- //2.3.3 Keep track of apply_coupon coupons and apply when they validate
249
- if ( WJECF()->is_pro() ) {
250
- //Remove auto coupon codes from session
251
- if ( isset( $_GET['remove_coupon'] ) ) {
252
- $coupon_code = wc_clean( $_GET['remove_coupon'] );
253
- $by_url_coupon_codes = $this->get_by_url_coupon_codes();
254
- if( ( $key = array_search( $coupon_code, $by_url_coupon_codes ) ) !== false ) {
255
- unset( $by_url_coupon_codes[$key] );
256
- $this->set_by_url_coupon_codes( $by_url_coupon_codes );
257
  }
258
  }
259
  }
@@ -349,8 +324,11 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
349
  $this->update_matched_autocoupons_executed = true;
350
  $this->log( "()" );
351
 
352
- //2.3.3 Keep track of apply_coupon coupons and apply when they validate
353
- $this->apply_valid_by_url_coupons();
 
 
 
354
 
355
  //Get the coupons that should be in the cart
356
  $valid_coupons = $this->get_valid_auto_coupons();
@@ -361,7 +339,7 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
361
  $valid_coupon_codes[] = $coupon->code;
362
  }
363
 
364
- //$this->log( sprintf( "Auto coupons that should be in cart: %s", implode( ', ', $valid_coupon_codes ) ) );
365
 
366
  $calc_needed = $this->remove_unmatched_autocoupons( $valid_coupon_codes );
367
 
@@ -369,12 +347,11 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
369
  foreach( $valid_coupons as $coupon ) {
370
  if ( ! WC()->cart->has_discount( $coupon->code ) ) {
371
  $this->log( sprintf( "Applying auto coupon %s", $coupon->code ) );
372
- WC()->cart->add_discount( $coupon->code ); //Causes calculation and will remove other coupons if it's a individual coupon
373
- $calc_needed = false; //Already done by adding the discount
374
 
375
  $apply_silently = get_post_meta( $coupon->id, '_wjecf_apply_silently', true ) == 'yes';
 
376
  if ( $apply_silently ) {
377
- $new_succss_msg = false; // no message
378
  } else {
379
  $coupon_excerpt = $this->coupon_excerpt($coupon);
380
  $new_succss_msg = sprintf(
@@ -382,7 +359,13 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
382
  __( empty( $coupon_excerpt ) ? $coupon->code : $coupon_excerpt, 'woocommerce-jos-autocoupon')
383
  );
384
  }
385
- $this->overwrite_success_message( $coupon, $new_succss_msg );
 
 
 
 
 
 
386
  }
387
  }
388
 
@@ -394,57 +377,6 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
394
 
395
  }
396
 
397
- /**
398
- * Apply the valid by_url coupons
399
- * @return void
400
- */
401
- private function apply_valid_by_url_coupons( ) {
402
- //2.3.3 Keep track of apply_coupon coupons and apply when they validate
403
- if ( WJECF()->is_pro() ) {
404
- $this->log( "()" );
405
- $by_url_coupon_codes = $this->get_by_url_coupon_codes();
406
- $this->log( "By_url coupons: " . implode( ' ', $by_url_coupon_codes ) );
407
- foreach( $by_url_coupon_codes as $coupon_code ) {
408
- if ( ! WC()->cart->has_discount( $coupon_code ) ) {
409
- $coupon = new WC_Coupon( $coupon_code );
410
- if ( $coupon->is_valid() ) {
411
- $this->log( sprintf( "Applying by_url coupon %s", $coupon->code ) );
412
- WC()->cart->add_discount( $coupon->code ); //Causes calculation and will remove other coupons if it's a individual coupon
413
- //$calc_needed = false; //Already done by adding the discount
414
- $new_succss_msg = sprintf(
415
- __("Discount applied: %s", 'woocommerce-jos-autocoupon'),
416
- __($coupon->code, 'woocommerce-jos-autocoupon')
417
- );
418
- $this->overwrite_success_message( $coupon, $new_succss_msg );
419
- } elseif ( ! $coupon->exists ) {
420
- //Remove non-existent
421
- if( ( $key = array_search($coupon_code, $by_url_coupon_codes ) ) !== false ) {
422
- unset( $by_url_coupon_codes[$key] );
423
- $this->set_by_url_coupon_codes( $by_url_coupon_codes );
424
- }
425
- //wc_add_notice( $coupon->get_coupon_error( WC_Coupon::E_WC_COUPON_NOT_EXIST ), 'error' );
426
- }
427
- }
428
- }
429
- }
430
- }
431
-
432
- /**
433
- * Get the by_url coupon codes from the session
434
- * @return array The coupon codes
435
- */
436
- public function get_by_url_coupon_codes() {
437
- return WC()->session->get( 'wjecf_by_url_coupons' , array() );
438
- }
439
- /**
440
- * Save the by_url coupon codes in the session
441
- * @param array $coupon_codes
442
- * @return void
443
- */
444
- public function set_by_url_coupon_codes( $coupon_codes ) {
445
- WC()->session->set( 'wjecf_by_url_coupons' , array_unique( $coupon_codes ) );
446
- }
447
-
448
  private function get_valid_auto_coupons( ) {
449
  $valid_coupons = array();
450
  foreach ( $this->get_all_auto_coupons() as $coupon ) {
@@ -509,58 +441,13 @@ class WJECF_AutoCoupon extends Abstract_WJECF_Plugin {
509
  }
510
 
511
 
512
- /**
513
- * Overwrite the default "Coupon added" notice with a more descriptive message.
514
- * @param WC_Coupon $coupon The coupon data
515
- * @param string|bool $new_succss_msg The message to display. If false (or empty string), no message will be shown
516
- * @return void
517
- */
518
- private function overwrite_success_message( $coupon, $new_succss_msg = false ) {
519
- $succss_msg = $coupon->get_coupon_message( WC_Coupon::WC_COUPON_SUCCESS );
520
-
521
- //If ajax, remove only
522
- $remove_message_only = empty( $new_succss_msg ) || ( defined('DOING_AJAX') && DOING_AJAX );
523
-
524
- //Compatibility woocommerce-2-1-notice-api
525
- if ( function_exists('wc_get_notices') ) {
526
- $all_notices = wc_get_notices();
527
- if ( ! isset( $all_notices['success'] ) ) {
528
- $all_notices['success'] = array();
529
- }
530
- $messages = $all_notices['success'];
531
- } else {
532
- $messages = $woocommerce->messages;
533
- }
534
-
535
- $sizeof_messages = sizeof($messages);
536
- for( $y=0; $y < $sizeof_messages; $y++ ) {
537
- if ( $messages[$y] == $succss_msg ) {
538
- if ( isset($all_notices) ) {
539
- if ( $remove_message_only ) {
540
- unset ( $all_notices['success'][$y] );
541
- } else {
542
- $all_notices['success'][$y] = $new_succss_msg;
543
- }
544
- WC()->session->set( 'wc_notices', $all_notices );
545
- } else {
546
- if ( $remove_message_only ) {
547
- unset ( $messages[$y] );
548
- } else {
549
- $messages[$y] = $new_succss_msg;
550
- }
551
- }
552
-
553
- break;
554
- }
555
- }
556
- }
557
-
558
  /**
559
  * Check wether the coupon is an "Auto coupon".
560
  * @param WC_Coupon $coupon The coupon data
561
  * @return bool true if it is an "Auto coupon"
562
  */
563
- private function is_auto_coupon($coupon) {
564
  return get_post_meta( $coupon->id, '_wjecf_is_auto_coupon', true ) == 'yes';
565
  }
566
 
41
  add_filter('option_woocommerce_cart_redirect_after_add', array ( &$this, 'option_woocommerce_cart_redirect_after_add') );
42
 
43
  if ( ! is_ajax() ) {
44
+ //Get cart should not be called before the wp_loaded action
45
+ add_action( 'wp_loaded', array( &$this, 'coupon_by_url' ) ); //Coupon through url
46
  }
 
47
  }
48
 
49
  /* ADMIN HOOKS */
210
 
211
  //Apply coupon by url
212
  if ( isset( $_GET['apply_coupon'] ) ) {
213
+ $must_redirect = true;
214
  $this->_executed_coupon_by_url = true;
215
  $split = explode( ",", wc_clean( $_GET['apply_coupon'] ) );
216
  //2.2.2 Make sure a session cookie is set
217
  if( ! WC()->session->has_session() )
218
  {
219
  WC()->session->set_customer_session_cookie( true );
220
+ }
221
 
222
  $cart = WC()->cart;
223
  foreach ( $split as $coupon_code ) {
229
  if ( $valid ) {
230
  $cart->add_discount( $coupon_code );
231
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  }
233
  }
234
  }
324
  $this->update_matched_autocoupons_executed = true;
325
  $this->log( "()" );
326
 
327
+ //2.3.3 Keep track of queued coupons and apply when they validate
328
+ $queuer = WJECF()->get_plugin('WJECF_Pro_Coupon_Queueing');
329
+ if ( $queuer !== false ) {
330
+ $queuer->apply_valid_queued_coupons();
331
+ }
332
 
333
  //Get the coupons that should be in the cart
334
  $valid_coupons = $this->get_valid_auto_coupons();
339
  $valid_coupon_codes[] = $coupon->code;
340
  }
341
 
342
+ $this->log( sprintf( "Auto coupons that should be in cart: %s", implode( ', ', $valid_coupon_codes ) ) );
343
 
344
  $calc_needed = $this->remove_unmatched_autocoupons( $valid_coupon_codes );
345
 
347
  foreach( $valid_coupons as $coupon ) {
348
  if ( ! WC()->cart->has_discount( $coupon->code ) ) {
349
  $this->log( sprintf( "Applying auto coupon %s", $coupon->code ) );
 
 
350
 
351
  $apply_silently = get_post_meta( $coupon->id, '_wjecf_apply_silently', true ) == 'yes';
352
+
353
  if ( $apply_silently ) {
354
+ $new_succss_msg = ''; // no message
355
  } else {
356
  $coupon_excerpt = $this->coupon_excerpt($coupon);
357
  $new_succss_msg = sprintf(
359
  __( empty( $coupon_excerpt ) ? $coupon->code : $coupon_excerpt, 'woocommerce-jos-autocoupon')
360
  );
361
  }
362
+
363
+ WJECF()->start_overwrite_success_message( $coupon, $new_succss_msg );
364
+ WC()->cart->add_discount( $coupon->code ); //Causes calculation and will remove other coupons if it's a individual coupon
365
+ WJECF()->stop_overwrite_success_message();
366
+
367
+ $calc_needed = false; //Already done by adding the discount
368
+
369
  }
370
  }
371
 
377
 
378
  }
379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
380
  private function get_valid_auto_coupons( ) {
381
  $valid_coupons = array();
382
  foreach ( $this->get_all_auto_coupons() as $coupon ) {
441
  }
442
 
443
 
444
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  /**
446
  * Check wether the coupon is an "Auto coupon".
447
  * @param WC_Coupon $coupon The coupon data
448
  * @return bool true if it is an "Auto coupon"
449
  */
450
+ public function is_auto_coupon($coupon) {
451
  return get_post_meta( $coupon->id, '_wjecf_is_auto_coupon', true ) == 'yes';
452
  }
453
 
includes/wjecf-controller.php CHANGED
@@ -44,7 +44,7 @@ class WJECF_Controller {
44
  if ( ! class_exists('WC_Coupon') ) {
45
  return;
46
  }
47
- $this->debug_mode = false; // defined( 'WP_DEBUG' ) && WP_DEBUG;
48
  $this->log( "INIT " . ( is_ajax() ? "AJAX" : is_admin() ? "ADMIN" : "FRONTEND" ) . " " . $_SERVER['REQUEST_URI'] );
49
 
50
  $this->init_options();
@@ -83,8 +83,17 @@ class WJECF_Controller {
83
  return $this->plugins;
84
  }
85
 
 
 
 
 
 
86
  public function get_plugin( $class_name ) {
87
- return $this->plugins[ $class_name ];
 
 
 
 
88
  }
89
 
90
  public function init_options() {
@@ -308,7 +317,9 @@ class WJECF_Controller {
308
  $shipping_method_ids = $this->get_coupon_shipping_method_ids( $coupon->id );
309
  if ( sizeof( $shipping_method_ids ) > 0 ) {
310
  $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
311
- $chosen_shipping = $chosen_shipping_methods[0];
 
 
312
 
313
  if ( ! in_array( $chosen_shipping, $shipping_method_ids ) ) {
314
  throw new Exception( self::E_WC_COUPON_SHIPPING_METHOD_NOT_MET );
@@ -606,6 +617,44 @@ class WJECF_Controller {
606
  return $this instanceof WJECF_Pro_Controller;
607
  }
608
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
609
  // ===========================================================================
610
  // START - OVERWRITE COUPON DATA
611
  // Allows for non-persistent overwriting of fields during a single PHP call.
44
  if ( ! class_exists('WC_Coupon') ) {
45
  return;
46
  }
47
+ $this->debug_mode = false; //defined( 'WP_DEBUG' ) && WP_DEBUG;
48
  $this->log( "INIT " . ( is_ajax() ? "AJAX" : is_admin() ? "ADMIN" : "FRONTEND" ) . " " . $_SERVER['REQUEST_URI'] );
49
 
50
  $this->init_options();
83
  return $this->plugins;
84
  }
85
 
86
+ /**
87
+ * Retrieves the WJECF Plugin
88
+ * @param string $class_name
89
+ * @return object|bool The plugin if found, otherwise returns false
90
+ */
91
  public function get_plugin( $class_name ) {
92
+ if ( isset( $this->plugins[ $class_name ] ) ) {
93
+ return $this->plugins[ $class_name ];
94
+ } else {
95
+ return false;
96
+ }
97
  }
98
 
99
  public function init_options() {
317
  $shipping_method_ids = $this->get_coupon_shipping_method_ids( $coupon->id );
318
  if ( sizeof( $shipping_method_ids ) > 0 ) {
319
  $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
320
+ $chosen_shipping = empty( $chosen_shipping_methods ) ? '' : $chosen_shipping_methods[0];
321
+ $chosen_shipping = explode( ':', $chosen_shipping); //UPS and USPS stores extra data, seperated by colon
322
+ $chosen_shipping = $chosen_shipping[0];
323
 
324
  if ( ! in_array( $chosen_shipping, $shipping_method_ids ) ) {
325
  throw new Exception( self::E_WC_COUPON_SHIPPING_METHOD_NOT_MET );
617
  return $this instanceof WJECF_Pro_Controller;
618
  }
619
 
620
+ // ===========================================================================
621
+ // START - OVERWRITE INFO MESSAGES
622
+ // ===========================================================================
623
+
624
+ /**
625
+ * 2.3.4
626
+ * If a 'Coupon applied' message is displayed by WooCommerce, replace it by another message (or no message)
627
+ * @param WC_Coupon $coupon The coupon to replace the message for
628
+ * @param string $new_message The new message. Set to empty string if no message must be displayed
629
+ */
630
+ public function start_overwrite_success_message( $coupon, $new_message = '' ) {
631
+ $this->overwrite_coupon_message[ $coupon->code ] = array( $coupon->get_coupon_message( WC_Coupon::WC_COUPON_SUCCESS ) => $new_message );
632
+ add_filter( 'woocommerce_coupon_message', array( $this, 'filter_woocommerce_coupon_message' ), 10, 3 );
633
+ }
634
+
635
+ /**
636
+ * 2.3.4
637
+ * Stop overwriting messages
638
+ */
639
+ public function stop_overwrite_success_message() {
640
+ remove_filter( 'woocommerce_coupon_message', array( $this, 'filter_woocommerce_coupon_message' ), 10 );
641
+ $this->overwrite_coupon_message = array();
642
+ }
643
+
644
+ private $overwrite_coupon_message = array(); /* [ 'coupon_code' => [ old_message' => 'new_message' ] ] */
645
+
646
+ function filter_woocommerce_coupon_message( $msg, $msg_code, $coupon ) {
647
+ if ( isset( $this->overwrite_coupon_message[ $coupon->code ][ $msg ] ) ) {
648
+ $msg = $this->overwrite_coupon_message[ $coupon->code ][ $msg ];
649
+ }
650
+ return $msg;
651
+ }
652
+
653
+ // ===========================================================================
654
+ // END - OVERWRITE INFO MESSAGES
655
+ // ===========================================================================
656
+
657
+
658
  // ===========================================================================
659
  // START - OVERWRITE COUPON DATA
660
  // Allows for non-persistent overwriting of fields during a single PHP call.
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: josk79
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5T9XQBCS2QHRY&lc=NL&item_name=Jos%20Koenis&item_number=wordpress%2dplugin&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted
4
  Tags: woocommerce, coupons, discount
5
  Requires at least: 4.0.0
6
- Tested up to: 4.5.2
7
- Stable tag: 2.3.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -15,7 +15,7 @@ Additional functionality for WooCommerce Coupons: Allow discounts to be automati
15
  "WooCommerce Extended Coupon Features" adds functionality to the WooCommerce coupons and allows for automatic discount rules.
16
  Very easy to use, the functionality is conveniently integrated to the WooCommerce Edit Coupon panel.
17
 
18
- Compatible with WooCommerce 2.5.5. Backwards compatible with older WooCommerce versions (2.2.8 confirmed).
19
 
20
  Full documentation is available at [www.soft79.nl](http://www.soft79.nl/documentation/wjecf).
21
 
@@ -106,6 +106,15 @@ Sure! [This](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5T9XQ
106
 
107
  == Changelog ==
108
 
 
 
 
 
 
 
 
 
 
109
  = 2.3.3 =
110
  * FIX: limit_usage_to_x_items: Removed call to get_discount_amount from coupon_has_a_value; it is redundant and caused limit_usage_to_x_items to change
111
  * (PRO) FEATURE: Filters wjecf_free_product_amount_for_coupon, wjecf_bogo_product_amount_for_coupon and wjecf_set_free_product_amount_in_cart
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5T9XQBCS2QHRY&lc=NL&item_name=Jos%20Koenis&item_number=wordpress%2dplugin&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted
4
  Tags: woocommerce, coupons, discount
5
  Requires at least: 4.0.0
6
+ Tested up to: 4.5.3
7
+ Stable tag: 2.3.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
15
  "WooCommerce Extended Coupon Features" adds functionality to the WooCommerce coupons and allows for automatic discount rules.
16
  Very easy to use, the functionality is conveniently integrated to the WooCommerce Edit Coupon panel.
17
 
18
+ Compatible with WooCommerce 2.6.1. Backwards compatible with older WooCommerce versions (2.3.0 confirmed).
19
 
20
  Full documentation is available at [www.soft79.nl](http://www.soft79.nl/documentation/wjecf).
21
 
106
 
107
  == Changelog ==
108
 
109
+ = 2.3.4 =
110
+ * FIX: WooCommerce 2.6 and UPS / USPS Shipping method compatibility ( those plugins use : as separator )
111
+ * FIX: Coupon by url (hook on wp_loaded instead of init)
112
+ * FIX: Admin pages invalid parsing of Chosen inputboxes WooCommerce < 2.3.0
113
+ * FIX: Free product on WooCommerce < 2.3.0
114
+ * INTERNAL: Rewritten overwrite_success_message methods
115
+ * (PRO) Ajax 'Apply coupon' support for free product selection on cart and checkout page. (OVERRIDEABLE TEMPLATE FILES UPDATED!)
116
+ * (PRO) FEATURE: Remember coupons that are not valid when applying (on the cart page) and apply them automatically when they validate
117
+
118
  = 2.3.3 =
119
  * FIX: limit_usage_to_x_items: Removed call to get_discount_amount from coupon_has_a_value; it is redundant and caused limit_usage_to_x_items to change
120
  * (PRO) FEATURE: Filters wjecf_free_product_amount_for_coupon, wjecf_bogo_product_amount_for_coupon and wjecf_set_free_product_amount_in_cart
woocommerce-jos-autocoupon.php CHANGED
@@ -3,13 +3,19 @@
3
  * Plugin Name: WooCommerce Extended Coupon Features
4
  * Plugin URI: http://www.soft79.nl
5
  * Description: Additional functionality for WooCommerce Coupons: Apply certain coupons automatically, allow applying coupons via an url, etc...
6
- * Version: 2.3.3
7
  * Author: Jos Koenis
8
  * License: GPL2
9
  */
10
 
11
  // Change history: see readme.txt
12
-
 
 
 
 
 
 
13
 
14
  defined('ABSPATH') or die();
15
 
@@ -25,7 +31,9 @@ if ( ! function_exists( 'wjecf_load_plugin_textdomain' ) ) {
25
  //PRO
26
  @include_once( 'includes/wjecf-pro-controller.php' );
27
  @include_once( 'includes/wjecf-pro-free-products.php' );
28
- @include_once( 'includes/wjecf-pro-api.php' );
 
 
29
 
30
  // Only Initiate the plugin if WooCommerce is active
31
  if ( WJECF_Controller::get_woocommerce_version() == false ) {
@@ -64,6 +72,7 @@ if ( ! function_exists( 'wjecf_load_plugin_textdomain' ) ) {
64
  WJECF()->add_plugin('WJECF_AutoCoupon');
65
  WJECF()->add_plugin('WJECF_WPML');
66
  WJECF()->add_plugin('WJECF_Pro_Free_Products');
 
67
  }
68
 
69
  }
3
  * Plugin Name: WooCommerce Extended Coupon Features
4
  * Plugin URI: http://www.soft79.nl
5
  * Description: Additional functionality for WooCommerce Coupons: Apply certain coupons automatically, allow applying coupons via an url, etc...
6
+ * Version: 2.3.4
7
  * Author: Jos Koenis
8
  * License: GPL2
9
  */
10
 
11
  // Change history: see readme.txt
12
+ /*
13
+ * TODO: Apply filter for autocoupon individual_use_filter
14
+ * TODO: (PRO) Eval
15
+ * TODO: Admin page: Option to enable/disable functionality
16
+ * TODO: Admin page: Enable/disable debugging
17
+ *
18
+ */
19
 
20
  defined('ABSPATH') or die();
21
 
31
  //PRO
32
  @include_once( 'includes/wjecf-pro-controller.php' );
33
  @include_once( 'includes/wjecf-pro-free-products.php' );
34
+ @include_once( 'includes/wjecf-pro-coupon-queueing.php' );
35
+ @include_once( 'includes/wjecf-pro-api.php' );
36
+
37
 
38
  // Only Initiate the plugin if WooCommerce is active
39
  if ( WJECF_Controller::get_woocommerce_version() == false ) {
72
  WJECF()->add_plugin('WJECF_AutoCoupon');
73
  WJECF()->add_plugin('WJECF_WPML');
74
  WJECF()->add_plugin('WJECF_Pro_Free_Products');
75
+ WJECF()->add_plugin('WJECF_Pro_Coupon_Queueing');
76
  }
77
 
78
  }