WooCommerce Cart Abandonment Recovery - Version 1.2.3

Version Description

Download this release

Release Info

Developer rohitrpatil
Plugin Icon 128x128 WooCommerce Cart Abandonment Recovery
Version 1.2.3
Comparing to
See all releases

Code changes from version 1.2.2 to 1.2.3

admin/assets/js/admin-email-templates.js CHANGED
@@ -251,7 +251,8 @@
251
  "checkout_url": window.location.origin + "/checkout/?wcf_ac_token=something",
252
  "coupon_code": "abcgefgh",
253
  "product_names": "Product1, Product2 & Product3",
254
- "cart_total": wcf_ca_details.woo_currency_symbol + "20"
 
255
  };
256
  $.ajax({
257
  url: zapier_webhook_url,
251
  "checkout_url": window.location.origin + "/checkout/?wcf_ac_token=something",
252
  "coupon_code": "abcgefgh",
253
  "product_names": "Product1, Product2 & Product3",
254
+ "cart_total": wcf_ca_details.woo_currency_symbol + "20",
255
+ "product_table": '<table align= left; cellpadding="10" cellspacing="0" style="float: none; border: 1px solid #e5e5e5;"> <tr align="center"> <th style="color: #636363; border: 1px solid #e5e5e5;">Item</th> <th style="color: #636363; border: 1px solid #e5e5e5;">Name</th> <th style="color: #636363; border: 1px solid #e5e5e5;">Quantity</th> <th style="color: #636363; border: 1px solid #e5e5e5;">Price</th> <th style="color: #636363; border: 1px solid #e5e5e5;">Line Subtotal</th> </tr> <tr style=color: #636363; border: 1px solid #e5e5e5; align="center"> <td style="color: #636363; border: 1px solid #e5e5e5;"><img class="demo_img" style="height: 42px; width: 42px;" src="http://localhost/wp-local/wp-content/uploads/2019/11/wGdyS_Zgz1A.jpg"></td> <td style="color: #636363; border: 1px solid #e5e5e5;">Product1</td> <td style="color: #636363; border: 1px solid #e5e5e5;"> 1 </td> <td style="color: #636363; border: 1px solid #e5e5e5;">&pound;85.00</td> <td style="color: #636363; border: 1px solid #e5e5e5;" >&pound;85.00</td> </tr> </table>'
256
  };
257
  $.ajax({
258
  url: zapier_webhook_url,
changelog.txt CHANGED
@@ -1,3 +1,10 @@
 
 
 
 
 
 
 
1
  Version 1.2.2 - Tuesday, 12th November 2019
2
  - Fix: Duplicate order issue for variation products.
3
 
1
+ Version 1.2.3 - Thursday, 12th December 2019
2
+ - New: Added option to unsubscribe users in bulk.
3
+ - New: Added filter 'woo_ca_exclude_on_hold_order_from_tracking' to exclude on hold orders from the tracking.
4
+ - New: Added product table shortcode for webhook.
5
+ - Improvement: Updated filter 'woo_ca_email_template_table_style' for product table alignment.
6
+ - Fix: Sometimes test emails are not sending.
7
+
8
  Version 1.2.2 - Tuesday, 12th November 2019
9
  - Fix: Duplicate order issue for variation products.
10
 
classes/class-cartflows-ca-loader.php CHANGED
@@ -78,7 +78,7 @@ if ( ! class_exists( 'CARTFLOWS_CA_Loader' ) ) {
78
  define( 'CARTFLOWS_CA_BASE', plugin_basename( CARTFLOWS_CA_FILE ) );
79
  define( 'CARTFLOWS_CA_DIR', plugin_dir_path( CARTFLOWS_CA_FILE ) );
80
  define( 'CARTFLOWS_CA_URL', plugins_url( '/', CARTFLOWS_CA_FILE ) );
81
- define( 'CARTFLOWS_CA_VER', '1.2.2' );
82
  define( 'CARTFLOWS_CA_SLUG', 'cartflows_ca' );
83
 
84
  define( 'CARTFLOWS_CA_CART_ABANDONMENT_TABLE', 'cartflows_ca_cart_abandonment' );
78
  define( 'CARTFLOWS_CA_BASE', plugin_basename( CARTFLOWS_CA_FILE ) );
79
  define( 'CARTFLOWS_CA_DIR', plugin_dir_path( CARTFLOWS_CA_FILE ) );
80
  define( 'CARTFLOWS_CA_URL', plugins_url( '/', CARTFLOWS_CA_FILE ) );
81
+ define( 'CARTFLOWS_CA_VER', '1.2.3' );
82
  define( 'CARTFLOWS_CA_SLUG', 'cartflows_ca' );
83
 
84
  define( 'CARTFLOWS_CA_CART_ABANDONMENT_TABLE', 'cartflows_ca_cart_abandonment' );
languages/woo-cart-abandonment-recovery.pot CHANGED
@@ -2,10 +2,10 @@
2
  # This file is distributed under the same license as the WooCommerce Cart Abandonment Recovery package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WooCommerce Cart Abandonment Recovery 1.2.1\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/woo-cart-abandonment-recovery\n"
8
- "POT-Creation-Date: 2019-11-05 10:40:08+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
@@ -228,146 +228,147 @@ msgid "View"
228
  msgstr ""
229
 
230
  #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:70
231
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1673
 
232
  msgid "Unsubscribe"
233
  msgstr ""
234
 
235
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:184
236
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1815
237
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1870
238
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:173
239
  msgid "Name"
240
  msgstr ""
241
 
242
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:185
243
  msgid "Email"
244
  msgstr ""
245
 
246
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:186
247
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1892
248
  msgid "Cart Total"
249
  msgstr ""
250
 
251
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:187
252
  msgid "Order Status"
253
  msgstr ""
254
 
255
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:188
256
  msgid "Time"
257
  msgstr ""
258
 
259
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:128
260
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:932
261
  msgid "This order was abandoned & subsequently recovered."
262
  msgstr ""
263
 
264
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:149
265
  msgid "Mail has been sent successfully!"
266
  msgstr ""
267
 
268
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:151
269
  msgid "Mail sending failed!"
270
  msgstr ""
271
 
272
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:191
273
  msgid "Every Fifteen Minutes"
274
  msgstr ""
275
 
276
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:257
277
  msgid "You have successfully unsubscribed from our email list."
278
  msgstr ""
279
 
280
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:257
281
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:164
282
  msgid "Unsubscribed"
283
  msgstr ""
284
 
285
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:412
286
  msgid ""
287
  "This checkout page is generated by WooCommerce Cart Abandonment Recovery "
288
  "plugin from test mail."
289
  msgstr ""
290
 
291
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:454
292
  msgid "No Thanks"
293
  msgstr ""
294
 
295
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:455
296
  msgid "You won't receive further emails from us, thank you!"
297
  msgstr ""
298
 
299
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1087
300
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1088
301
  msgid "Cart Abandonment"
302
  msgstr ""
303
 
304
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1121
305
  msgid "Items deleted: %d"
306
  msgstr ""
307
 
308
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1138
309
- msgid "User unsubscribed successfully!"
310
  msgstr ""
311
 
312
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1190
313
  msgid ""
314
  "Do you really want to delete the used and expired coupons created by Cart "
315
  "Abandonment Plugin?"
316
  msgstr ""
317
 
318
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1348
319
  msgid "Report"
320
  msgstr ""
321
 
322
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1364
323
  msgid "Follow-Up Emails"
324
  msgstr ""
325
 
326
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1380
327
  msgid "Settings"
328
  msgstr ""
329
 
330
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1634
331
  msgid "there"
332
  msgstr ""
333
 
334
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1807
335
  msgid "Cart Total ( Cart Total + Shipping + Tax )"
336
  msgstr ""
337
 
338
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1814
339
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1869
340
  msgid "Item"
341
  msgstr ""
342
 
343
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1816
344
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1871
345
  msgid "Quantity"
346
  msgstr ""
347
 
348
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1817
349
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1872
350
  msgid "Price"
351
  msgstr ""
352
 
353
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1818
354
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1873
355
  msgid "Line Subtotal"
356
  msgstr ""
357
 
358
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1879
359
  msgid "Discount"
360
  msgstr ""
361
 
362
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1883
363
  msgid "Other"
364
  msgstr ""
365
 
366
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1888
367
  msgid "Shipping"
368
  msgstr ""
369
 
370
- #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:2036
371
  #. translators: %1$s: Coupons Deleted, %2$s: Deleted coupons count'.
372
  msgid "%1$s: %2$d"
373
  msgstr ""
@@ -601,6 +602,10 @@ msgstr ""
601
  msgid "Close"
602
  msgstr ""
603
 
 
 
 
 
604
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:69
605
  msgid "Reschedule Emails"
606
  msgstr ""
2
  # This file is distributed under the same license as the WooCommerce Cart Abandonment Recovery package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WooCommerce Cart Abandonment Recovery 1.2.3\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/woo-cart-abandonment-recovery\n"
8
+ "POT-Creation-Date: 2019-12-12 05:59:07+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
228
  msgstr ""
229
 
230
  #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:70
231
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:122
232
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1682
233
  msgid "Unsubscribe"
234
  msgstr ""
235
 
236
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:189
237
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1825
238
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1879
239
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:173
240
  msgid "Name"
241
  msgstr ""
242
 
243
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:190
244
  msgid "Email"
245
  msgstr ""
246
 
247
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:191
248
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1901
249
  msgid "Cart Total"
250
  msgstr ""
251
 
252
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:192
253
  msgid "Order Status"
254
  msgstr ""
255
 
256
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php:193
257
  msgid "Time"
258
  msgstr ""
259
 
260
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:133
261
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:941
262
  msgid "This order was abandoned & subsequently recovered."
263
  msgstr ""
264
 
265
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:154
266
  msgid "Mail has been sent successfully!"
267
  msgstr ""
268
 
269
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:156
270
  msgid "Mail sending failed!"
271
  msgstr ""
272
 
273
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:196
274
  msgid "Every Fifteen Minutes"
275
  msgstr ""
276
 
277
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:262
278
  msgid "You have successfully unsubscribed from our email list."
279
  msgstr ""
280
 
281
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:262
282
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:164
283
  msgid "Unsubscribed"
284
  msgstr ""
285
 
286
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:417
287
  msgid ""
288
  "This checkout page is generated by WooCommerce Cart Abandonment Recovery "
289
  "plugin from test mail."
290
  msgstr ""
291
 
292
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:459
293
  msgid "No Thanks"
294
  msgstr ""
295
 
296
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:460
297
  msgid "You won't receive further emails from us, thank you!"
298
  msgstr ""
299
 
300
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1096
301
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1097
302
  msgid "Cart Abandonment"
303
  msgstr ""
304
 
305
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1130
306
  msgid "Items deleted: %d"
307
  msgstr ""
308
 
309
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1147
310
+ msgid "User(s) unsubscribed successfully!"
311
  msgstr ""
312
 
313
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1199
314
  msgid ""
315
  "Do you really want to delete the used and expired coupons created by Cart "
316
  "Abandonment Plugin?"
317
  msgstr ""
318
 
319
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1357
320
  msgid "Report"
321
  msgstr ""
322
 
323
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1373
324
  msgid "Follow-Up Emails"
325
  msgstr ""
326
 
327
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1389
328
  msgid "Settings"
329
  msgstr ""
330
 
331
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1643
332
  msgid "there"
333
  msgstr ""
334
 
335
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1817
336
  msgid "Cart Total ( Cart Total + Shipping + Tax )"
337
  msgstr ""
338
 
339
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1824
340
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1878
341
  msgid "Item"
342
  msgstr ""
343
 
344
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1826
345
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1880
346
  msgid "Quantity"
347
  msgstr ""
348
 
349
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1827
350
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1881
351
  msgid "Price"
352
  msgstr ""
353
 
354
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1828
355
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1882
356
  msgid "Line Subtotal"
357
  msgstr ""
358
 
359
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1888
360
  msgid "Discount"
361
  msgstr ""
362
 
363
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1892
364
  msgid "Other"
365
  msgstr ""
366
 
367
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:1897
368
  msgid "Shipping"
369
  msgstr ""
370
 
371
+ #: modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php:2045
372
  #. translators: %1$s: Coupons Deleted, %2$s: Deleted coupons count'.
373
  msgid "%1$s: %2$d"
374
  msgstr ""
602
  msgid "Close"
603
  msgstr ""
604
 
605
+ #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:69
606
+ msgid "Do you really want to reschedule emails?"
607
+ msgstr ""
608
+
609
  #: modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php:69
610
  msgid "Reschedule Emails"
611
  msgstr ""
modules/cart-abandonment/class-cartflows-ca-cart-abandonment-table.php CHANGED
@@ -117,6 +117,11 @@ class Cartflows_Ca_Cart_Abandonment_Table extends WP_List_Table {
117
  $actions = array(
118
  'delete' => __( 'Delete', 'woo-cart-abandonment-recovery' ),
119
  );
 
 
 
 
 
120
  return $actions;
121
  }
122
 
@@ -213,19 +218,26 @@ class Cartflows_Ca_Cart_Abandonment_Table extends WP_List_Table {
213
  global $wpdb;
214
  $table_name = $wpdb->prefix . CARTFLOWS_CA_CART_ABANDONMENT_TABLE;
215
 
216
- if ( 'delete' === $this->current_action() ) {
 
 
 
 
 
 
 
217
 
218
- $ids = array();
219
- if ( isset( $_REQUEST['id'] ) && is_array( $_REQUEST['id'] ) ) {
220
- $ids = array_map( 'intval', $_REQUEST['id'] );
221
- } elseif ( isset( $_REQUEST['id'] ) ) {
222
- $ids = array( intval( $_REQUEST['id'] ) );
223
- }
224
- $ids = implode( ',', $ids );
 
225
 
226
- if ( ! empty( $ids ) ) {
227
- $wpdb->query("DELETE FROM $table_name WHERE id IN($ids)"); // phpcs:ignore
228
  }
229
  }
 
230
  }
231
  }
117
  $actions = array(
118
  'delete' => __( 'Delete', 'woo-cart-abandonment-recovery' ),
119
  );
120
+
121
+ if ( ! isset( $_GET['filter_table'] ) || ( isset( $_GET['filter_table'] ) && WCF_CART_ABANDONED_ORDER === $_GET['filter_table'] ) ) {
122
+ $actions['unsubscribe'] = __( 'Unsubscribe', 'woo-cart-abandonment-recovery' );
123
+ }
124
+
125
  return $actions;
126
  }
127
 
218
  global $wpdb;
219
  $table_name = $wpdb->prefix . CARTFLOWS_CA_CART_ABANDONMENT_TABLE;
220
 
221
+ $ids = array();
222
+ if ( isset( $_REQUEST['id'] ) && is_array( $_REQUEST['id'] ) ) {
223
+ $ids = array_map( 'intval', $_REQUEST['id'] );
224
+ } elseif ( isset( $_REQUEST['id'] ) ) {
225
+ $ids = array( intval( $_REQUEST['id'] ) );
226
+ }
227
+ $ids = implode( ',', $ids );
228
+ if ( ! empty( $ids ) ) {
229
 
230
+ switch ( $this->current_action() ) {
231
+
232
+ case 'delete':
233
+ $wpdb->query("DELETE FROM $table_name WHERE id IN($ids)"); // phpcs:ignore
234
+ break;
235
+ case 'unsubscribe':
236
+ $wpdb->query( "UPDATE {$table_name} SET unsubscribed = 1 WHERE id IN($ids)" ); // phpcs:ignore
237
+ break;
238
 
 
 
239
  }
240
  }
241
+
242
  }
243
  }
modules/cart-abandonment/class-cartflows-ca-cart-abandonment.php CHANGED
@@ -102,6 +102,11 @@ class Cartflows_Ca_Cart_Abandonment {
102
 
103
  $acceptable_order_statuses = array( 'completed', 'processing', 'failed' );
104
 
 
 
 
 
 
105
  if ( ( WCF_CART_FAILED_ORDER === $new_order_status ) ) {
106
  return;
107
  }
@@ -500,7 +505,7 @@ class Cartflows_Ca_Cart_Abandonment {
500
  $orders = wc_get_orders(
501
  array(
502
  'billing_email' => $email_data->email,
503
- 'status' => [ 'processing', 'completed' ],
504
  'date_after' => date(
505
  'Y-m-d h:i:s',
506
  strtotime( '-30 days' )
@@ -512,13 +517,9 @@ class Cartflows_Ca_Cart_Abandonment {
512
  foreach ( $orders as $order ) {
513
  $order = wc_get_order( $order->get_id() );
514
  $items = $order->get_items();
515
-
516
- foreach ( $order->get_items() as $item_id => $item_data ) {
517
-
518
- $product_id = $item_data->get_product()->get_id();
519
-
520
  if ( in_array( $product_id, $current_products, true ) ) {
521
-
522
  /**
523
  * Remove duplicate captured order for tracking.
524
  */
@@ -651,6 +652,7 @@ class Cartflows_Ca_Cart_Abandonment {
651
  $trigger_details['coupon_code'] = $checkout_details->coupon_code;
652
  $trigger_details['order_status'] = $order_status;
653
  $trigger_details['cart_total'] = $checkout_details->cart_total;
 
654
 
655
  $parameters = http_build_query( $trigger_details );
656
  $args = array(
@@ -1141,8 +1143,8 @@ class Cartflows_Ca_Cart_Abandonment {
1141
  array( 'unsubscribed' => true ),
1142
  array( 'id' => $id )
1143
  );
1144
-
1145
- $message = '<div class="notice notice-success is-dismissible" id="message"><p>' . sprintf( __( 'User unsubscribed successfully!', 'woo-cart-abandonment-recovery' ) ) . '</p></div>'; // phpcs:ignore
1146
  set_transient( 'wcf_ca_show_message', $message, 5 );
1147
  if ( isset( $_SERVER['HTTP_REFERER'] ) ) {
1148
  wp_safe_redirect( $_SERVER['HTTP_REFERER'] );
@@ -1528,7 +1530,6 @@ class Cartflows_Ca_Cart_Abandonment {
1528
  $current_time = current_time( WCF_CA_DATETIME_FORMAT );
1529
  // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
1530
  $emails_send_to = $wpdb->get_results(
1531
-
1532
  $wpdb->prepare(
1533
  'SELECT *, EHT.id as email_history_id, ETT.id as email_template_id FROM ' . $email_history_table . ' as EHT
1534
  INNER JOIN ' . $cart_abandonment_table . ' as CAT ON EHT.`ca_session_id` = CAT.`session_id`
@@ -1626,9 +1627,10 @@ class Cartflows_Ca_Cart_Abandonment {
1626
  }
1627
 
1628
  if ( filter_var( $email_data->email, FILTER_VALIDATE_EMAIL ) ) {
1629
-
1630
- if ( ! $this->check_if_already_purchased_by_email_product_ids( $email_data, $email_data->cart_contents ) ) {
1631
- return false;
 
1632
  }
1633
 
1634
  $other_fields = unserialize( $email_data->other_fields );
@@ -1780,13 +1782,14 @@ class Cartflows_Ca_Cart_Abandonment {
1780
  'style' => 'height: 42px; width: 42px;',
1781
  ),
1782
  'table' => array(
1783
- 'style' => 'color: #636363; border: 1px solid #e5e5e5;',
 
1784
  ),
1785
  );
1786
 
1787
- $style = apply_filters( 'woo_ca_email_template_table_style', $style );
1788
- $product_image_style = isset( $style['product_image']['style'] ) ? $style['product_image']['style'] : '';
1789
- $style = isset( $style['table']['style'] ) ? $style['table']['style'] : '';
1790
 
1791
  foreach ( $cart_items as $cart_item ) {
1792
 
@@ -1816,7 +1819,7 @@ class Cartflows_Ca_Cart_Abandonment {
1816
  </tr> ';
1817
  }
1818
 
1819
- return '<table align="left" cellpadding="10" cellspacing="0" style="float: none; border: 1px solid #e5e5e5;">
1820
  <tr align="center">
1821
  <th style="' . $style . '">' . __( 'Item', 'woo-cart-abandonment-recovery' ) . '</th>
1822
  <th style="' . $style . '">' . __( 'Name', 'woo-cart-abandonment-recovery' ) . '</th>
@@ -1825,7 +1828,6 @@ class Cartflows_Ca_Cart_Abandonment {
1825
  <th style="' . $style . '">' . __( 'Line Subtotal', 'woo-cart-abandonment-recovery' ) . '</th>
1826
  </tr> ' . $tr . '
1827
  </table>';
1828
-
1829
  }
1830
 
1831
  /**
102
 
103
  $acceptable_order_statuses = array( 'completed', 'processing', 'failed' );
104
 
105
+ $exclude_on_hold_order = apply_filters( 'woo_ca_exclude_on_hold_order_from_tracking', false );
106
+
107
+ if ( $exclude_on_hold_order ) {
108
+ array_push( $acceptable_order_statuses, 'on-hold' );
109
+ }
110
  if ( ( WCF_CART_FAILED_ORDER === $new_order_status ) ) {
111
  return;
112
  }
505
  $orders = wc_get_orders(
506
  array(
507
  'billing_email' => $email_data->email,
508
+ 'status' => array( 'processing', 'completed' ),
509
  'date_after' => date(
510
  'Y-m-d h:i:s',
511
  strtotime( '-30 days' )
517
  foreach ( $orders as $order ) {
518
  $order = wc_get_order( $order->get_id() );
519
  $items = $order->get_items();
520
+ foreach ( $items as $item ) {
521
+ $product_id = $item->get_product_id();
 
 
 
522
  if ( in_array( $product_id, $current_products, true ) ) {
 
523
  /**
524
  * Remove duplicate captured order for tracking.
525
  */
652
  $trigger_details['coupon_code'] = $checkout_details->coupon_code;
653
  $trigger_details['order_status'] = $order_status;
654
  $trigger_details['cart_total'] = $checkout_details->cart_total;
655
+ $trigger_details['product_table'] = $this->get_email_product_block( $checkout_details->cart_contents, $checkout_details->cart_total );
656
 
657
  $parameters = http_build_query( $trigger_details );
658
  $args = array(
1143
  array( 'unsubscribed' => true ),
1144
  array( 'id' => $id )
1145
  );
1146
+ $wcf_list_table->process_bulk_action();
1147
+ $message = '<div class="notice notice-success is-dismissible" id="message"><p>' . sprintf( __( 'User(s) unsubscribed successfully!', 'woo-cart-abandonment-recovery' ) ) . '</p></div>'; // phpcs:ignore
1148
  set_transient( 'wcf_ca_show_message', $message, 5 );
1149
  if ( isset( $_SERVER['HTTP_REFERER'] ) ) {
1150
  wp_safe_redirect( $_SERVER['HTTP_REFERER'] );
1530
  $current_time = current_time( WCF_CA_DATETIME_FORMAT );
1531
  // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
1532
  $emails_send_to = $wpdb->get_results(
 
1533
  $wpdb->prepare(
1534
  'SELECT *, EHT.id as email_history_id, ETT.id as email_template_id FROM ' . $email_history_table . ' as EHT
1535
  INNER JOIN ' . $cart_abandonment_table . ' as CAT ON EHT.`ca_session_id` = CAT.`session_id`
1627
  }
1628
 
1629
  if ( filter_var( $email_data->email, FILTER_VALIDATE_EMAIL ) ) {
1630
+ if ( ! $preview_email ) {
1631
+ if ( ! $this->check_if_already_purchased_by_email_product_ids( $email_data, $email_data->cart_contents ) ) {
1632
+ return false;
1633
+ }
1634
  }
1635
 
1636
  $other_fields = unserialize( $email_data->other_fields );
1782
  'style' => 'height: 42px; width: 42px;',
1783
  ),
1784
  'table' => array(
1785
+ 'style' => 'color: #636363; border: 1px solid #e5e5e5;',
1786
+ 'attribute' => 'align= left;',
1787
  ),
1788
  );
1789
 
1790
+ $style_filter = apply_filters( 'woo_ca_email_template_table_style', $style );
1791
+ $product_image_style = isset( $style_filter['product_image']['style'] ) ? $style_filter['product_image']['style'] : '';
1792
+ $style = isset( $style_filter['table']['style'] ) ? $style_filter['table']['style'] : '';
1793
 
1794
  foreach ( $cart_items as $cart_item ) {
1795
 
1819
  </tr> ';
1820
  }
1821
 
1822
+ return '<table ' . $style_filter['table']['attribute'] . ' cellpadding="10" cellspacing="0" style="float: none; border: 1px solid #e5e5e5;">
1823
  <tr align="center">
1824
  <th style="' . $style . '">' . __( 'Item', 'woo-cart-abandonment-recovery' ) . '</th>
1825
  <th style="' . $style . '">' . __( 'Name', 'woo-cart-abandonment-recovery' ) . '</th>
1828
  <th style="' . $style . '">' . __( 'Line Subtotal', 'woo-cart-abandonment-recovery' ) . '</th>
1829
  </tr> ' . $tr . '
1830
  </table>';
 
1831
  }
1832
 
1833
  /**
modules/cart-abandonment/includes/admin/cartflows-ca-single-report-details.php CHANGED
@@ -66,7 +66,7 @@
66
  </p>
67
  </div>
68
  </div>
69
- <a name="Do you really want to reschedule emails?" href="#TB_inline?&width=500&height=200&inlineId=wcf-ca-confirm-email-reschedule" class="thickbox button button-secondary"> <?php _e( 'Reschedule Emails', 'woo-cart-abandonment-recovery' ); ?> </a>
70
  <?php endif; ?>
71
  </div>
72
  </div>
66
  </p>
67
  </div>
68
  </div>
69
+ <a name="<?php _e( 'Do you really want to reschedule emails?', 'woo-cart-abandonment-recovery' ); ?>" href="#TB_inline?&width=500&height=200&inlineId=wcf-ca-confirm-email-reschedule" class="thickbox button button-secondary"> <?php _e( 'Reschedule Emails', 'woo-cart-abandonment-recovery' ); ?> </a>
70
  <?php endif; ?>
71
  </div>
72
  </div>
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.me/BrainstormForce
4
  Tags: woocommerce, cart abandonment, cart recovery
5
  Requires at least: 4.4
6
  Tested up to: 5.2
7
- Stable tag: 1.2.2
8
  Requires PHP: 5.6
9
  License: GPLv2 or later
10
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -128,6 +128,14 @@ Here are few thoughts behind making it available for free:
128
  4. General settings for Email, Webhook (Coupon Code), GDPR
129
 
130
  == Changelog ==
 
 
 
 
 
 
 
 
131
  = Version 1.2.2 - Tuesday, 12th November 2019 =
132
  * Fix: Duplicate order issue for variation products.
133
 
@@ -199,4 +207,4 @@ Here are few thoughts behind making it available for free:
199
  = Version 1.0.0 - Monday, 27th May 2019 =
200
  * Initial Release
201
 
202
- == Upgrade Notice ==
4
  Tags: woocommerce, cart abandonment, cart recovery
5
  Requires at least: 4.4
6
  Tested up to: 5.2
7
+ Stable tag: 1.2.3
8
  Requires PHP: 5.6
9
  License: GPLv2 or later
10
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
128
  4. General settings for Email, Webhook (Coupon Code), GDPR
129
 
130
  == Changelog ==
131
+
132
+ = Version 1.2.3 - Thursday, 12th December 2019 =
133
+ * New: Added option to unsubscribe users in bulk.
134
+ * New: Added filter 'woo_ca_exclude_on_hold_order_from_tracking' to exclude on hold orders from the tracking.
135
+ * New: Added product table shortcode for webhook.
136
+ * Improvement: Updated filter 'woo_ca_email_template_table_style' for product table alignment.
137
+ * Fix: Sometimes test emails are not sending.
138
+
139
  = Version 1.2.2 - Tuesday, 12th November 2019 =
140
  * Fix: Duplicate order issue for variation products.
141
 
207
  = Version 1.0.0 - Monday, 27th May 2019 =
208
  * Initial Release
209
 
210
+ == Upgrade Notice ==
woo-cart-abandonment-recovery.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: WooCommerce Cart Abandonment Recovery
4
  * Plugin URI: https://cartflows.com/
5
  * Description: Recover your lost revenue. Capture email address of users on the checkout page and send follow up emails if they don't complete the purchase.
6
- * Version: 1.2.2
7
  * Author: CartFlows Inc
8
  * Author URI: https://cartflows.com/
9
  * Text Domain: woo-cart-abandonment-recovery
3
  * Plugin Name: WooCommerce Cart Abandonment Recovery
4
  * Plugin URI: https://cartflows.com/
5
  * Description: Recover your lost revenue. Capture email address of users on the checkout page and send follow up emails if they don't complete the purchase.
6
+ * Version: 1.2.3
7
  * Author: CartFlows Inc
8
  * Author URI: https://cartflows.com/
9
  * Text Domain: woo-cart-abandonment-recovery