Abandoned Cart Lite for WooCommerce - Version 5.13.0

Version Description

( 23.08.2022 ) = * Tweak - The plugin will now delete carts older than 365 days to ensure performance is not affected. * Tweak - Added a email type column in email templates database table. This will not result in any frontend changes for reminder email templates. * Tweak - Added hooks to change the sender and recipient email address for order recovery notifications. * Tweak - Added a hook to allow the site admin to change the cart recovery URL in reminder emails. * Tweak - Added hooks to modify the cart table in reminder emails. * Tweak - Performance improvements have been added in the action scheduler code run every 15 mins. * Tweak - Added a hook to change the URL the user is redirected to when unsubscribing from reminder emails. * Tweak - Updated the data tracked and sent from user sites for better data analysis and user behaviour. * Fix - From email address and user name is taken from WP Settings instead of plugin when WC template style headers are enabled. * Fix - WP Multisite installation compatibility. * Fix - An extra https:// was being added to cart recovery links in reminder emails occassionaly. * Fix - A fatal error was observed on rare occassions on the plugin dashboard. * Fix - A fatal error was observed on the Product Report tab. * Fix - Orphan record were being left by the plugin in the options table on uninstalling.

Download this release

Release Info

Developer tychesoftwares
Plugin Icon 128x128 Abandoned Cart Lite for WooCommerce
Version 5.13.0
Comparing to
See all releases

Code changes from version 5.12.0 to 5.13.0

class-wcal-update.php CHANGED
@@ -44,7 +44,10 @@ if ( ! class_exists( 'Wcal_Update' ) ) {
44
 
45
  $blog_list = get_sites();
46
  foreach ( $blog_list as $blog_list_key => $blog_list_value ) {
47
- add_blog_option( $blog_id, 'wcal_db_version', '5.10.0' ); // This version number should not be changed. Issue #786.
 
 
 
48
  }
49
  } else { // single site.
50
  add_option( 'wcal_db_version', '5.10.0' ); // This version number should not be changed. Issue #786.
@@ -178,6 +181,16 @@ if ( ! class_exists( 'Wcal_Update' ) ) {
178
  $wpdb->query( "ALTER TABLE {$db_prefix}ac_abandoned_cart_history_lite ADD `session_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL AFTER `unsubscribe_link`;" ); //phpcs:ignore
179
  }
180
  }
 
 
 
 
 
 
 
 
 
 
181
 
182
  /**
183
  * We have moved email templates fields in the setings section. SO to remove that fields column fro the db we need it.
44
 
45
  $blog_list = get_sites();
46
  foreach ( $blog_list as $blog_list_key => $blog_list_value ) {
47
+ if ( $blog_list_value->blog_id > 1 ) { // child sites.
48
+ $blog_id = $blog_list_value->blog_id;
49
+ add_blog_option( $blog_id, 'wcal_db_version', '5.10.0' ); // This version number should not be changed. Issue #786.
50
+ }
51
  }
52
  } else { // single site.
53
  add_option( 'wcal_db_version', '5.10.0' ); // This version number should not be changed. Issue #786.
181
  $wpdb->query( "ALTER TABLE {$db_prefix}ac_abandoned_cart_history_lite ADD `session_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL AFTER `unsubscribe_link`;" ); //phpcs:ignore
182
  }
183
  }
184
+ // Create new column for email type in templates.
185
+ if ( $wpdb->get_var( "SHOW TABLES LIKE '{$db_prefix}ac_email_templates_lite';" ) ) { //phpcs:ignore
186
+ if ( ! $wpdb->get_var( "SHOW COLUMNS FROM `{$db_prefix}ac_email_templates_lite` LIKE 'email_type';" ) ) { //phpcs:ignore
187
+ $wpdb->query( "ALTER TABLE {$db_prefix}ac_email_templates_lite ADD `email_type` VARCHAR(50) NOT NULL AFTER `id`;" ); //phpcs:ignore
188
+ }
189
+ }
190
+ if ( 'yes' !== get_option( 'wcal_email_type_setup', '' ) ) {
191
+ update_option( 'wcal_email_type_setup', 'yes' );
192
+ $wpdb->query( 'UPDATE `' . $db_prefix . 'ac_email_templates_lite` SET email_type="abandoned_cart_email"' ); // phpcs:ignore
193
+ }
194
 
195
  /**
196
  * We have moved email templates fields in the setings section. SO to remove that fields column fro the db we need it.
cron/class-wcal-cron.php CHANGED
@@ -170,14 +170,8 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
170
  )
171
  );
172
 
173
- $wcap_check_cart_staus_need_to_update = false;
174
-
175
- $wc_order_status = isset( $results_wcal_check_if_cart_is_present_in_post_meta[0]->post_status ) ? $results_wcal_check_if_cart_is_present_in_post_meta[0]->post_status : '';
176
- if ( empty( $results_wcal_check_if_cart_is_present_in_post_meta ) ||
177
- ( isset( $results_wcal_check_if_cart_is_present_in_post_meta[0] ) &&
178
- 'wc-failed' !== $wc_order_status && 'wc-pending' !== $wc_order_status ) ) {
179
- $wcap_check_cart_staus_need_to_update = self::wcal_update_abandoned_cart_status_for_placed_orders( $time_to_send_template_after, $cart_update_time, $value->user_id, $value->user_type, $value->id, $value->user_email );
180
- }
181
 
182
  if ( false === $wcal_check_cart_needed_for_multiple_template && (int) $template_id === (int) $last_template_id ) {
183
  $wpdb->update( // phpcs:ignore
@@ -191,7 +185,7 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
191
  );
192
  }
193
 
194
- if ( false === $wcal_check_cart_needed_for_multiple_template && false === $wcap_check_cart_staus_need_to_update ) {
195
 
196
  $cart_info_db = $value->abandoned_cart_info;
197
  $email_subject = $template_email_subject;
@@ -281,7 +275,7 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
281
  $cart_page_id = wc_get_page_id( 'cart' );
282
  $cart_page_link = $cart_page_id ? get_permalink( $cart_page_id ) : '';
283
  }
284
-
285
  $encoding_cart = $email_sent_id . '&url=' . $cart_page_link . $utm;
286
  $validate_cart = wcal_common::wcal_encrypt_validate( $encoding_cart );
287
  $cart_link_track = get_option( 'siteurl' ) . '/?wcal_action=track_links&validate=' . $validate_cart;
@@ -303,6 +297,8 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
303
  $email_body = str_ireplace( '{{cart.unsubscribe}}', $unsubscribe_link_track, $email_body );
304
  $var = '';
305
  if ( preg_match( '{{products.cart}}', $email_body, $matched ) ) {
 
 
306
  $qty_header = __( 'Quantity', 'woocommerce-abandoned-cart' );
307
  $price_header = __( 'Price', 'woocommerce-abandoned-cart' );
308
  $line_subtotal_header = __( 'Line Subtotal', 'woocommerce-abandoned-cart' );
@@ -312,8 +308,8 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
312
  $var = '<table width = 100% style="margin-right: auto; margin-left:auto;">
313
  <tr> <td colspan="5"> <h3 style="text-align:center">' . __( 'Your Shopping Cart', 'woocommerce-abandoned-cart' ) . '</h3> </td></tr>
314
  <tr>
315
- <th>' . __( 'Item', 'woocommerce-abandoned-cart' ) . '</th>
316
- <th>' . __( 'Name', 'woocommerce-abandoned-cart' ) . '</th>
317
  <th>' . apply_filters( 'wcal_reminder_email_qty_header', $qty_header ) . '</th>
318
  <th>' . apply_filters( 'wcal_reminder_email_price_header', $price_header ) . '</th>
319
  <th>' . apply_filters( 'wcal_reminder_email_line_subtotal_header', $line_subtotal_header ) . '</th>
@@ -323,8 +319,8 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
323
  $var = '<table border="0" cellpadding="10" cellspacing="0" class="templateDataTable" style="margin-right: auto; margin-left:auto;">
324
  <tr> <td colspan="5"> <h3 style="text-align:center">' . __( 'Your Shopping Cart', 'woocommerce-abandoned-cart' ) . '</h3> </td></tr>
325
  <tr>
326
- <th>' . __( 'Item', 'woocommerce-abandoned-cart' ) . '</th>
327
- <th>' . __( 'Name', 'woocommerce-abandoned-cart' ) . '</th>
328
  <th>' . apply_filters( 'wcal_reminder_email_qty_header', $qty_header ) . '</th>
329
  <th>' . apply_filters( 'wcal_reminder_email_price_header', $price_header ) . '</th>
330
  <th>' . apply_filters( 'wcal_reminder_email_line_subtotal_header', $line_subtotal_header ) . '</th>
@@ -406,11 +402,12 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
406
  }
407
  $product_name = $product_name_with_variable;
408
  }
409
-
 
410
  $product_name = apply_filters( 'wcal_reminder_email_after_product_name', $product_name, $v );
411
  $var .= '<tr align="center">
412
- <td> <a href="' . $cart_link_track . '"> <img src="' . $image_url . '" alt="" height="42" width="42" /> </a></td>
413
- <td> <a href="' . $cart_link_track . '">' . $product_name . '</a></td>
414
  <td> ' . apply_filters( 'wcal_reminder_email_qty_value', $quantity_total ) . '</td>
415
  <td> ' . apply_filters( 'wcal_reminder_email_price_value', $item_subtotal ) . '</td>
416
  <td> ' . apply_filters( 'wcal_reminder_email_line_subtotal_value', $item_total_display ) . '</td>
@@ -576,177 +573,183 @@ if ( ! class_exists( 'Wcal_Cron' ) ) {
576
  * @return boolean true | false
577
  * @since 4.3
578
  */
579
- public static function wcal_update_abandoned_cart_status_for_placed_orders( $time_to_send_template_after, $wcal_cart_time, $wcal_user_id, $wcal_user_type, $wcal_cart_id, $wcal_user_email ) {
580
  global $wpdb;
581
 
582
- if ( $wcal_user_id >= '63000000' && 'GUEST' === $wcal_user_type ) {
583
- $updated_value = self::wcal_update_status_of_guest( $wcal_cart_id, $wcal_cart_time, $time_to_send_template_after, $wcal_user_email );
584
- if ( 1 === $updated_value ) {
585
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
586
  }
587
- } elseif ( $wcal_user_id < '63000000' && 'REGISTERED' === $wcal_user_type ) {
588
- $updated_value = self::wcal_update_status_of_loggedin( $wcal_cart_id, $wcal_cart_time, $time_to_send_template_after, $wcal_user_email );
589
- if ( 1 === $updated_value ) {
590
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
591
  }
592
  }
593
- return false;
594
  }
595
 
596
  /**
597
  * It will update the Guest users abandoned cart staus if the order has been placed before sending the reminder emails.
598
  *
599
- * @param string|int $cart_id Abandoned cart id.
600
- * @param string|timestamp $abandoned_cart_time Abandoned time.
601
  * @param string|timestamp $time_to_send_template_after Template time.
602
- * @param string $wcal_user_email_address User Email.
 
 
 
 
 
603
  * @globals mixed $wpdb
604
  * @return int 0|1
605
  * @since 4.3
606
  */
607
- public static function wcal_update_status_of_guest( $cart_id, $abandoned_cart_time, $time_to_send_template_after, $wcal_user_email_address ) {
608
- global $wpdb;
609
-
610
- $results_query_email = $wpdb->get_results( // phpcs:ignore
611
- $wpdb->prepare(
612
- 'SELECT wpm.post_id, wpost.post_date, wpost.post_status FROM `' . $wpdb->prefix . 'postmeta` AS wpm LEFT JOIN `' . $wpdb->prefix . 'posts` AS wpost ON wpm.post_id = wpost.ID
613
- WHERE wpm.meta_key = %s AND wpm.meta_value = %s AND wpm.post_id = wpost.ID AND wpost.post_type = %s Order BY wpm.post_id DESC LIMIT 1',
614
- '_billing_email',
615
- $wcal_user_email_address,
616
- 'shop_order'
617
- )
618
- );
619
-
620
- // This will check that For abc@abc.com email address we have order for todays date in WC post table.
621
- if ( count( $results_query_email ) > 0 ) {
622
-
623
- $current_time = current_time( 'timestamp' ); // phpcs:ignore
624
- $todays_date = date( 'Y-m-d', $current_time ); // phpcs:ignore
625
-
626
- $order_date_with_time = $results_query_email[0]->post_date;
627
- $order_date = substr( $order_date_with_time, 0, 10 );
628
-
629
- if ( ( 'wc-pending' === $results_query_email[0]->post_status || 'wc-failed' === $results_query_email[0]->post_status ) && strtotime( $order_date_with_time ) > $abandoned_cart_time ) {
630
- // If the post status are pending or failed the send them for abandoned cart reminder emails.
631
- return 0;
632
- } elseif ( strtotime( $order_date_with_time ) > $abandoned_cart_time ) {
633
-
634
- // In some cases the cart is recovered but it is not marked as the recovered. So here we check if any record is found for that cart id if yes then update the record respectively.
635
- $wcal_check_email_sent_to_cart = self::wcal_get_cart_sent_data( $cart_id );
636
-
637
- if ( 0 !== $wcal_check_email_sent_to_cart ) {
638
-
639
- $wcal_results = $wpdb->get_results( // phpcs:ignore
640
- $wpdb->prepare(
641
- 'SELECT `post_id` FROM `' . $wpdb->prefix . 'postmeta` WHERE meta_value = %s',
642
- $cart_id
643
- )
644
- );
645
-
646
- if ( count( $wcal_results ) > 0 ) {
647
 
648
- $order_id = $wcal_results[0]->post_id;
649
-
650
- $order = wc_get_order( $order_id );
651
-
652
- $wpdb->query( // phpcs:ignore
653
- $wpdb->prepare(
654
- "UPDATE `" . $wpdb->prefix . "ac_abandoned_cart_history_lite` SET recovered_cart= %s, cart_ignored = '1' WHERE id = %s", // phpcs:ignore
655
- $order_id,
656
- $cart_id
657
- )
658
- );
659
-
660
- $order->add_order_note( __( 'This order was abandoned & subsequently recovered.', 'woocommerce-abandoned-cart' ) );
661
-
662
- delete_post_meta( $order_id, 'wcal_recover_order_placed', $cart_id );
663
- delete_post_meta( $order_id, 'wcal_recover_order_placed_sent_id', $wcal_check_email_sent_to_cart );
664
- }
665
- } else {
666
- $wpdb->query( // phpcs:ignore
667
- $wpdb->prepare(
668
- "UPDATE `" . $wpdb->prefix . "ac_abandoned_cart_history_lite` SET cart_ignored = '1' WHERE id = %s", // phpcs:ignore
669
- $cart_id
670
- )
671
- );
672
- }
673
- return 1;
674
- }
675
  }
676
- return 0;
 
677
  }
678
 
679
  /**
680
- * It will update the Loggedin users abandoned cart staus if the order has been placed before sending the reminder emails.
681
  *
682
  * @param string|int $cart_id Abandoned cart id.
683
- * @param string|timestamp $abandoned_cart_time Abandoned time.
684
  * @param string|timestamp $time_to_send_template_after Template time.
685
- * @param string $user_billing_email User Email.
 
686
  * @globals mixed $wpdb
687
  * @return int 0|1
688
  * @since 4.3
689
  */
690
- public static function wcal_update_status_of_loggedin( $cart_id, $abandoned_cart_time, $time_to_send_template_after, $user_billing_email ) {
691
  global $wpdb;
692
 
693
- $results_query_email = $wpdb->get_results( // phpcs:ignore
 
 
 
 
 
 
 
 
 
694
  $wpdb->prepare(
695
- "SELECT wpm.post_id, wpost.post_date, wpost.post_status FROM `" . $wpdb->prefix . "postmeta` AS wpm LEFT JOIN `" . $wpdb->prefix . "posts` AS wpost ON wpm.post_id = wpost.ID WHERE wpm.meta_key = '_billing_email' AND wpm.meta_value = %s AND wpm.post_id = wpost.ID Order BY wpm.post_id DESC LIMIT 1", // phpcs:ignore
696
- $user_billing_email
697
  )
698
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
699
 
700
- if ( count( $results_query_email ) > 0 ) {
701
- $current_time = current_time( 'timestamp' ); // phpcs:ignore
702
- $todays_date = date( 'Y-m-d', $current_time ); // phpcs:ignore
703
- $order_date_time = $results_query_email[0]->post_date;
704
- $order_date = substr( $order_date_time, 0, 10 );
705
-
706
- if ( $order_date == $todays_date ) { // phpcs:ignore
707
-
708
- $wcal_check_email_sent_to_cart = self::wcal_get_cart_sent_data( $cart_id );
709
-
710
- if ( $wcal_check_email_sent_to_cart > 0 ) {
711
-
712
- $wcal_results = $wpdb->get_results( // phpcs:ignore
713
- $wpdb->prepare(
714
- 'SELECT `post_id` FROM `' . $wpdb->prefix . 'postmeta` WHERE meta_value = %s',
715
- $cart_id
716
- )
717
- );
718
-
719
- if ( count( $wcal_results ) > 0 ) {
720
-
721
- $order_id = $wcal_results[0]->post_id;
722
-
723
- $order = wc_get_order( $order_id );
724
-
725
- $wpdb->query( // phpcs:ignore
726
- "UPDATE `" . $wpdb->prefix . "ac_abandoned_cart_history_lite` SET recovered_cart= '" . $order_id . "', cart_ignored = '1' WHERE id = '" . $cart_id . "'" // phpcs:ignore
727
- );
728
-
729
- $order->add_order_note( __( 'This order was abandoned & subsequently recovered.', 'woocommerce-abandoned-cart' ) );
730
-
731
- delete_post_meta( $order_id, 'wcal_recover_order_placed', $cart_id );
732
- delete_post_meta( $order_id, 'wcal_recover_order_placed_sent_id', $wcal_check_email_sent_to_cart );
733
  }
734
- } else {
735
- $wpdb->query( // phpcs:ignore
736
- "UPDATE `" . $wpdb->prefix . "ac_abandoned_cart_history_lite` SET cart_ignored = '1' WHERE id ='" . $cart_id . "'" // phpcs:ignore
 
 
 
 
 
 
737
  );
738
  }
739
- return 1;
740
- } elseif ( strtotime( $order_date_time ) >= $abandoned_cart_time ) {
741
- $wpdb->query( // phpcs:ignore
742
- "UPDATE `" . $wpdb->prefix . "ac_abandoned_cart_history_lite` SET cart_ignored = '1' WHERE id ='" . $cart_id . "'" // phpcs:ignore
 
 
 
 
 
 
 
743
  );
744
- return 1; // We return here 1 so it indicate that the cart has been modifed so do not sent email and delete from the array.
745
- } elseif ( 'wc-pending' === $results_query_email[0]->post_status || 'wc-failed' === $results_query_email[0]->post_status ) {
746
- return 0; // if status of the order is pending or falied then return 0 so it will not delete that cart and send reminder email.
747
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
748
  }
749
- return 0; // it means there are no record found to be update it.
750
  }
751
 
752
  /**
170
  )
171
  );
172
 
173
+ // Check if any further orders have come from the user. If yes and the order status is Pending or Failed, email will be sent.
174
+ $wcal_check_cart_status = self::wcal_get_cart_status( $time_to_send_template_after, $cart_update_time, $value->user_id, $value->user_type, $value->id, $value->user_email );
 
 
 
 
 
 
175
 
176
  if ( false === $wcal_check_cart_needed_for_multiple_template && (int) $template_id === (int) $last_template_id ) {
177
  $wpdb->update( // phpcs:ignore
185
  );
186
  }
187
 
188
+ if ( false === $wcal_check_cart_needed_for_multiple_template && false === $wcal_check_cart_status ) {
189
 
190
  $cart_info_db = $value->abandoned_cart_info;
191
  $email_subject = $template_email_subject;
275
  $cart_page_id = wc_get_page_id( 'cart' );
276
  $cart_page_link = $cart_page_id ? get_permalink( $cart_page_id ) : '';
277
  }
278
+ $cart_page_link = apply_filters( 'wcal_cart_link_email_before_encoding', $cart_page_link, $value->id );
279
  $encoding_cart = $email_sent_id . '&url=' . $cart_page_link . $utm;
280
  $validate_cart = wcal_common::wcal_encrypt_validate( $encoding_cart );
281
  $cart_link_track = get_option( 'siteurl' ) . '/?wcal_action=track_links&validate=' . $validate_cart;
297
  $email_body = str_ireplace( '{{cart.unsubscribe}}', $unsubscribe_link_track, $email_body );
298
  $var = '';
299
  if ( preg_match( '{{products.cart}}', $email_body, $matched ) ) {
300
+ $img_header = __( 'Item', 'woocommerce-abandoned-cart' );
301
+ $product_name_header = __( 'Name', 'woocommerce-abandoned-cart' );
302
  $qty_header = __( 'Quantity', 'woocommerce-abandoned-cart' );
303
  $price_header = __( 'Price', 'woocommerce-abandoned-cart' );
304
  $line_subtotal_header = __( 'Line Subtotal', 'woocommerce-abandoned-cart' );
308
  $var = '<table width = 100% style="margin-right: auto; margin-left:auto;">
309
  <tr> <td colspan="5"> <h3 style="text-align:center">' . __( 'Your Shopping Cart', 'woocommerce-abandoned-cart' ) . '</h3> </td></tr>
310
  <tr>
311
+ <th>' . apply_filters( 'wcal_reminder_email_img_header', $img_header ) . '</th>
312
+ <th>' . apply_filters( 'wcal_reminder_email_product_header', $product_name_header ) . '</th>
313
  <th>' . apply_filters( 'wcal_reminder_email_qty_header', $qty_header ) . '</th>
314
  <th>' . apply_filters( 'wcal_reminder_email_price_header', $price_header ) . '</th>
315
  <th>' . apply_filters( 'wcal_reminder_email_line_subtotal_header', $line_subtotal_header ) . '</th>
319
  $var = '<table border="0" cellpadding="10" cellspacing="0" class="templateDataTable" style="margin-right: auto; margin-left:auto;">
320
  <tr> <td colspan="5"> <h3 style="text-align:center">' . __( 'Your Shopping Cart', 'woocommerce-abandoned-cart' ) . '</h3> </td></tr>
321
  <tr>
322
+ <th>' . apply_filters( 'wcal_reminder_email_img_header', $img_header ) . '</th>
323
+ <th>' . apply_filters( 'wcal_reminder_email_product_header', $product_name_header ) . '</th>
324
  <th>' . apply_filters( 'wcal_reminder_email_qty_header', $qty_header ) . '</th>
325
  <th>' . apply_filters( 'wcal_reminder_email_price_header', $price_header ) . '</th>
326
  <th>' . apply_filters( 'wcal_reminder_email_line_subtotal_header', $line_subtotal_header ) . '</th>
402
  }
403
  $product_name = $product_name_with_variable;
404
  }
405
+ $image_col = '<a href="' . $cart_link_track . '"> <img src="' . $image_url . '" alt="" height="42" width="42" /> </a>';
406
+ $prod_col = '<a href="' . $cart_link_track . '">' . $product_name . '</a>';
407
  $product_name = apply_filters( 'wcal_reminder_email_after_product_name', $product_name, $v );
408
  $var .= '<tr align="center">
409
+ <td> ' . apply_filters( 'wcal_reminder_email_image_value', $image_col ) . '</td>
410
+ <td> ' . apply_filters( 'wcal_reminder_email_prod_value', $prod_col ) . '</td>
411
  <td> ' . apply_filters( 'wcal_reminder_email_qty_value', $quantity_total ) . '</td>
412
  <td> ' . apply_filters( 'wcal_reminder_email_price_value', $item_subtotal ) . '</td>
413
  <td> ' . apply_filters( 'wcal_reminder_email_line_subtotal_value', $item_total_display ) . '</td>
573
  * @return boolean true | false
574
  * @since 4.3
575
  */
576
+ public static function wcal_get_cart_status( $time_to_send_template_after, $wcal_cart_time, $wcal_user_id, $wcal_user_type, $wcal_cart_id, $wcal_user_email ) {
577
  global $wpdb;
578
 
579
+ $order_id = 0;
580
+ $wcal_cart_status = false;
581
+
582
+ $results_wcal_check_if_cart_is_present_in_post_meta = $wpdb->get_var( // phpcS:ignore
583
+ $wpdb->prepare(
584
+ "SELECT post_id FROM `" . $wpdb->prefix . "postmeta` WHERE meta_key = 'wcal_abandoned_cart_id' AND meta_value = %d LIMIT 1", // phpcs:ignore
585
+ $wcal_cart_id
586
+ )
587
+ );
588
+
589
+ if ( is_array( $results_wcal_check_if_cart_is_present_in_post_meta ) && $results_wcal_check_if_cart_is_present_in_post_meta > 0 ) {
590
+ $order_id = $results_wcal_check_if_cart_is_present_in_post_meta;
591
+ $order = wc_get_order( $order_id );
592
+ } else { // check for an order for the same date & email address.
593
+ $args = array(
594
+ 'customer' => $wcal_user_email,
595
+ 'limit' => 1,
596
+ );
597
+ $order_obj = wc_get_orders( $args );
598
+ if ( ! empty( $order_obj ) ) {
599
+ $order = $order_obj[0];
600
  }
601
+ }
602
+ if ( isset( $order ) && is_object( $order ) ) {
603
+
604
+ $order_data = $order->get_data();
605
+
606
+ $order_status = $order_data['status'];
607
+ $order_id = $order_data['id'];
608
+ if ( 'cancelled' !== $order_status && 'failed' !== $order_status && 'pending' !== $order_status ) {
609
+
610
+ $order_date = $order_data['date_created']->date( 'Y-m-d' );
611
+ $order_date_time = $order_data['date_created']->date( 'Y-m-d H:i:s' );
612
+
613
+ $order_details = array(
614
+ 'id' => $order_id,
615
+ 'status' => $order_status,
616
+ 'date_created' => $order_date,
617
+ 'date_time_created' => $order_date_time,
618
+ );
619
+
620
+ $wcal_cart_status = self::wcal_update_abandoned_cart_status_for_placed_orders( $time_to_send_template_after, $wcal_cart_time, $wcal_user_id, $wcal_user_type, $wcal_cart_id, $wcal_user_email, $order_details );
621
  }
622
  }
623
+ return $wcal_cart_status;
624
  }
625
 
626
  /**
627
  * It will update the Guest users abandoned cart staus if the order has been placed before sending the reminder emails.
628
  *
 
 
629
  * @param string|timestamp $time_to_send_template_after Template time.
630
+ * @param string|timestamp $wcal_cart_time Cart cutoff time.
631
+ * @param string|int $wcal_user_id User ID.
632
+ * @param string $wcal_user_type - User Type.
633
+ * @param string|int $wcal_cart_id Abandoned cart id.
634
+ * @param string $wcal_user_email - User email.
635
+ * @param array $order_details - WC Order Details.
636
  * @globals mixed $wpdb
637
  * @return int 0|1
638
  * @since 4.3
639
  */
640
+ public static function wcal_update_abandoned_cart_status_for_placed_orders( $time_to_send_template_after, $wcal_cart_time, $wcal_user_id, $wcal_user_type, $wcal_cart_id, $wcal_user_email, $order_details ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
641
 
642
+ $updated_value = self::wcal_update_cart_status( $wcal_cart_id, $wcal_cart_time, $time_to_send_template_after, $wcal_user_email, $order_details );
643
+ if ( 1 === $updated_value ) {
644
+ return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645
  }
646
+
647
+ return false;
648
  }
649
 
650
  /**
651
+ * It will update the Guest users abandoned cart staus if the order has been placed before sending the reminder emails.
652
  *
653
  * @param string|int $cart_id Abandoned cart id.
654
+ * @param string|timestamp $wcal_cart_time Abandoned time.
655
  * @param string|timestamp $time_to_send_template_after Template time.
656
+ * @param string $wcal_user_email User Email.
657
+ * @param array $order_details - Order Details.
658
  * @globals mixed $wpdb
659
  * @return int 0|1
660
  * @since 4.3
661
  */
662
+ public static function wcal_update_cart_status( $cart_id, $wcal_cart_time, $time_to_send_template_after, $wcal_user_email, $order_details ) {
663
  global $wpdb;
664
 
665
+ $current_time = current_time( 'timestamp' ); // phpcs:ignore
666
+ $todays_date = date( 'Y-m-d', $current_time ); // phpcs:ignore
667
+ $order_date = $order_details['date_created'];
668
+ $order_date_time = $order_details['date_time_created'];
669
+ $order_status = $order_details['status'];
670
+
671
+ $order_date_str = strtotime( $order_date );
672
+
673
+ // Retreive the cart status.
674
+ $cart_ignored_status = $wpdb->get_col( // phpcs:ignore
675
  $wpdb->prepare(
676
+ 'SELECT cart_ignored FROM `' . $wpdb->prefix . 'ac_abandoned_cart_history_lite` WHERE id = %d', // phpcs:ignore
677
+ $cart_id
678
  )
679
  );
680
+ if ( $order_date_str > $current_time ) {
681
+ // In some case the cart is recovered but it is not marked as the recovered. So here we check if any record is found for that cart id if yes then update the record respectively.
682
+ $wcal_check_email_sent_to_cart = self::wcal_get_cart_sent_data( $cart_id );
683
+
684
+ if ( 0 !== $wcal_check_email_sent_to_cart && ! in_array( $order_status, array( 'wc-pending', 'wc-failed' ), true ) ) {
685
+
686
+ $wcal_results = $wpdb->get_results( // phpcs:ignore
687
+ $wpdb->prepare(
688
+ 'SELECT `post_id` FROM `' . $wpdb->prefix . 'postmeta` WHERE meta_value = %s AND meta_key = %s ',
689
+ $cart_id,
690
+ 'wcal_recover_order_placed'
691
+ )
692
+ );
693
 
694
+ if ( count( $wcal_results ) > 0 ) {
695
+
696
+ $order_id = $wcal_results[0]->post_id;
697
+ try {
698
+ if ( 'wc-cancelled' !== $order_status && 'wc-refunded' !== $order_status && 'wc-trash' !== $order_status ) {
699
+ $wpdb->update( // phpcs:ignore
700
+ $wpdb->prefix . 'ac_abandoned_cart_history_lite',
701
+ array(
702
+ 'cart_ignored' => '1',
703
+ 'recovered_cart' => $order_id,
704
+ ),
705
+ array(
706
+ 'id' => $cart_id,
707
+ )
708
+ );
709
+ }
710
+ } catch ( Exception $e ) { // phpcs:ignore
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711
  }
712
+ } else { // Since there's an order placed today for the same user, mark this cart as ignored.
713
+ $wpdb->update( // phpcs:ignore
714
+ $wpdb->prefix . 'ac_abandoned_cart_history_lite',
715
+ array(
716
+ 'cart_ignored' => '1',
717
+ ),
718
+ array(
719
+ 'id' => $cart_id,
720
+ )
721
  );
722
  }
723
+ } elseif ( in_array( $order_status, array( 'wc-pending', 'wc-failed' ), true ) ) {
724
+ return 0; // Return 0 as we want to send reminders for unpaid order status.
725
+ } elseif ( '1' !== $cart_ignored_status[0] ) {
726
+ $wpdb->update( // phpcs:ignore
727
+ $wpdb->prefix . 'ac_abandoned_cart_history_lite',
728
+ array(
729
+ 'cart_ignored' => '1',
730
+ ),
731
+ array(
732
+ 'id' => $cart_id,
733
+ )
734
  );
 
 
 
735
  }
736
+ return 1;
737
+ } elseif ( strtotime( $order_date_time ) > $wcal_cart_time ) {
738
+ // Mark the cart as ignored.
739
+ $wpdb->update( // phpcs:ignore
740
+ $wpdb->prefix . 'ac_abandoned_cart_history_lite',
741
+ array(
742
+ 'cart_ignored' => '1',
743
+ ),
744
+ array(
745
+ 'id' => $cart_id,
746
+ )
747
+ );
748
+ return 1;
749
+ } elseif ( 'wc-pending' === $order_status || 'wc-failed' === $order_status ) { // Send the reminders.
750
+ return 0;
751
  }
752
+ return 0;
753
  }
754
 
755
  /**
i18n/languages/woocommerce-abandoned-cart.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Abandoned Cart Lite for WooCommerce plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Abandoned Cart Lite for WooCommerce 5.12.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/woocommerce-abandoned-cart\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-02-08T08:16:11+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: woocommerce-abandoned-cart\n"
@@ -38,70 +38,62 @@ msgstr ""
38
  msgid "Abandoned cart reminder"
39
  msgstr ""
40
 
41
- #: cron/class-wcal-cron.php:306
42
- #: woocommerce-ac.php:3153
43
- #: woocommerce-ac.php:3975
44
- #: woocommerce-ac.php:4010
45
- msgid "Quantity"
46
  msgstr ""
47
 
48
- #: cron/class-wcal-cron.php:307
49
- #: woocommerce-ac.php:3976
50
- #: woocommerce-ac.php:4011
51
- msgid "Price"
 
52
  msgstr ""
53
 
54
- #: cron/class-wcal-cron.php:308
55
- #: woocommerce-ac.php:3154
56
- #: woocommerce-ac.php:3977
57
- #: woocommerce-ac.php:4012
58
- msgid "Line Subtotal"
59
  msgstr ""
60
 
61
- #: cron/class-wcal-cron.php:313
62
- #: cron/class-wcal-cron.php:324
63
- #: woocommerce-ac.php:3971
64
- #: woocommerce-ac.php:4005
65
- msgid "Your Shopping Cart"
66
  msgstr ""
67
 
68
- #: cron/class-wcal-cron.php:315
69
- #: cron/class-wcal-cron.php:326
70
- #: woocommerce-ac.php:3151
71
- #: woocommerce-ac.php:3973
72
- #: woocommerce-ac.php:4008
73
- msgid "Item"
74
  msgstr ""
75
 
76
- #: cron/class-wcal-cron.php:316
77
- #: cron/class-wcal-cron.php:327
78
- #: woocommerce-ac.php:3152
79
- #: woocommerce-ac.php:3974
80
- #: woocommerce-ac.php:4009
81
- msgid "Name"
82
  msgstr ""
83
 
84
- #: cron/class-wcal-cron.php:350
85
- #: cron/class-wcal-cron.php:382
86
  msgid "SKU: "
87
  msgstr ""
88
 
89
- #: cron/class-wcal-cron.php:433
90
- #: woocommerce-ac.php:3997
91
- #: woocommerce-ac.php:4032
92
  msgid "Cart Total:"
93
  msgstr ""
94
 
95
- #: cron/class-wcal-cron.php:445
96
  msgid "Product no longer exists"
97
  msgstr ""
98
 
99
- #: cron/class-wcal-cron.php:660
100
- #: cron/class-wcal-cron.php:729
101
- #: includes/frontend/class-wcal-checkout-process.php:220
102
- msgid "This order was abandoned & subsequently recovered."
103
- msgstr ""
104
-
105
  #. translators: Cart ID.
106
  #: includes/admin/class-wcal-abandoned-cart-details.php:437
107
  msgid "Cart #%s"
@@ -131,7 +123,7 @@ msgid "ANONYMIZED"
131
  msgstr ""
132
 
133
  #: includes/admin/class-wcal-personal-data-export.php:137
134
- #: woocommerce-ac.php:1347
135
  msgid "Abandoned Carts"
136
  msgstr ""
137
 
@@ -198,7 +190,7 @@ msgstr ""
198
  #: includes/admin/class-wcap-add-cart-popup-modal.php:84
199
  #: includes/admin/class-wcap-pro-settings.php:66
200
  #: includes/admin/class-wcap-pro-settings.php:299
201
- #: woocommerce-ac.php:3721
202
  msgid "Save Changes"
203
  msgstr ""
204
 
@@ -708,15 +700,15 @@ msgid ""
708
  " <strong><a target=\"_blank\" href= \"%s\">Purchase now</a></strong> & Grab 20% discount with the code \"DFWP20\". The discount code is valid only for the first 20 customers."
709
  msgstr ""
710
 
711
- #: includes/class-wcal-common.php:674
712
  msgid "Database Updated Successfully"
713
  msgstr ""
714
 
715
- #: includes/class-wcal-common.php:689
716
  msgid "Database Update Failed. Please try again after sometime"
717
  msgstr ""
718
 
719
- #: includes/class-wcal-common.php:849
720
  msgid "This product no longer exists"
721
  msgstr ""
722
 
@@ -822,7 +814,7 @@ msgid "<strong>%s%%</strong> of Total Revenue"
822
  msgstr ""
823
 
824
  #: includes/classes/class-wcal-dashboard-report.php:161
825
- #: woocommerce-ac.php:2210
826
  msgid "Abandoned Orders"
827
  msgstr ""
828
 
@@ -887,7 +879,7 @@ msgid "Select date range:"
887
  msgstr ""
888
 
889
  #: includes/classes/class-wcal-dashboard-report.php:319
890
- #: woocommerce-ac.php:3104
891
  msgid "Go"
892
  msgstr ""
893
 
@@ -971,6 +963,10 @@ msgstr ""
971
  msgid "off"
972
  msgstr ""
973
 
 
 
 
 
974
  #: includes/templates/rules/html-rules-engine.php:106
975
  msgid "Add rules as needed to create different email templates for different user bases. "
976
  msgstr ""
@@ -1028,415 +1024,415 @@ msgstr ""
1028
  msgid "Search & select one coupon code that customers should use to get a discount. Generated coupon code which will be sent in email reminder will have the settings of coupon selected in this option."
1029
  msgstr ""
1030
 
1031
- #: woocommerce-ac.php:311
1032
- #: woocommerce-ac.php:2224
1033
  msgid "Settings"
1034
  msgstr ""
1035
 
1036
- #: woocommerce-ac.php:340
1037
  msgid "Emails are not being sent to customers."
1038
  msgstr ""
1039
 
1040
- #: woocommerce-ac.php:346
1041
  msgid "Capturing of cart and other information was not satisfactory."
1042
  msgstr ""
1043
 
1044
- #: woocommerce-ac.php:352
1045
  msgid "I cannot see abandoned cart reminder emails records."
1046
  msgstr ""
1047
 
1048
- #: woocommerce-ac.php:358
1049
  msgid "I want to upgrade the plugin to the PRO version."
1050
  msgstr ""
1051
 
1052
- #: woocommerce-ac.php:481
1053
  msgid "HTML Email Template"
1054
  msgstr ""
1055
 
1056
- #: woocommerce-ac.php:487
1057
  msgid "Abandoned cart Email Template"
1058
  msgstr ""
1059
 
1060
- #: woocommerce-ac.php:761
1061
  msgid "Cart Abandonment Settings"
1062
  msgstr ""
1063
 
1064
- #: woocommerce-ac.php:768
1065
  msgid "Enable abandoned cart emails"
1066
  msgstr ""
1067
 
1068
- #: woocommerce-ac.php:772
1069
  msgid "Yes, enable the abandoned cart emails."
1070
  msgstr ""
1071
 
1072
- #: woocommerce-ac.php:777
1073
  msgid "Cart abandoned cut-off time"
1074
  msgstr ""
1075
 
1076
- #: woocommerce-ac.php:781
1077
  msgid "Consider cart abandoned after X minutes of item being added to cart & order not placed."
1078
  msgstr ""
1079
 
1080
- #: woocommerce-ac.php:786
1081
  msgid "Automatically Delete Abandoned Orders after X days"
1082
  msgstr ""
1083
 
1084
- #: woocommerce-ac.php:790
1085
  msgid "Automatically delete abandoned cart orders after X days."
1086
  msgstr ""
1087
 
1088
- #: woocommerce-ac.php:795
1089
  msgid "Email admin On Order Recovery"
1090
  msgstr ""
1091
 
1092
- #: woocommerce-ac.php:799
1093
  msgid "Sends email to Admin if an Abandoned Cart Order is recovered."
1094
  msgstr ""
1095
 
1096
- #: woocommerce-ac.php:804
1097
  msgid "Start tracking from Cart Page"
1098
  msgstr ""
1099
 
1100
- #: woocommerce-ac.php:808
1101
  msgid "Enable tracking of abandoned products & carts even if customer does not visit the checkout page or does not enter any details on the checkout page like Name or Email. Tracking will begin as soon as a visitor adds a product to their cart and visits the cart page."
1102
  msgstr ""
1103
 
1104
- #: woocommerce-ac.php:813
1105
  msgid "GDPR Settings"
1106
  msgstr ""
1107
 
1108
- #: woocommerce-ac.php:820
1109
  msgid "Enable GDPR Notice"
1110
  msgstr ""
1111
 
1112
- #: woocommerce-ac.php:824
1113
  msgid "Enable this setting to display a notice informing customers that their email and cart data are saved to send abandonment reminders."
1114
  msgstr ""
1115
 
1116
- #: woocommerce-ac.php:829
1117
  msgid "Message to be displayed for Guest users when tracking their carts"
1118
  msgstr ""
1119
 
1120
- #: woocommerce-ac.php:833
1121
  msgid "<br>In compliance with GDPR, add a message on the Checkout page to inform Guest users of how their data is being used.<br><i>For example: Your email address will help us support your shopping experience throughout the site. Please check our Privacy Policy to see how we use your personal data.</i>"
1122
  msgstr ""
1123
 
1124
- #: woocommerce-ac.php:838
1125
  msgid "Message to be displayed for registered users when tracking their carts."
1126
  msgstr ""
1127
 
1128
- #: woocommerce-ac.php:842
1129
  msgid "<br>In compliance with GDPR, add a message on the Shop & Product pages to inform Registered users of how their data is being used.<br><i>For example: Please check our Privacy Policy to see how we use your personal data.</i>"
1130
  msgstr ""
1131
 
1132
- #: woocommerce-ac.php:847
1133
  msgid "Allow the visitor to opt out of cart tracking."
1134
  msgstr ""
1135
 
1136
- #: woocommerce-ac.php:851
1137
  msgid "<br>In compliance with GDPR, allow the site visitor (guests & registered users) to opt out from cart tracking. This message will be displayed in conjunction with the GDPR message above.</i>"
1138
  msgstr ""
1139
 
1140
- #: woocommerce-ac.php:856
1141
  msgid "Message to be displayed when the user chooses to opt out of cart tracking."
1142
  msgstr ""
1143
 
1144
- #: woocommerce-ac.php:860
1145
  msgid "<br>Message to be displayed when the user chooses to opt out of cart tracking.</i>"
1146
  msgstr ""
1147
 
1148
- #: woocommerce-ac.php:864
1149
  msgid "Coupon Settings"
1150
  msgstr ""
1151
 
1152
- #: woocommerce-ac.php:870
1153
  msgid "Delete Coupons Automatically"
1154
  msgstr ""
1155
 
1156
- #: woocommerce-ac.php:874
1157
  msgid "Enable this setting if you want to completely remove the expired and used coupon code automatically every 15 days."
1158
  msgstr ""
1159
 
1160
- #: woocommerce-ac.php:878
1161
  msgid "Delete Coupons Manually"
1162
  msgstr ""
1163
 
1164
- #: woocommerce-ac.php:882
1165
  msgid "If you want to completely remove the expired and used coupon code now then click on \"Delete\" button."
1166
  msgstr ""
1167
 
1168
- #: woocommerce-ac.php:891
1169
  msgid "Settings for abandoned cart recovery emails"
1170
  msgstr ""
1171
 
1172
- #: woocommerce-ac.php:898
1173
  msgid "\"From\" Name"
1174
  msgstr ""
1175
 
1176
- #: woocommerce-ac.php:907
1177
  msgid "\"From\" Address"
1178
  msgstr ""
1179
 
1180
- #: woocommerce-ac.php:916
1181
  msgid "Send Reply Emails to"
1182
  msgstr ""
1183
 
1184
- #: woocommerce-ac.php:925
1185
  msgid "UTM parameters to be added to all the links in reminder emails"
1186
  msgstr ""
1187
 
1188
- #: woocommerce-ac.php:929
1189
  msgid "UTM parameters that should be added to all the links in reminder emails."
1190
  msgstr ""
1191
 
1192
- #: woocommerce-ac.php:1071
1193
  msgid "Abandoned cart cut off time should be numeric and has to be greater than 0."
1194
  msgstr ""
1195
 
1196
- #: woocommerce-ac.php:1088
1197
  msgid "Automatically Delete Abandoned Orders after X days has to be greater than 0."
1198
  msgstr ""
1199
 
1200
- #: woocommerce-ac.php:2203
1201
  msgid "Dashboard"
1202
  msgstr ""
1203
 
1204
- #: woocommerce-ac.php:2217
1205
  msgid "Email Templates"
1206
  msgstr ""
1207
 
1208
- #: woocommerce-ac.php:2231
1209
  msgid "Recovered Orders"
1210
  msgstr ""
1211
 
1212
- #: woocommerce-ac.php:2238
1213
  msgid "Product Report"
1214
  msgstr ""
1215
 
1216
- #: woocommerce-ac.php:2517
1217
  msgid "You do not have sufficient permissions to access this page."
1218
  msgstr ""
1219
 
1220
- #: woocommerce-ac.php:2521
1221
  msgid "WooCommerce - Abandon Cart Lite"
1222
  msgstr ""
1223
 
1224
- #: woocommerce-ac.php:2593
1225
  msgid "The Abandoned cart has been successfully deleted."
1226
  msgstr ""
1227
 
1228
- #: woocommerce-ac.php:2595
1229
  msgid "All Abandoned Carts have been successfully deleted."
1230
  msgstr ""
1231
 
1232
- #: woocommerce-ac.php:2597
1233
  msgid "All Visitor carts have been successfully deleted."
1234
  msgstr ""
1235
 
1236
- #: woocommerce-ac.php:2599
1237
  msgid "All Guest carts have been successfully deleted."
1238
  msgstr ""
1239
 
1240
- #: woocommerce-ac.php:2601
1241
  msgid "All Registered carts have been deleted."
1242
  msgstr ""
1243
 
1244
- #: woocommerce-ac.php:2612
1245
  msgid "The Template has been successfully deleted."
1246
  msgstr ""
1247
 
1248
- #: woocommerce-ac.php:2656
1249
  msgid "General Settings"
1250
  msgstr ""
1251
 
1252
- #: woocommerce-ac.php:2659
1253
  msgid "Email Sending Settings"
1254
  msgstr ""
1255
 
1256
- #: woocommerce-ac.php:2679
1257
- #: woocommerce-ac.php:2689
1258
  msgid "Change settings for sending email notifications to Customers, to Admin etc."
1259
  msgstr ""
1260
 
1261
- #: woocommerce-ac.php:2716
1262
  msgid "The list below shows all Abandoned Carts which have remained in cart for a time higher than the \"Cart abandoned cut-off time\" setting."
1263
  msgstr ""
1264
 
1265
- #: woocommerce-ac.php:2758
1266
  msgid "All "
1267
  msgstr ""
1268
 
1269
  #. translators: Users.
1270
- #: woocommerce-ac.php:2763
1271
  msgid "Registered %s"
1272
  msgstr ""
1273
 
1274
  #. translators: Users.
1275
- #: woocommerce-ac.php:2769
1276
  msgid "Guest %s"
1277
  msgstr ""
1278
 
1279
- #: woocommerce-ac.php:2775
1280
  msgid "Carts without Customer Details"
1281
  msgstr ""
1282
 
1283
- #: woocommerce-ac.php:2796
1284
  msgid "Add email templates at different intervals to maximize the possibility of recovering your abandoned carts."
1285
  msgstr ""
1286
 
1287
- #: woocommerce-ac.php:2936
1288
  msgid "The Email Template has been successfully added. In order to start sending this email to your customers, please activate it."
1289
  msgstr ""
1290
 
1291
- #: woocommerce-ac.php:2946
1292
  msgid "There was a problem adding the email template. Please contact the plugin author via <a href= \"https://wordpress.org/support/plugin/woocommerce-abandoned-cart\">support forum</a>."
1293
  msgstr ""
1294
 
1295
- #: woocommerce-ac.php:2958
1296
  msgid "The Email Template has been successfully updated."
1297
  msgstr ""
1298
 
1299
- #: woocommerce-ac.php:2968
1300
  msgid "There was a problem updating the email template. Please contact the plugin author via <a href= \"https://wordpress.org/support/plugin/woocommerce-abandoned-cart\">support forum</a>."
1301
  msgstr ""
1302
 
1303
- #: woocommerce-ac.php:2977
1304
  msgid "Add New Template"
1305
  msgstr ""
1306
 
1307
- #: woocommerce-ac.php:3049
1308
  msgid "The Report below shows how many Abandoned Carts we were able to recover for you by sending automatic emails to encourage shoppers."
1309
  msgstr ""
1310
 
1311
- #: woocommerce-ac.php:3100
1312
  msgid "Start Date:"
1313
  msgstr ""
1314
 
1315
- #: woocommerce-ac.php:3102
1316
  msgid "End Date:"
1317
  msgstr ""
1318
 
1319
  #. translators: Abandoned & recovered numbers and order totals.
1320
- #: woocommerce-ac.php:3122
1321
  msgid "During the selected range <strong>%1$d</strong> carts totaling <strong>%2$s</strong> were abandoned. We were able to recover <strong>%3$d</strong> of them, which led to an extra <strong>%4$s</strong>"
1322
  msgstr ""
1323
 
1324
  #. translators: Abandoned Order ID.
1325
- #: woocommerce-ac.php:3147
1326
  msgid "Abandoned Order #%s Details"
1327
  msgstr ""
1328
 
1329
- #: woocommerce-ac.php:3155
1330
  msgid "Line Total"
1331
  msgstr ""
1332
 
1333
- #: woocommerce-ac.php:3380
1334
  msgid "Customer Details"
1335
  msgstr ""
1336
 
1337
- #: woocommerce-ac.php:3384
1338
  msgid "Billing Details"
1339
  msgstr ""
1340
 
1341
- #: woocommerce-ac.php:3385
1342
  msgid "Name:"
1343
  msgstr ""
1344
 
1345
- #: woocommerce-ac.php:3388
1346
- #: woocommerce-ac.php:3409
1347
  msgid "Address:"
1348
  msgstr ""
1349
 
1350
- #: woocommerce-ac.php:3399
1351
  msgid "Email:"
1352
  msgstr ""
1353
 
1354
- #: woocommerce-ac.php:3403
1355
  msgid "Phone:"
1356
  msgstr ""
1357
 
1358
- #: woocommerce-ac.php:3408
1359
  msgid "Shipping Details"
1360
  msgstr ""
1361
 
1362
- #: woocommerce-ac.php:3418
1363
  msgid "Shipping Address same as Billing Address"
1364
  msgstr ""
1365
 
1366
- #: woocommerce-ac.php:3431
1367
  msgid "Shipping Charges"
1368
  msgstr ""
1369
 
1370
- #: woocommerce-ac.php:3515
1371
  msgid "Template Name:"
1372
  msgstr ""
1373
 
1374
- #: woocommerce-ac.php:3525
1375
  msgid "Enter a template name for reference"
1376
  msgstr ""
1377
 
1378
- #: woocommerce-ac.php:3531
1379
  msgid "Subject:"
1380
  msgstr ""
1381
 
1382
- #: woocommerce-ac.php:3541
1383
  msgid "Enter the subject that should appear in the email sent"
1384
  msgstr ""
1385
 
1386
- #: woocommerce-ac.php:3547
1387
  msgid "Email Body:"
1388
  msgstr ""
1389
 
1390
- #: woocommerce-ac.php:3574
1391
  msgid "Message to be sent in the reminder email."
1392
  msgstr ""
1393
 
1394
- #: woocommerce-ac.php:3601
1395
  msgid "Use WooCommerce Template Style:"
1396
  msgstr ""
1397
 
1398
- #: woocommerce-ac.php:3624
1399
  msgid "Email Template Header Text: "
1400
  msgstr ""
1401
 
1402
- #: woocommerce-ac.php:3639
1403
  msgid "Enter the header which will appear in the abandoned WooCommerce email sent. This is only applicable when only used when \"Use WooCommerce Template Style:\" is checked."
1404
  msgstr ""
1405
 
1406
- #: woocommerce-ac.php:3645
1407
  msgid "Send this email:"
1408
  msgstr ""
1409
 
1410
- #: woocommerce-ac.php:3687
1411
  msgid "after cart is abandoned."
1412
  msgstr ""
1413
 
1414
- #: woocommerce-ac.php:3694
1415
  msgid "Send a test email to:"
1416
  msgstr ""
1417
 
1418
- #: woocommerce-ac.php:3703
1419
  msgid "Enter the email id to which the test email needs to be sent."
1420
  msgstr ""
1421
 
1422
- #: woocommerce-ac.php:3717
1423
  msgid "Update Changes"
1424
  msgstr ""
1425
 
1426
- #: woocommerce-ac.php:3743
1427
  msgid "If you love <strong>Abandoned Cart Lite for WooCommerce</strong>, then please leave us a <a href=\"https://wordpress.org/support/plugin/woocommerce-abandoned-cart/reviews/?rate=5#new-post\" target=\"_blank\" class=\"ac-rating-link\" data-rated=\"Thanks :)\">★★★★★</a> rating. Thank you in advance. :)"
1428
  msgstr ""
1429
 
1430
- #: woocommerce-ac.php:3795
1431
  msgid "Please enter a valid email."
1432
  msgstr ""
1433
 
1434
- #: woocommerce-ac.php:3981
1435
- #: woocommerce-ac.php:4016
1436
  msgid "Men's Formal Shoes"
1437
  msgstr ""
1438
 
1439
- #: woocommerce-ac.php:3988
1440
- #: woocommerce-ac.php:4023
1441
  msgid "Woman's Hand Bags"
1442
  msgstr ""
2
  # This file is distributed under the same license as the Abandoned Cart Lite for WooCommerce plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Abandoned Cart Lite for WooCommerce 5.13.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/woocommerce-abandoned-cart\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-08-23T05:46:09+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: woocommerce-abandoned-cart\n"
38
  msgid "Abandoned cart reminder"
39
  msgstr ""
40
 
41
+ #: cron/class-wcal-cron.php:300
42
+ #: woocommerce-ac.php:3174
43
+ #: woocommerce-ac.php:4024
44
+ #: woocommerce-ac.php:4059
45
+ msgid "Item"
46
  msgstr ""
47
 
48
+ #: cron/class-wcal-cron.php:301
49
+ #: woocommerce-ac.php:3175
50
+ #: woocommerce-ac.php:4025
51
+ #: woocommerce-ac.php:4060
52
+ msgid "Name"
53
  msgstr ""
54
 
55
+ #: cron/class-wcal-cron.php:302
56
+ #: woocommerce-ac.php:3176
57
+ #: woocommerce-ac.php:4026
58
+ #: woocommerce-ac.php:4061
59
+ msgid "Quantity"
60
  msgstr ""
61
 
62
+ #: cron/class-wcal-cron.php:303
63
+ #: woocommerce-ac.php:4027
64
+ #: woocommerce-ac.php:4062
65
+ msgid "Price"
 
66
  msgstr ""
67
 
68
+ #: cron/class-wcal-cron.php:304
69
+ #: woocommerce-ac.php:3177
70
+ #: woocommerce-ac.php:4028
71
+ #: woocommerce-ac.php:4063
72
+ msgid "Line Subtotal"
 
73
  msgstr ""
74
 
75
+ #: cron/class-wcal-cron.php:309
76
+ #: cron/class-wcal-cron.php:320
77
+ #: woocommerce-ac.php:4022
78
+ #: woocommerce-ac.php:4056
79
+ msgid "Your Shopping Cart"
 
80
  msgstr ""
81
 
82
+ #: cron/class-wcal-cron.php:346
83
+ #: cron/class-wcal-cron.php:378
84
  msgid "SKU: "
85
  msgstr ""
86
 
87
+ #: cron/class-wcal-cron.php:430
88
+ #: woocommerce-ac.php:4048
89
+ #: woocommerce-ac.php:4083
90
  msgid "Cart Total:"
91
  msgstr ""
92
 
93
+ #: cron/class-wcal-cron.php:442
94
  msgid "Product no longer exists"
95
  msgstr ""
96
 
 
 
 
 
 
 
97
  #. translators: Cart ID.
98
  #: includes/admin/class-wcal-abandoned-cart-details.php:437
99
  msgid "Cart #%s"
123
  msgstr ""
124
 
125
  #: includes/admin/class-wcal-personal-data-export.php:137
126
+ #: woocommerce-ac.php:1354
127
  msgid "Abandoned Carts"
128
  msgstr ""
129
 
190
  #: includes/admin/class-wcap-add-cart-popup-modal.php:84
191
  #: includes/admin/class-wcap-pro-settings.php:66
192
  #: includes/admin/class-wcap-pro-settings.php:299
193
+ #: woocommerce-ac.php:3744
194
  msgid "Save Changes"
195
  msgstr ""
196
 
700
  " <strong><a target=\"_blank\" href= \"%s\">Purchase now</a></strong> & Grab 20% discount with the code \"DFWP20\". The discount code is valid only for the first 20 customers."
701
  msgstr ""
702
 
703
+ #: includes/class-wcal-common.php:679
704
  msgid "Database Updated Successfully"
705
  msgstr ""
706
 
707
+ #: includes/class-wcal-common.php:694
708
  msgid "Database Update Failed. Please try again after sometime"
709
  msgstr ""
710
 
711
+ #: includes/class-wcal-common.php:854
712
  msgid "This product no longer exists"
713
  msgstr ""
714
 
814
  msgstr ""
815
 
816
  #: includes/classes/class-wcal-dashboard-report.php:161
817
+ #: woocommerce-ac.php:2217
818
  msgid "Abandoned Orders"
819
  msgstr ""
820
 
879
  msgstr ""
880
 
881
  #: includes/classes/class-wcal-dashboard-report.php:319
882
+ #: woocommerce-ac.php:3127
883
  msgid "Go"
884
  msgstr ""
885
 
963
  msgid "off"
964
  msgstr ""
965
 
966
+ #: includes/frontend/class-wcal-checkout-process.php:216
967
+ msgid "This order was abandoned & subsequently recovered."
968
+ msgstr ""
969
+
970
  #: includes/templates/rules/html-rules-engine.php:106
971
  msgid "Add rules as needed to create different email templates for different user bases. "
972
  msgstr ""
1024
  msgid "Search & select one coupon code that customers should use to get a discount. Generated coupon code which will be sent in email reminder will have the settings of coupon selected in this option."
1025
  msgstr ""
1026
 
1027
+ #: woocommerce-ac.php:313
1028
+ #: woocommerce-ac.php:2231
1029
  msgid "Settings"
1030
  msgstr ""
1031
 
1032
+ #: woocommerce-ac.php:342
1033
  msgid "Emails are not being sent to customers."
1034
  msgstr ""
1035
 
1036
+ #: woocommerce-ac.php:348
1037
  msgid "Capturing of cart and other information was not satisfactory."
1038
  msgstr ""
1039
 
1040
+ #: woocommerce-ac.php:354
1041
  msgid "I cannot see abandoned cart reminder emails records."
1042
  msgstr ""
1043
 
1044
+ #: woocommerce-ac.php:360
1045
  msgid "I want to upgrade the plugin to the PRO version."
1046
  msgstr ""
1047
 
1048
+ #: woocommerce-ac.php:483
1049
  msgid "HTML Email Template"
1050
  msgstr ""
1051
 
1052
+ #: woocommerce-ac.php:489
1053
  msgid "Abandoned cart Email Template"
1054
  msgstr ""
1055
 
1056
+ #: woocommerce-ac.php:764
1057
  msgid "Cart Abandonment Settings"
1058
  msgstr ""
1059
 
1060
+ #: woocommerce-ac.php:771
1061
  msgid "Enable abandoned cart emails"
1062
  msgstr ""
1063
 
1064
+ #: woocommerce-ac.php:775
1065
  msgid "Yes, enable the abandoned cart emails."
1066
  msgstr ""
1067
 
1068
+ #: woocommerce-ac.php:780
1069
  msgid "Cart abandoned cut-off time"
1070
  msgstr ""
1071
 
1072
+ #: woocommerce-ac.php:784
1073
  msgid "Consider cart abandoned after X minutes of item being added to cart & order not placed."
1074
  msgstr ""
1075
 
1076
+ #: woocommerce-ac.php:789
1077
  msgid "Automatically Delete Abandoned Orders after X days"
1078
  msgstr ""
1079
 
1080
+ #: woocommerce-ac.php:793
1081
  msgid "Automatically delete abandoned cart orders after X days."
1082
  msgstr ""
1083
 
1084
+ #: woocommerce-ac.php:798
1085
  msgid "Email admin On Order Recovery"
1086
  msgstr ""
1087
 
1088
+ #: woocommerce-ac.php:802
1089
  msgid "Sends email to Admin if an Abandoned Cart Order is recovered."
1090
  msgstr ""
1091
 
1092
+ #: woocommerce-ac.php:807
1093
  msgid "Start tracking from Cart Page"
1094
  msgstr ""
1095
 
1096
+ #: woocommerce-ac.php:811
1097
  msgid "Enable tracking of abandoned products & carts even if customer does not visit the checkout page or does not enter any details on the checkout page like Name or Email. Tracking will begin as soon as a visitor adds a product to their cart and visits the cart page."
1098
  msgstr ""
1099
 
1100
+ #: woocommerce-ac.php:816
1101
  msgid "GDPR Settings"
1102
  msgstr ""
1103
 
1104
+ #: woocommerce-ac.php:823
1105
  msgid "Enable GDPR Notice"
1106
  msgstr ""
1107
 
1108
+ #: woocommerce-ac.php:827
1109
  msgid "Enable this setting to display a notice informing customers that their email and cart data are saved to send abandonment reminders."
1110
  msgstr ""
1111
 
1112
+ #: woocommerce-ac.php:832
1113
  msgid "Message to be displayed for Guest users when tracking their carts"
1114
  msgstr ""
1115
 
1116
+ #: woocommerce-ac.php:836
1117
  msgid "<br>In compliance with GDPR, add a message on the Checkout page to inform Guest users of how their data is being used.<br><i>For example: Your email address will help us support your shopping experience throughout the site. Please check our Privacy Policy to see how we use your personal data.</i>"
1118
  msgstr ""
1119
 
1120
+ #: woocommerce-ac.php:841
1121
  msgid "Message to be displayed for registered users when tracking their carts."
1122
  msgstr ""
1123
 
1124
+ #: woocommerce-ac.php:845
1125
  msgid "<br>In compliance with GDPR, add a message on the Shop & Product pages to inform Registered users of how their data is being used.<br><i>For example: Please check our Privacy Policy to see how we use your personal data.</i>"
1126
  msgstr ""
1127
 
1128
+ #: woocommerce-ac.php:850
1129
  msgid "Allow the visitor to opt out of cart tracking."
1130
  msgstr ""
1131
 
1132
+ #: woocommerce-ac.php:854
1133
  msgid "<br>In compliance with GDPR, allow the site visitor (guests & registered users) to opt out from cart tracking. This message will be displayed in conjunction with the GDPR message above.</i>"
1134
  msgstr ""
1135
 
1136
+ #: woocommerce-ac.php:859
1137
  msgid "Message to be displayed when the user chooses to opt out of cart tracking."
1138
  msgstr ""
1139
 
1140
+ #: woocommerce-ac.php:863
1141
  msgid "<br>Message to be displayed when the user chooses to opt out of cart tracking.</i>"
1142
  msgstr ""
1143
 
1144
+ #: woocommerce-ac.php:867
1145
  msgid "Coupon Settings"
1146
  msgstr ""
1147
 
1148
+ #: woocommerce-ac.php:873
1149
  msgid "Delete Coupons Automatically"
1150
  msgstr ""
1151
 
1152
+ #: woocommerce-ac.php:877
1153
  msgid "Enable this setting if you want to completely remove the expired and used coupon code automatically every 15 days."
1154
  msgstr ""
1155
 
1156
+ #: woocommerce-ac.php:881
1157
  msgid "Delete Coupons Manually"
1158
  msgstr ""
1159
 
1160
+ #: woocommerce-ac.php:885
1161
  msgid "If you want to completely remove the expired and used coupon code now then click on \"Delete\" button."
1162
  msgstr ""
1163
 
1164
+ #: woocommerce-ac.php:894
1165
  msgid "Settings for abandoned cart recovery emails"
1166
  msgstr ""
1167
 
1168
+ #: woocommerce-ac.php:901
1169
  msgid "\"From\" Name"
1170
  msgstr ""
1171
 
1172
+ #: woocommerce-ac.php:910
1173
  msgid "\"From\" Address"
1174
  msgstr ""
1175
 
1176
+ #: woocommerce-ac.php:919
1177
  msgid "Send Reply Emails to"
1178
  msgstr ""
1179
 
1180
+ #: woocommerce-ac.php:928
1181
  msgid "UTM parameters to be added to all the links in reminder emails"
1182
  msgstr ""
1183
 
1184
+ #: woocommerce-ac.php:932
1185
  msgid "UTM parameters that should be added to all the links in reminder emails."
1186
  msgstr ""
1187
 
1188
+ #: woocommerce-ac.php:1074
1189
  msgid "Abandoned cart cut off time should be numeric and has to be greater than 0."
1190
  msgstr ""
1191
 
1192
+ #: woocommerce-ac.php:1092
1193
  msgid "Automatically Delete Abandoned Orders after X days has to be greater than 0."
1194
  msgstr ""
1195
 
1196
+ #: woocommerce-ac.php:2210
1197
  msgid "Dashboard"
1198
  msgstr ""
1199
 
1200
+ #: woocommerce-ac.php:2224
1201
  msgid "Email Templates"
1202
  msgstr ""
1203
 
1204
+ #: woocommerce-ac.php:2238
1205
  msgid "Recovered Orders"
1206
  msgstr ""
1207
 
1208
+ #: woocommerce-ac.php:2245
1209
  msgid "Product Report"
1210
  msgstr ""
1211
 
1212
+ #: woocommerce-ac.php:2524
1213
  msgid "You do not have sufficient permissions to access this page."
1214
  msgstr ""
1215
 
1216
+ #: woocommerce-ac.php:2528
1217
  msgid "WooCommerce - Abandon Cart Lite"
1218
  msgstr ""
1219
 
1220
+ #: woocommerce-ac.php:2600
1221
  msgid "The Abandoned cart has been successfully deleted."
1222
  msgstr ""
1223
 
1224
+ #: woocommerce-ac.php:2602
1225
  msgid "All Abandoned Carts have been successfully deleted."
1226
  msgstr ""
1227
 
1228
+ #: woocommerce-ac.php:2604
1229
  msgid "All Visitor carts have been successfully deleted."
1230
  msgstr ""
1231
 
1232
+ #: woocommerce-ac.php:2606
1233
  msgid "All Guest carts have been successfully deleted."
1234
  msgstr ""
1235
 
1236
+ #: woocommerce-ac.php:2608
1237
  msgid "All Registered carts have been deleted."
1238
  msgstr ""
1239
 
1240
+ #: woocommerce-ac.php:2619
1241
  msgid "The Template has been successfully deleted."
1242
  msgstr ""
1243
 
1244
+ #: woocommerce-ac.php:2663
1245
  msgid "General Settings"
1246
  msgstr ""
1247
 
1248
+ #: woocommerce-ac.php:2666
1249
  msgid "Email Sending Settings"
1250
  msgstr ""
1251
 
1252
+ #: woocommerce-ac.php:2686
1253
+ #: woocommerce-ac.php:2696
1254
  msgid "Change settings for sending email notifications to Customers, to Admin etc."
1255
  msgstr ""
1256
 
1257
+ #: woocommerce-ac.php:2723
1258
  msgid "The list below shows all Abandoned Carts which have remained in cart for a time higher than the \"Cart abandoned cut-off time\" setting."
1259
  msgstr ""
1260
 
1261
+ #: woocommerce-ac.php:2765
1262
  msgid "All "
1263
  msgstr ""
1264
 
1265
  #. translators: Users.
1266
+ #: woocommerce-ac.php:2770
1267
  msgid "Registered %s"
1268
  msgstr ""
1269
 
1270
  #. translators: Users.
1271
+ #: woocommerce-ac.php:2776
1272
  msgid "Guest %s"
1273
  msgstr ""
1274
 
1275
+ #: woocommerce-ac.php:2782
1276
  msgid "Carts without Customer Details"
1277
  msgstr ""
1278
 
1279
+ #: woocommerce-ac.php:2803
1280
  msgid "Add email templates at different intervals to maximize the possibility of recovering your abandoned carts."
1281
  msgstr ""
1282
 
1283
+ #: woocommerce-ac.php:2959
1284
  msgid "The Email Template has been successfully added. In order to start sending this email to your customers, please activate it."
1285
  msgstr ""
1286
 
1287
+ #: woocommerce-ac.php:2969
1288
  msgid "There was a problem adding the email template. Please contact the plugin author via <a href= \"https://wordpress.org/support/plugin/woocommerce-abandoned-cart\">support forum</a>."
1289
  msgstr ""
1290
 
1291
+ #: woocommerce-ac.php:2981
1292
  msgid "The Email Template has been successfully updated."
1293
  msgstr ""
1294
 
1295
+ #: woocommerce-ac.php:2991
1296
  msgid "There was a problem updating the email template. Please contact the plugin author via <a href= \"https://wordpress.org/support/plugin/woocommerce-abandoned-cart\">support forum</a>."
1297
  msgstr ""
1298
 
1299
+ #: woocommerce-ac.php:3000
1300
  msgid "Add New Template"
1301
  msgstr ""
1302
 
1303
+ #: woocommerce-ac.php:3072
1304
  msgid "The Report below shows how many Abandoned Carts we were able to recover for you by sending automatic emails to encourage shoppers."
1305
  msgstr ""
1306
 
1307
+ #: woocommerce-ac.php:3123
1308
  msgid "Start Date:"
1309
  msgstr ""
1310
 
1311
+ #: woocommerce-ac.php:3125
1312
  msgid "End Date:"
1313
  msgstr ""
1314
 
1315
  #. translators: Abandoned & recovered numbers and order totals.
1316
+ #: woocommerce-ac.php:3145
1317
  msgid "During the selected range <strong>%1$d</strong> carts totaling <strong>%2$s</strong> were abandoned. We were able to recover <strong>%3$d</strong> of them, which led to an extra <strong>%4$s</strong>"
1318
  msgstr ""
1319
 
1320
  #. translators: Abandoned Order ID.
1321
+ #: woocommerce-ac.php:3170
1322
  msgid "Abandoned Order #%s Details"
1323
  msgstr ""
1324
 
1325
+ #: woocommerce-ac.php:3178
1326
  msgid "Line Total"
1327
  msgstr ""
1328
 
1329
+ #: woocommerce-ac.php:3403
1330
  msgid "Customer Details"
1331
  msgstr ""
1332
 
1333
+ #: woocommerce-ac.php:3407
1334
  msgid "Billing Details"
1335
  msgstr ""
1336
 
1337
+ #: woocommerce-ac.php:3408
1338
  msgid "Name:"
1339
  msgstr ""
1340
 
1341
+ #: woocommerce-ac.php:3411
1342
+ #: woocommerce-ac.php:3432
1343
  msgid "Address:"
1344
  msgstr ""
1345
 
1346
+ #: woocommerce-ac.php:3422
1347
  msgid "Email:"
1348
  msgstr ""
1349
 
1350
+ #: woocommerce-ac.php:3426
1351
  msgid "Phone:"
1352
  msgstr ""
1353
 
1354
+ #: woocommerce-ac.php:3431
1355
  msgid "Shipping Details"
1356
  msgstr ""
1357
 
1358
+ #: woocommerce-ac.php:3441
1359
  msgid "Shipping Address same as Billing Address"
1360
  msgstr ""
1361
 
1362
+ #: woocommerce-ac.php:3454
1363
  msgid "Shipping Charges"
1364
  msgstr ""
1365
 
1366
+ #: woocommerce-ac.php:3538
1367
  msgid "Template Name:"
1368
  msgstr ""
1369
 
1370
+ #: woocommerce-ac.php:3548
1371
  msgid "Enter a template name for reference"
1372
  msgstr ""
1373
 
1374
+ #: woocommerce-ac.php:3554
1375
  msgid "Subject:"
1376
  msgstr ""
1377
 
1378
+ #: woocommerce-ac.php:3564
1379
  msgid "Enter the subject that should appear in the email sent"
1380
  msgstr ""
1381
 
1382
+ #: woocommerce-ac.php:3570
1383
  msgid "Email Body:"
1384
  msgstr ""
1385
 
1386
+ #: woocommerce-ac.php:3597
1387
  msgid "Message to be sent in the reminder email."
1388
  msgstr ""
1389
 
1390
+ #: woocommerce-ac.php:3624
1391
  msgid "Use WooCommerce Template Style:"
1392
  msgstr ""
1393
 
1394
+ #: woocommerce-ac.php:3647
1395
  msgid "Email Template Header Text: "
1396
  msgstr ""
1397
 
1398
+ #: woocommerce-ac.php:3662
1399
  msgid "Enter the header which will appear in the abandoned WooCommerce email sent. This is only applicable when only used when \"Use WooCommerce Template Style:\" is checked."
1400
  msgstr ""
1401
 
1402
+ #: woocommerce-ac.php:3668
1403
  msgid "Send this email:"
1404
  msgstr ""
1405
 
1406
+ #: woocommerce-ac.php:3710
1407
  msgid "after cart is abandoned."
1408
  msgstr ""
1409
 
1410
+ #: woocommerce-ac.php:3717
1411
  msgid "Send a test email to:"
1412
  msgstr ""
1413
 
1414
+ #: woocommerce-ac.php:3726
1415
  msgid "Enter the email id to which the test email needs to be sent."
1416
  msgstr ""
1417
 
1418
+ #: woocommerce-ac.php:3740
1419
  msgid "Update Changes"
1420
  msgstr ""
1421
 
1422
+ #: woocommerce-ac.php:3766
1423
  msgid "If you love <strong>Abandoned Cart Lite for WooCommerce</strong>, then please leave us a <a href=\"https://wordpress.org/support/plugin/woocommerce-abandoned-cart/reviews/?rate=5#new-post\" target=\"_blank\" class=\"ac-rating-link\" data-rated=\"Thanks :)\">★★★★★</a> rating. Thank you in advance. :)"
1424
  msgstr ""
1425
 
1426
+ #: woocommerce-ac.php:3818
1427
  msgid "Please enter a valid email."
1428
  msgstr ""
1429
 
1430
+ #: woocommerce-ac.php:4032
1431
+ #: woocommerce-ac.php:4067
1432
  msgid "Men's Formal Shoes"
1433
  msgstr ""
1434
 
1435
+ #: woocommerce-ac.php:4039
1436
+ #: woocommerce-ac.php:4074
1437
  msgid "Woman's Hand Bags"
1438
  msgstr ""
includes/class-wcal-common.php CHANGED
@@ -218,7 +218,7 @@ class wcal_common { // phpcs:ignore
218
  global $wpdb;
219
  $wcal_email_templates_count = 0;
220
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
221
- $wcal_email_templates_results = $wpdb->get_results( 'SELECT id, is_active, is_wc_template,frequency, day_or_hour FROM `' . $wpdb->prefix . 'ac_email_templates_lite`' );
222
 
223
  $wcal_email_templates_count = count( $wcal_email_templates_results );
224
 
@@ -237,10 +237,12 @@ class wcal_common { // phpcs:ignore
237
  )
238
  );
239
 
240
- $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['is_activate'] = ( 1 === $wcal_email_templates_results_value->is_active ) ? 'Active' : 'Deactive';
241
- $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['is_wc_template'] = ( 1 === $wcal_email_templates_results_value->is_wc_template ) ? 'Yes' : 'No';
242
- $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['template_time'] = $wcal_template_time;
243
- $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['total_email_sent'] = $wcal_template_sent_count;
 
 
244
  }
245
 
246
  return $wcal_templates_data;
@@ -450,9 +452,12 @@ class wcal_common { // phpcs:ignore
450
  private static function wcal_ts_get_all_plugin_options_values() {
451
 
452
  return array(
453
- 'wcal_cart_cut_off_time' => get_option( 'ac_lite_cart_abandoned_time' ),
454
- 'wcal_admin_recovery_email' => get_option( 'ac_lite_email_admin_on_recovery' ),
455
- 'wcal_capture_visitors_cart' => get_option( 'ac_lite_track_guest_cart_from_cart_page' ),
 
 
 
456
  );
457
  }
458
 
218
  global $wpdb;
219
  $wcal_email_templates_count = 0;
220
  // phpcs:ignore WordPress.DB.DirectDatabaseQuery
221
+ $wcal_email_templates_results = $wpdb->get_results( 'SELECT id, is_active, is_wc_template,frequency, day_or_hour, coupon_code, generate_unique_coupon_code FROM `' . $wpdb->prefix . 'ac_email_templates_lite`' );
222
 
223
  $wcal_email_templates_count = count( $wcal_email_templates_results );
224
 
237
  )
238
  );
239
 
240
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['is_activate'] = ( 1 === $wcal_email_templates_results_value->is_active ) ? 'Active' : 'Deactive';
241
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['is_wc_template'] = ( 1 === $wcal_email_templates_results_value->is_wc_template ) ? 'Yes' : 'No';
242
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['template_time'] = $wcal_template_time;
243
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['total_email_sent'] = $wcal_template_sent_count;
244
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['coupon_code'] = $wcal_email_templates_results_value->coupon_code;
245
+ $wcal_templates_data [ 'template_id_' . $wcal_email_templates_results_value->id ] ['generate_unique_coupon_code'] = $wcal_email_templates_results_value->generate_unique_coupon_code;
246
  }
247
 
248
  return $wcal_templates_data;
452
  private static function wcal_ts_get_all_plugin_options_values() {
453
 
454
  return array(
455
+ 'wcal_cart_cut_off_time' => get_option( 'ac_lite_cart_abandoned_time' ),
456
+ 'wcal_admin_recovery_email' => get_option( 'ac_lite_email_admin_on_recovery' ),
457
+ 'wcal_capture_visitors_cart' => get_option( 'ac_lite_track_guest_cart_from_cart_page' ),
458
+ 'wcal_delete_abandoned_order_days' => get_option( 'ac_lite_delete_abandoned_order_days' ),
459
+ 'wcal_enable_gdpr_consent' => get_option( 'wcal_enable_gdpr_consent' ),
460
+ 'wcal_delete_coupon_data' => get_option( 'wcal_delete_coupon_data' ),
461
  );
462
  }
463
 
includes/class-wcal-default-template-settings.php CHANGED
@@ -41,8 +41,9 @@ class Wcal_Default_Template_Settings {
41
  $wpdb->query(
42
  $wpdb->prepare(
43
  'INSERT INTO `' . $db_prefix . 'ac_email_templates_lite`
44
- ( subject, body, is_active, frequency, day_or_hour, template_name, is_wc_template, default_template, wc_email_header )
45
- VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s )',
 
46
  $template_subject_array,
47
  $body_content_array,
48
  $active_post_array,
41
  $wpdb->query(
42
  $wpdb->prepare(
43
  'INSERT INTO `' . $db_prefix . 'ac_email_templates_lite`
44
+ ( email_type, subject, body, is_active, frequency, day_or_hour, template_name, is_wc_template, default_template, wc_email_header )
45
+ VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s )',
46
+ 'abandoned_cart_email',
47
  $template_subject_array,
48
  $body_content_array,
49
  $active_post_array,
includes/class-wcal-delete-handler.php CHANGED
@@ -168,7 +168,10 @@ class Wcal_Delete_Handler {
168
  public static function wcal_delete_abandoned_carts_after_x_days() {
169
  global $wpdb;
170
 
171
- $delete_ac_after_days = get_option( 'ac_lite_delete_abandoned_order_days' );
 
 
 
172
  if ( '' !== $delete_ac_after_days && 0 !== $delete_ac_after_days ) {
173
 
174
  $delete_ac_after_days_time = $delete_ac_after_days * 86400;
168
  public static function wcal_delete_abandoned_carts_after_x_days() {
169
  global $wpdb;
170
 
171
+ $delete_ac_after_days = get_option( 'ac_lite_delete_abandoned_order_days', 365 );
172
+ if ( 0 === $delete_ac_after_days || '' === $delete_ac_after_days ) { // If for some reason, it is blanks or 0, reset it to 365.
173
+ $delete_ac_after_days = '365';
174
+ }
175
  if ( '' !== $delete_ac_after_days && 0 !== $delete_ac_after_days ) {
176
 
177
  $delete_ac_after_days_time = $delete_ac_after_days * 86400;
includes/classes/class-wcal-dashboard-report.php CHANGED
@@ -452,7 +452,8 @@ if ( ! class_exists( 'Wcal_Dashoard_Report' ) ) {
452
  self::$recovered_count = count( $ids );
453
 
454
  foreach ( $ids as $order_id ) {
455
- $amount += get_post_meta( $order_id, '_order_total', true );
 
456
  }
457
  }
458
  return $amount;
452
  self::$recovered_count = count( $ids );
453
 
454
  foreach ( $ids as $order_id ) {
455
+ $order_total = (float) get_post_meta( $order_id, '_order_total', true );
456
+ $amount += round( $order_total, 2 );
457
  }
458
  }
459
  return $amount;
includes/classes/class-wcal-product-report-table.php CHANGED
@@ -177,7 +177,7 @@ class WCAL_Product_Report_Table extends WP_List_Table {
177
  foreach ( $chunck_array_value as $k => $v ) {
178
  $return_product_report[ $i ] = new stdClass();
179
  $prod_name = get_post( $k );
180
- if ( null !== $prod_name || '' !== $prod_name ) {
181
  $product_name = $prod_name->post_title;
182
  $abandoned_count = $v;
183
  $recover = array_count_values( $recover_product_array );
177
  foreach ( $chunck_array_value as $k => $v ) {
178
  $return_product_report[ $i ] = new stdClass();
179
  $prod_name = get_post( $k );
180
+ if ( $prod_name ) {
181
  $product_name = $prod_name->post_title;
182
  $abandoned_count = $v;
183
  $recover = array_count_values( $recover_product_array );
includes/frontend/class-wcal-checkout-process.php CHANGED
@@ -325,7 +325,8 @@ if ( ! class_exists( 'Wcal_Checkout_Process' ) ) {
325
  $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
326
  $email_subject = __( 'New Customer Order - Recovered', 'woocommerce' );
327
  $user_email = get_option( 'admin_email' );
328
- $headers[] = 'From: Admin <' . $user_email . '>';
 
329
  $headers[] = 'Content-Type: text/html';
330
  $user_email = apply_filters( 'wcal_send_recovery_email_to', $user_email );
331
  // Buffer.
325
  $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
326
  $email_subject = __( 'New Customer Order - Recovered', 'woocommerce' );
327
  $user_email = get_option( 'admin_email' );
328
+ $send_to = apply_filters( 'wcal_recovery_email_from', $user_email );
329
+ $headers[] = 'From: Admin <' . $send_to . '>';
330
  $headers[] = 'Content-Type: text/html';
331
  $user_email = apply_filters( 'wcal_send_recovery_email_to', $user_email );
332
  // Buffer.
readme.txt CHANGED
@@ -1,144 +1,77 @@
1
  
2
  === Abandoned Cart Lite for WooCommerce ===
3
- Contributors: ashokrane, pinal.shah, chetnapatel, tychesoftwares, dhruvin
4
- Tags: cart abandonment, abandon cart, cart recovery, recover woocommerce cart, increase woocommerce conversion rate, increase sales with woocommerce
5
  Author URI: https://www.tychesoftwares.com/
6
  Requires at least: 1.3
7
- Tested up to: 5.9
8
  Stable tag: trunk
9
  Requires PHP: 5.6
10
  License: GPLv2 or late
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
  Donate link: https://www.paypal.me/TycheSoftwares
13
 
14
- This easy-to-use plugin allows WooCommerce store owners to recover sales that are lost to abandoned shopping carts by customers.
15
-
16
  == Description ==
17
 
18
- With the average shopping cart abandonment rate as high as 70%, [Abandoned Cart Plugin](https://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/?utm_source=wprepo&utm_medium=topprolink&utm_campaign=AbandonedCartLite) helps you recover those carts from your WooCommerce shop.
19
-
20
- It works in the background, sending email notifications to your guests customers & logged-in customers, reminding them about their abandoned orders.
21
-
22
- 70% abandonment rate means that out of 100 potential customers, more than 70 of them are leaving without transacting on the store. Email Remarketing has proven to recover on average between 20-25% of abandoned shopping carts.
23
-
24
- > This plugin works as described: the **lite version doesn't cut down in functionality**. **You can have your orders recovered and save on sales**. Depending on what you are selling, this can be a few orders to **justify ordering the full package - i'm only a few away!**
25
-
26
- >**Very recommended!**
27
- > - [jaysnl](https://wordpress.org/support/topic/great-support-and-value-buy-it/)
28
-
29
- The Abandoned Cart plugin allows you to recover orders that were just a step away from closing. It enables you to create automatic & well-timed email reminders to be sent to your customers who have added your products to their cart, but did not complete the order. As a result, with this plugin you will start recovering at least 30% or more of your lost sales. Why let this 30% revenue go unclaimed?
30
-
31
- Abandoned Cart Lite plugin enables to do the following things:
32
-
33
- 1. Allow your customers to recover their abandoned carts in a **single click**.
34
- 2. Identify the **Abandoned Orders information**, including the products that were abandoned.
35
- 3. The plugin now captures abandoned **guest carts**. A guest user's cart will be captured on the **Checkout page**, if it is abandoned after entering the **email address**.
36
- 4. Track **abandoned orders value v/s recovered orders value**.
37
- 5. Admin is notified by email when an order is **recovered**.
38
- 6. Works off-the-shelf as it comes with 1 **default email template**.
39
- 7. Create **unlimited email templates** to be sent at intervals that you set - Intervals start from 1 hour after cart is abandoned.
40
- 8. Add custom variables like **Customer First Name, Customer Last name, Customer full name, Cart Link & Product Cart Information** in the email template.
41
- 9. Copy HTML from anywhere & create templates using the powerful **Rich Text Editor**.
42
- 10. **Automatically stops email notifications** when a customer makes a purchase or uses the cart recovery link.
43
-
44
- ### Differences between Lite & PRO version:
45
-
46
- You can check the detailed difference between Pro and Lite version **[here](https://www.tychesoftwares.com/differences-between-pro-and-lite-versions-of-abandoned-cart-for-woocommerce-plugin/?utm_source=wprepo&utm_medium=litelink&utm_campaign=AbandonedCartLite "Lite and Pro version Difference")**
47
-
48
- > I'm using the plugin on my shop. **Installation is very easy and it works great**. I've already recovered some orders, **it doesn't cost any effort**.
49
-
50
- > **Support is fast and extensive**.
51
-
52
- > -[bertkat](https://wordpress.org/support/topic/easy-money/)
53
-
54
- **Pro Version:**
55
 
56
- [youtube https://www.youtube.com/watch?v=BemNllbQW1c]
57
 
58
- **[Abandoned Cart Pro for WooCommerce](http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Abandoned Cart Pro for WooCommerce")** enables to do the following additional things:
59
 
60
- 1. Super powerful feature, **Add To Cart Popup Modal** - Grab your visitors' attention and build your mailing list. It offers an innovative, exclusive Add to Cart Popup Modal to abandoners to re-engage and capture emails from more of your guest customers before the checkout page.
61
 
62
- It is simple, effective & a highly customizable popup using Live Preview when customizing it in the Add to Cart Popup Editor.
 
 
 
 
 
 
63
 
64
- When guest customers clicks on the **Add to Cart** button on the shop or product page, the popup modal will appear immediately and ask for the email address. You can choose to prevent users from proceeding without submitting their email, or allow them to checkout as a guest.
65
- 2. Works off-the-shelf as it comes with **3 default email templates**.
66
- 3. Offer **incentives to customers** to return and complete their checkout with **discounts and coupons**.
67
- 4. Add custom variables like **Customer Name, Product Information, Coupons**, etc. in the email template.
68
- 5. Embed WooCommerce coupons & also **generate unique coupons** in the emails being sent to customers.
69
- 6. Track whether **expired coupons** are causing cart abandonment.
70
- 7. Track **emails sent, emails opened, links clicked** for each template/email.
71
- 8. **Product report** allows you to see which products are being abandoned & which are being recovered the most.
72
- 9. Start sending email templates **within minutes** of cart being abandoned.
73
- 10. Admin can send the customer emails to specific abandoned cart(s) using **'Send Custom Email'** feature.
74
- 11. If the store is using **WPML** then admin can translate all the abandoned cart reminder email templates using WPML. Then the emails will be sent to the customers in the **same language in which they have abandoned the cart**.
75
- 12. Admin can **Print** or export the Abandoned Orders to **CSV** format.
76
- 13. Admin can send **different email templates** to **'Registered Users', 'Guest Users', 'For carts Abandoned with one product' or 'with more than one product' or to 'All'**.
77
- 14. Admin can **restrict** the abandoned carts based on the **'Email address'**, **'IP address'** & **'Domain name'**.
78
- 15. Admin can take a **glimpse** of **abandoned carts**, **recovered orders**, and the **states of the email template** from the **Dashboard** tab.
79
- 16. The plugin will consider the **taxation** which is set in the WooCommerce. The abandoned cart total will be displayed as per the selected tax setting.
80
 
81
- You can check the detailed difference between Pro and Lite version **[here](https://www.tychesoftwares.com/differences-between-pro-and-lite-versions-of-abandoned-cart-for-woocommerce-plugin/?utm_source=wprepo&utm_medium=prolink&utm_campaign=AbandonedCartLite "Lite and Pro version Difference")**
 
82
 
83
- > Using the free version and for now it does all I need will give it a few days use but can quickly see that **I'll likely be upgrading to Pro version**-for a 99 bucks it's hard to go wrong
84
 
85
- > Wish list for free version
86
- > 1. Easy way to format "Abandoned cart reminder" Header
87
 
88
- > -[clowmilk](https://wordpress.org/support/topic/super-nice-plug-in/)
89
 
 
 
90
 
91
- **Email Sending Setup:**
 
 
 
 
 
 
92
 
93
- Abandoned Cart Plugin relies on a function called WP-Cron, and this function only runs when there is a page requested. So, if there are no visits to your website, then the scheduled jobs are not run. Generally this method of sending the abandoned cart notification emails is reliable. However, if you are not very confident about the traffic volume of your website, then you can set a manual cron job via cPanel or any other control panel that your host provides.
94
 
95
- **Some of our Pro plugins:**
96
 
97
- 1. **[Abandoned Cart Pro for WooCommerce](https://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/?utm_source=wprepo&utm_medium=otherprolink&utm_campaign=AbandonedCartLite "Abandoned Cart Pro for WooCommerce")**
98
 
99
- 2. **[Booking & Appointment Plugin for WooCommerce](https://www.tychesoftwares.com/store/premium-plugins/woocommerce-booking-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Booking & Appointment Plugin for WooCommerce")**
100
-
101
- 3. **[Order Delivery Date Pro for WooCommerce](https://www.tychesoftwares.com/store/premium-plugins/order-delivery-date-for-woocommerce-pro-21/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Order Delivery Date Pro for WooCommerce")**
102
-
103
- 4. **[Product Delivery Date Pro for WooCommerce](https://www.tychesoftwares.com/store/premium-plugins/product-delivery-date-pro-for-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Product Delivery Date Pro for WooCommerce")**
104
-
105
- 5. **[Deposits For WooCommerce](https://www.tychesoftwares.com/store/premium-plugins/deposits-for-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Deposits For WooCommerce")**
106
-
107
- 6. **[Payment Gateway Based Fees and Discounts for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/payment-gateway-based-fees-and-discounts-for-woocommerce-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Payment Gateway Based Fees and Discounts for WooCommerce - Pro")**
108
-
109
- 7. **[Custom Order Status for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/custom-order-status-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Custom Order Status for WooCommerce - Pro")**
110
-
111
- 8. **[Custom Order Numbers for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/custom-order-numbers-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Custom Order Numbers for WooCommerce - Pro")**
112
-
113
- 9. **[Product Input Fields for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/product-input-fields-for-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Product Input Fields for WooCommerce - Pro")**
114
-
115
- 10. **[Call for Price for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/woocommerce-call-for-price-plugin/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Call for Price for WooCommerce - Pro")**
116
-
117
- 11. **[Price based on User Role for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/price-user-role-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Price based on User Role for WooCommerce - Pro")**
118
-
119
- 12. **[Currency per Product for WooCommerce - Pro](https://www.tychesoftwares.com/store/premium-plugins/currency-per-product-for-woocommerce/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Currency per Product for WooCommerce - Pro")**
120
-
121
- **Some of our other free plugins:**
122
-
123
- 1. **[Order Delivery Date for WooCommerce](https://wordpress.org/plugins/order-delivery-date-for-woocommerce/ "Order Delivery Date for WooCommerce")**
124
-
125
- 2. **[Product Delivery Date for WooCommerce - Lite](https://wordpress.org/plugins/product-delivery-date-for-woocommerce-lite/ "Product Delivery Date for WooCommerce")**
126
 
127
- 3. **[WooCommerce Print Invoice & Delivery Note](https://wordpress.org/plugins/woocommerce-delivery-notes/ "WooCommerce Print Invoice & Delivery Note")**
128
 
129
- 4. **[Payment Gateway Based Fees and Discounts for WooCommerce](https://wordpress.org/plugins/checkout-fees-for-woocommerce/ "Payment Gateway Based Fees and Discounts for WooCommerce")**
130
 
131
- 5. **[Custom Order Status for WooCommerce](https://wordpress.org/plugins/custom-order-statuses-woocommerce/ "Custom Order Status for WooCommerce")**
132
 
133
- 6. **[Custom Order Numbers for WooCommerce](https://wordpress.org/plugins/custom-order-numbers-for-woocommerce/ "Custom Order Numbers for WooCommerce")**
134
 
135
- 7. **[Product Input Fields for WooCommerce](https://wordpress.org/plugins/product-input-fields-for-woocommerce/ "Product Input Fields for WooCommerce")**
136
 
137
- 8. **[Call for Price for WooCommerce](https://wordpress.org/plugins/woocommerce-call-for-price/ "Call for Price for WooCommerce")**
138
 
139
- 9. **[Price based on User Role for WooCommerce](https://wordpress.org/plugins/price-by-user-role-for-woocommerce/ "Price based on User Role for WooCommerce")**
140
 
141
- 10. **[Currency per Product for WooCommerce](https://wordpress.org/plugins/currency-per-product-for-woocommerce/ "Currency per Product for WooCommerce")**
142
 
143
  **[Documentation](https://www.tychesoftwares.com/docs/docs/abandoned-cart-for-woocommerce-lite/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Documentation")**
144
 
@@ -222,6 +155,22 @@ The admin can use the merge code `{{cart.unsubscribe}}' in the email templates.
222
  6. Product Report Tab.
223
 
224
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  = 5.12.0 ( 08.02.2022 ) =
226
  * Enhancement - Introduced 2 new webhooks that allows the admin to send cart abandonment and recovery data to delivery URLs.
227
  * Tweak - Introduced the ability to enable/disable GDPR consent.
1
  
2
  === Abandoned Cart Lite for WooCommerce ===
3
+ Contributors: ashokrane, pinal.shah, chetnapatel, tychesoftwares,
4
+ Tags: woocommerce cart abandonment, woocommerce cart abandonment recovery, Cart abandonment recovery, Cart abandonment rate, Cart abandonment solutions, Best abandoned cart plugin for WooCommerce, WooCommerce abandoned cart plugin free, Abandoned cart WooCommerce plugin
5
  Author URI: https://www.tychesoftwares.com/
6
  Requires at least: 1.3
7
+ Tested up to: 6.0.1
8
  Stable tag: trunk
9
  Requires PHP: 5.6
10
  License: GPLv2 or late
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
  Donate link: https://www.paypal.me/TycheSoftwares
13
 
 
 
14
  == Description ==
15
 
16
+ ### Best FREE abandoned cart WooCommerce plugin
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ According to experts, the average cart abandonment rate is around 70% to 75%. The reason for cart abandonment is different for each industry. If you want a rock-solid WooCommerce cart abandonment plugin that ticks all boxes in your [cart abandonment strategy](https://www.tychesoftwares.com/abandoned-cart-strategy/), the Abandoned Cart Lite for WooCommerce is the one for you.
19
 
20
+ The FREE Abandoned Cart Lite for WooCommerce is bundled with all the essential features you need for abandoned cart recovery.
21
 
22
+ ### Abandoned Cart Lite for WooCommerce Features
23
 
24
+ * Check if the cart is abandoned by the guest client or logged in user
25
+ * Tracking percentage of recovery done
26
+ * Send a reminder email within a few minutes after the cart gets abandoned
27
+ * Abandoned cart templates for quick setup
28
+ * Copy HTML from anywhere & create templates using the powerful Rich Text Editor
29
+ * A handy report showing the number of times a product was abandoned and recovered
30
+ * Seven merge codes are available to help you send PERSONALIZED reminder emails
31
 
32
+ > **This plugin works as described: the lite version doesn’t cut down in functionality. You can have your orders recovered and save on sales. Depending on what you are selling, this can be a few orders to justify ordering the full package I’m only a few away!**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
+ > **Very recommended!**
35
+ > **- [jaysnl](https://wordpress.org/support/topic/great-support-and-value-buy-it/)**
36
 
37
+ The FREE WooCommerce abandoned cart plugin gives you the essential options to recover the customers. But if you want more powerful Abandoned cart plugin options for **WooCommerce cart abandonment recovery**, the Abandoned Cart Pro for WooCommerce will be the best option for you.
38
 
39
+ ### Abandoned Cart Pro for WooCommerce Features
 
40
 
41
+ The [Abandoned Cart Pro for WooCommerce](http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite) gives 25+ features to have a better insight on cart abandonment and options to bring in the customers.
42
 
43
+ Experience how the Abandoned Cart WooCommerce recovery plugin works - [Live Demo](https://demo.tychesoftwares.com/woo_ac_demo/?post_type=product)
44
+ Experience the user-friendly WordPress admin dashboard feature of the plugin - [Admin Demo](https://demo.tychesoftwares.com/woo_ac_demo/wp-admin/)
45
 
46
+ * Capture emails when Add to Cart is clicked
47
+ * Neat Dashboard to have a quick overview of the number of abandoned and recovered orders
48
+ * Automatically delete abandoned orders after a particular number of days
49
+ * Generating and assigning coupon codes to abandoned cart reminder emails
50
+ * Tracking Coupon Code Used & Coupon Status
51
+ * Exit-Intent popup to prevent customers from abandoning the cart before they leave the site
52
+ * Send automated abandoned cart notifications via Messenger, SMS, and Email in a set time interval for better results.
53
 
54
+ [youtube https://youtu.be/BemNllbQW1c]
55
 
56
+ Take a look at our complete [Abandoned cart Lite Vs Abandoned Cart Pro comparison](https://www.tychesoftwares.com/differences-between-pro-and-lite-versions-of-abandoned-cart-for-woocommerce-plugin/?utm_source=wprepo&utm_medium=prolink&utm_campaign=AbandonedCartLite) to get a clear idea of which version best suits your needs. The pro version of the **Abandoned cart WooCommerce plugin** is equipped with all **cart abandonment solutions** to make it a perfect plugin that you all need
57
 
58
+ > **I’m using the plugin on my shop. Installation is very easy and it works great. I’ve already recovered some orders, it doesn’t cost any effort.**
59
 
60
+ > **Support is fast and extensive**.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
+ > -[bertkat](https://wordpress.org/support/topic/easy-money/)
63
 
 
64
 
65
+ ### Abandoned Cart for WooCommerce Team Promise.
66
 
67
+ Whether you are an Abandoned Cart free version user or a pro user, our support team is always there to help you. Feel free to contact us, and also, please share your review & rate us a **FIVE STAR rating** to help fellow WordPress users try our plugins.
68
 
69
+ ### About Us
70
 
71
+ We build WordPress plugins for WooCommerce that help store owners increase their sales. We have a portfolio of **12+ Premium WooCommerce plugins with a highly focused niche**. We are committed to providing top-notch services to our customers through our products & team.
72
 
73
+ [Get Access To All Our Plugins](https://www.tychesoftwares.com/store/premium-plugins/all-pass-access/)
74
 
 
75
 
76
  **[Documentation](https://www.tychesoftwares.com/docs/docs/abandoned-cart-for-woocommerce-lite/?utm_source=wprepo&utm_medium=link&utm_campaign=AbandonedCartLite "Documentation")**
77
 
155
  6. Product Report Tab.
156
 
157
  == Changelog ==
158
+ = 5.13.0 ( 23.08.2022 ) =
159
+ * Tweak - The plugin will now delete carts older than 365 days to ensure performance is not affected.
160
+ * Tweak - Added a email type column in email templates database table. This will not result in any frontend changes for reminder email templates.
161
+ * Tweak - Added hooks to change the sender and recipient email address for order recovery notifications.
162
+ * Tweak - Added a hook to allow the site admin to change the cart recovery URL in reminder emails.
163
+ * Tweak - Added hooks to modify the cart table in reminder emails.
164
+ * Tweak - Performance improvements have been added in the action scheduler code run every 15 mins.
165
+ * Tweak - Added a hook to change the URL the user is redirected to when unsubscribing from reminder emails.
166
+ * Tweak - Updated the data tracked and sent from user sites for better data analysis and user behaviour.
167
+ * Fix - From email address and user name is taken from WP Settings instead of plugin when WC template style headers are enabled.
168
+ * Fix - WP Multisite installation compatibility.
169
+ * Fix - An extra https:// was being added to cart recovery links in reminder emails occassionaly.
170
+ * Fix - A fatal error was observed on rare occassions on the plugin dashboard.
171
+ * Fix - A fatal error was observed on the Product Report tab.
172
+ * Fix - Orphan record were being left by the plugin in the options table on uninstalling.
173
+
174
  = 5.12.0 ( 08.02.2022 ) =
175
  * Enhancement - Introduced 2 new webhooks that allows the admin to send cart abandonment and recovery data to delivery URLs.
176
  * Tweak - Introduced the ability to enable/disable GDPR consent.
uninstall.php CHANGED
@@ -38,6 +38,8 @@ if ( is_multisite() ) { // Multisite.
38
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
39
  $wpdb->get_results( 'DROP TABLE ' . $sub_site_prefix . 'ac_guest_abandoned_cart_history_lite' ); //phpcs:ignore
40
 
 
 
41
  delete_blog_option( $blog_id_number, 'woocommerce_ac_email_body' );
42
  delete_blog_option( $blog_id_number, 'ac_lite_cart_abandoned_time' );
43
  delete_blog_option( $blog_id_number, 'ac_lite_email_admin_on_recovery' );
@@ -73,6 +75,12 @@ if ( is_multisite() ) { // Multisite.
73
  delete_blog_option( $blog_id_number, 'wcal_previous_version' );
74
  delete_blog_option( $blog_id_number, 'wcal_gdpr_consent_migrated' );
75
  delete_blog_option( $blog_id_number, 'wcal_enable_gdpr_consent' );
 
 
 
 
 
 
76
  } else {
77
 
78
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
@@ -92,6 +100,8 @@ if ( is_multisite() ) { // Multisite.
92
 
93
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
94
  $wpdb->get_results( "DELETE FROM `$wpdb->prefix" . "usermeta` WHERE meta_key = '_woocommerce_ac_modified_cart'" ); //phpcs:ignore
 
 
95
  }
96
  }
97
  } else { // Single site.
@@ -113,6 +123,8 @@ if ( is_multisite() ) { // Multisite.
113
 
114
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
115
  $wpdb->get_results( "DELETE FROM `$wpdb->prefix" . "usermeta` WHERE meta_key = '_woocommerce_ac_modified_cart'" ); //phpcs:ignore
 
 
116
  }
117
 
118
  delete_option( 'woocommerce_ac_email_body' );
@@ -151,3 +163,9 @@ delete_option( 'wcal_previous_version' );
151
 
152
  delete_option( 'wcal_gdpr_consent_migrated' );
153
  delete_option( 'wcal_enable_gdpr_consent' );
 
 
 
 
 
 
38
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
39
  $wpdb->get_results( 'DROP TABLE ' . $sub_site_prefix . 'ac_guest_abandoned_cart_history_lite' ); //phpcs:ignore
40
 
41
+ $wpdb->query( "DELETE FROM `$sub_site_prefix" . "options` WHERE option_name LIKE 'wcal_template_%'" ); // phpcs:ignore
42
+
43
  delete_blog_option( $blog_id_number, 'woocommerce_ac_email_body' );
44
  delete_blog_option( $blog_id_number, 'ac_lite_cart_abandoned_time' );
45
  delete_blog_option( $blog_id_number, 'ac_lite_email_admin_on_recovery' );
75
  delete_blog_option( $blog_id_number, 'wcal_previous_version' );
76
  delete_blog_option( $blog_id_number, 'wcal_gdpr_consent_migrated' );
77
  delete_blog_option( $blog_id_number, 'wcal_enable_gdpr_consent' );
78
+ delete_blog_option( $blog_id_number, 'wcal_email_type_setup' );
79
+ delete_blog_option( $blog_id_number, 'wcal_add_utm_to_links' );
80
+ delete_blog_option( $blog_id_number, 'wcal_delete_coupon_data' );
81
+ delete_blog_option( $blog_id_number, 'wcal_gdpr_allow_opt_out' );
82
+ delete_blog_option( $blog_id_number, 'wcal_gdpr_opt_out_message' );
83
+ delete_blog_option( $blog_id_number, 'wcal_guest_user_id_altered' );
84
  } else {
85
 
86
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
100
 
101
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
102
  $wpdb->get_results( "DELETE FROM `$wpdb->prefix" . "usermeta` WHERE meta_key = '_woocommerce_ac_modified_cart'" ); //phpcs:ignore
103
+
104
+ $wpdb->query( "DELETE FROM `$wpdb->prefix" . "options` WHERE option_name LIKE 'wcal_template_%'" ); // phpcs:ignore
105
  }
106
  }
107
  } else { // Single site.
123
 
124
  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
125
  $wpdb->get_results( "DELETE FROM `$wpdb->prefix" . "usermeta` WHERE meta_key = '_woocommerce_ac_modified_cart'" ); //phpcs:ignore
126
+
127
+ $wpdb->query( "DELETE FROM `$wpdb->prefix" . "options` WHERE option_name LIKE 'wcal_template_%'" ); // phpcs:ignore
128
  }
129
 
130
  delete_option( 'woocommerce_ac_email_body' );
163
 
164
  delete_option( 'wcal_gdpr_consent_migrated' );
165
  delete_option( 'wcal_enable_gdpr_consent' );
166
+ delete_option( 'wcal_email_type_setup' );
167
+ delete_option( 'wcal_add_utm_to_links' );
168
+ delete_option( 'wcal_delete_coupon_data' );
169
+ delete_option( 'wcal_gdpr_allow_opt_out' );
170
+ delete_option( 'wcal_gdpr_opt_out_message' );
171
+ delete_option( 'wcal_guest_user_id_altered' );
woocommerce-ac.php CHANGED
@@ -3,14 +3,14 @@
3
  * Plugin Name: Abandoned Cart Lite for WooCommerce
4
  * Plugin URI: http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro
5
  * Description: This plugin captures abandoned carts by logged-in users & emails them about it. <strong><a href="http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro">Click here to get the PRO Version.</a></strong>
6
- * Version: 5.12.0
7
  * Author: Tyche Softwares
8
  * Author URI: http://www.tychesoftwares.com/
9
  * Text Domain: woocommerce-abandoned-cart
10
  * Domain Path: /i18n/languages/
11
  * Requires PHP: 5.6
12
  * WC requires at least: 4.0.0
13
- * WC tested up to: 6.1.1
14
  *
15
  * @package Abandoned-Cart-Lite-for-WooCommerce
16
  */
@@ -124,7 +124,7 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
124
  }
125
 
126
  if ( ! defined( 'WCAL_PLUGIN_VERSION' ) ) {
127
- define( 'WCAL_PLUGIN_VERSION', '5.12.0' );
128
  }
129
 
130
  if ( ! defined( 'WCAL_PLUGIN_PATH' ) ) {
@@ -268,6 +268,8 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
268
  add_action( 'woocommerce_before_cart_table', array( 'wcal_common', 'wcal_apply_direct_coupon_code' ) );
269
  // Add coupon when user views checkout page (would not be added otherwise, unless user views cart first).
270
  add_action( 'woocommerce_before_checkout_form', array( 'wcal_common', 'wcal_apply_direct_coupon_code' ) );
 
 
271
  }
272
 
273
  /**
@@ -602,6 +604,7 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
602
  $wpdb->query( // phpcs:ignore
603
  "CREATE TABLE IF NOT EXISTS $table_name (
604
  `id` int(11) NOT NULL AUTO_INCREMENT,
 
605
  `subject` text NOT NULL,
606
  `body` mediumtext NOT NULL,
607
  `is_active` enum('0','1') NOT NULL,
@@ -1082,9 +1085,10 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
1082
  */
1083
  public static function wcal_delete_days_validation( $input ) {
1084
  $output = '';
1085
- if ( '' == $input || ( is_numeric( $input ) && $input > 0 ) ) { // phpcS:ignore
1086
  $output = stripslashes( $input );
1087
  } else {
 
1088
  add_settings_error( 'ac_lite_delete_abandoned_order_days', 'error found', __( 'Automatically Delete Abandoned Orders after X days has to be greater than 0.', 'woocommerce-abandoned-cart' ) );
1089
  }
1090
  return $output;
@@ -1098,7 +1102,10 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
1098
  */
1099
  public static function wcal_delete_abandoned_orders_days_callback( $args ) {
1100
  // First, we read the option.
1101
- $delete_abandoned_order_days = get_option( 'ac_lite_delete_abandoned_order_days' );
 
 
 
1102
  // Next, we update the name attribute to access this element's ID in the context of the display options array.
1103
  // We also access the show_header element of the options collection in the call to the checked() helper function.
1104
  printf(
@@ -1758,7 +1765,7 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
1758
  );
1759
  echo esc_html( 'Unsubscribed Successfully' );
1760
  sleep( 2 );
1761
- $url = get_option( 'siteurl' );
1762
  ?>
1763
  <script>
1764
  location.href = "<?php echo esc_url( $url ); ?>";
@@ -1785,7 +1792,7 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
1785
 
1786
  $track_link = isset( $_GET['wcal_action'] ) ? sanitize_text_field( wp_unslash( $_GET['wcal_action'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
1787
 
1788
- if ( 'track_links' === $track_link || $track_link === 'checkout_link' ) {
1789
  if ( '' === session_id() ) {
1790
  // session has not started.
1791
  session_start();
@@ -1834,7 +1841,7 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
1834
 
1835
  $url_pos = strpos( $link_decode, '=' );
1836
  ++$url_pos;
1837
- $url = substr( $link_decode, $url_pos );
1838
 
1839
  wcal_common::wcal_set_cart_session( 'abandoned_cart_id_lite', $abandoned_id );
1840
  set_transient( 'wcal_abandoned_id', $abandoned_id, 5 );
@@ -2807,15 +2814,31 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
2807
  $day_or_hour = isset( $_POST['day_or_hour'] ) ? trim( sanitize_text_field( wp_unslash( $_POST['day_or_hour'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
2808
  $is_wc_template = empty( $_POST['is_wc_template'] ) ? '0' : '1'; // phpcs:ignore WordPress.Security.NonceVerification
2809
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2810
  if ( isset( $_POST['ac_settings_frm'] ) && 'save' === sanitize_text_field( wp_unslash( $_POST['ac_settings_frm'] ) ) ) { // phpcs:ignore
2811
  $default_value = 0;
2812
  $coupon_code_id = isset( $_POST['coupon_ids'][0] ) ? sanitize_text_field( wp_unslash( implode( ',', $_POST['coupon_ids'] ) ) ) : ''; // phpcs:ignore
2813
  $unique_coupon = ( empty( $_POST['unique_coupon'] ) ) ? '0' : '1'; // phpcs:ignore WordPress.Security.NonceVerification
2814
  $coupon_code_options = self::wcal_coupon_options();
 
2815
 
2816
  $insert_template_successfuly = $wpdb->query( //phpcs:ignore
2817
  $wpdb->prepare(
2818
- 'INSERT INTO `' . $wpdb->prefix . 'ac_email_templates_lite` (subject, body, frequency, day_or_hour, template_name, is_wc_template, default_template, wc_email_header, coupon_code, individual_use, generate_unique_coupon_code, discount, discount_type, discount_shipping, discount_expiry ) VALUES ( %s, %s, %d, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s )',
 
2819
  $woocommerce_ac_email_subject,
2820
  $woocommerce_ac_email_body,
2821
  $email_frequency,
@@ -3932,6 +3955,34 @@ if ( ! class_exists( 'woocommerce_abandon_cart_lite' ) ) {
3932
  }
3933
  wp_die();
3934
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3935
  /**
3936
  * It will replace the test email data with the static content.
3937
  *
3
  * Plugin Name: Abandoned Cart Lite for WooCommerce
4
  * Plugin URI: http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro
5
  * Description: This plugin captures abandoned carts by logged-in users & emails them about it. <strong><a href="http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro">Click here to get the PRO Version.</a></strong>
6
+ * Version: 5.13.0
7
  * Author: Tyche Softwares
8
  * Author URI: http://www.tychesoftwares.com/
9
  * Text Domain: woocommerce-abandoned-cart
10
  * Domain Path: /i18n/languages/
11
  * Requires PHP: 5.6
12
  * WC requires at least: 4.0.0
13
+ * WC tested up to: 6.8.2
14
  *
15
  * @package Abandoned-Cart-Lite-for-WooCommerce
16
  */
124
  }
125
 
126
  if ( ! defined( 'WCAL_PLUGIN_VERSION' ) ) {
127
+ define( 'WCAL_PLUGIN_VERSION', '5.13.0' );
128
  }
129
 
130
  if ( ! defined( 'WCAL_PLUGIN_PATH' ) ) {
268
  add_action( 'woocommerce_before_cart_table', array( 'wcal_common', 'wcal_apply_direct_coupon_code' ) );
269
  // Add coupon when user views checkout page (would not be added otherwise, unless user views cart first).
270
  add_action( 'woocommerce_before_checkout_form', array( 'wcal_common', 'wcal_apply_direct_coupon_code' ) );
271
+ add_filter( 'woocommerce_email_from_address', array( __CLASS__, 'wcal_from_address_for_emails' ), 10, 3 );
272
+ add_filter( 'woocommerce_email_from_name', array( __CLASS__, 'wcal_from_name_for_emails' ), 10, 3 );
273
  }
274
 
275
  /**
604
  $wpdb->query( // phpcs:ignore
605
  "CREATE TABLE IF NOT EXISTS $table_name (
606
  `id` int(11) NOT NULL AUTO_INCREMENT,
607
+ `email_type` varchar(50) NOT NULL,
608
  `subject` text NOT NULL,
609
  `body` mediumtext NOT NULL,
610
  `is_active` enum('0','1') NOT NULL,
1085
  */
1086
  public static function wcal_delete_days_validation( $input ) {
1087
  $output = '';
1088
+ if ( is_numeric( $input ) && $input > 0 ) {
1089
  $output = stripslashes( $input );
1090
  } else {
1091
+ $output = '365';
1092
  add_settings_error( 'ac_lite_delete_abandoned_order_days', 'error found', __( 'Automatically Delete Abandoned Orders after X days has to be greater than 0.', 'woocommerce-abandoned-cart' ) );
1093
  }
1094
  return $output;
1102
  */
1103
  public static function wcal_delete_abandoned_orders_days_callback( $args ) {
1104
  // First, we read the option.
1105
+ $delete_abandoned_order_days = get_option( 'ac_lite_delete_abandoned_order_days', '365' );
1106
+ if ( '' === $delete_abandoned_order_days ) {
1107
+ $delete_abandoned_order_days = '365';
1108
+ }
1109
  // Next, we update the name attribute to access this element's ID in the context of the display options array.
1110
  // We also access the show_header element of the options collection in the call to the checked() helper function.
1111
  printf(
1765
  );
1766
  echo esc_html( 'Unsubscribed Successfully' );
1767
  sleep( 2 );
1768
+ $url = apply_filters( 'wcal_unsubscribe_redirect', get_option( 'home' ) );
1769
  ?>
1770
  <script>
1771
  location.href = "<?php echo esc_url( $url ); ?>";
1792
 
1793
  $track_link = isset( $_GET['wcal_action'] ) ? sanitize_text_field( wp_unslash( $_GET['wcal_action'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
1794
 
1795
+ if ( 'track_links' === $track_link || 'checkout_link' === $track_link ) {
1796
  if ( '' === session_id() ) {
1797
  // session has not started.
1798
  session_start();
1841
 
1842
  $url_pos = strpos( $link_decode, '=' );
1843
  ++$url_pos;
1844
+ $url = substr( $link_decode, $url_pos );
1845
 
1846
  wcal_common::wcal_set_cart_session( 'abandoned_cart_id_lite', $abandoned_id );
1847
  set_transient( 'wcal_abandoned_id', $abandoned_id, 5 );
2814
  $day_or_hour = isset( $_POST['day_or_hour'] ) ? trim( sanitize_text_field( wp_unslash( $_POST['day_or_hour'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
2815
  $is_wc_template = empty( $_POST['is_wc_template'] ) ? '0' : '1'; // phpcs:ignore WordPress.Security.NonceVerification
2816
 
2817
+ // If the link merge tags are prefixed with http://|https:// please remove it.
2818
+ $rectify_links = array(
2819
+ 'http://{{cart.link}}',
2820
+ 'https://{{cart.link}}',
2821
+ 'http://{{cart.unsubscribe}}',
2822
+ 'https://{{cart.unsubscribe}}',
2823
+ 'http://{{shop.url}}',
2824
+ 'https://{{shop.url}}',
2825
+ );
2826
+ foreach ( $rectify_links as $merge_tag ) {
2827
+ $start_tag = stripos( $merge_tag, '{{' );
2828
+ $new_tag = substr( $merge_tag, $start_tag );
2829
+ $woocommerce_ac_email_body = str_ireplace( $merge_tag, $new_tag, $woocommerce_ac_email_body );
2830
+ }
2831
  if ( isset( $_POST['ac_settings_frm'] ) && 'save' === sanitize_text_field( wp_unslash( $_POST['ac_settings_frm'] ) ) ) { // phpcs:ignore
2832
  $default_value = 0;
2833
  $coupon_code_id = isset( $_POST['coupon_ids'][0] ) ? sanitize_text_field( wp_unslash( implode( ',', $_POST['coupon_ids'] ) ) ) : ''; // phpcs:ignore
2834
  $unique_coupon = ( empty( $_POST['unique_coupon'] ) ) ? '0' : '1'; // phpcs:ignore WordPress.Security.NonceVerification
2835
  $coupon_code_options = self::wcal_coupon_options();
2836
+ $email_type = 'abandoned_cart_email';
2837
 
2838
  $insert_template_successfuly = $wpdb->query( //phpcs:ignore
2839
  $wpdb->prepare(
2840
+ 'INSERT INTO `' . $wpdb->prefix . 'ac_email_templates_lite` (email_type, subject, body, frequency, day_or_hour, template_name, is_wc_template, default_template, wc_email_header, coupon_code, individual_use, generate_unique_coupon_code, discount, discount_type, discount_shipping, discount_expiry ) VALUES ( %s, %s, %s, %d, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s )',
2841
+ $email_type,
2842
  $woocommerce_ac_email_subject,
2843
  $woocommerce_ac_email_body,
2844
  $email_frequency,
3955
  }
3956
  wp_die();
3957
  }
3958
+
3959
+ /**
3960
+ * Set up from email address in emails sent by our plugin when WC template style is ON.
3961
+ *
3962
+ * @param str $wp_admin_address - From email address set up in WP.
3963
+ * @param object $email - Email object.
3964
+ * @param str $from_email - Email Address passed in.
3965
+ *
3966
+ * @since 5.13.0
3967
+ */
3968
+ public static function wcal_from_address_for_emails( $wp_admin_address, $email, $from_email ) {
3969
+ $from_address = '' == $email->title ? get_option( 'wcal_from_email' ) : $wp_admin_address; // phpcs:ignore
3970
+ return $from_address;
3971
+ }
3972
+
3973
+ /**
3974
+ * Set up from name in emails sent by our plugin when WC template style is ON.
3975
+ *
3976
+ * @param str $wp_admin_name - From name set up in WP.
3977
+ * @param object $email - Email object.
3978
+ * @param str $from_name_default - Name passed in.
3979
+ *
3980
+ * @since 5.13.0
3981
+ */
3982
+ public static function wcal_from_name_for_emails( $wp_admin_name, $email, $from_name_default ) {
3983
+ $from_name = '' == $email->title ? get_option( 'wcal_from_name' ) : $wp_admin_name; // phpcs:ignore
3984
+ return $from_name;
3985
+ }
3986
  /**
3987
  * It will replace the test email data with the static content.
3988
  *