Email Subscribers & Newsletters - Version 4.6.10

Version Description

Download this release

Release Info

Developer Icegram
Plugin Icon 128x128 Email Subscribers & Newsletters
Version 4.6.10
Comparing to
See all releases

Code changes from version 4.6.9 to 4.6.10

email-subscribers.php CHANGED
@@ -3,11 +3,11 @@
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
- * Version: 4.6.9
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
10
- * Tested up to: 5.6
11
  * WC requires at least: 3.6.0
12
  * WC tested up to: 4.9.2
13
  * ES WOO: 7120515:9f4c7f8bb491260ef19edf9699db73e6
@@ -178,7 +178,7 @@ if ( 'premium' === $ig_es_plan ) {
178
  /* ***************************** Initial Compatibility Work (End) ******************* */
179
 
180
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
181
- define( 'ES_PLUGIN_VERSION', '4.6.9' );
182
  }
183
 
184
  // Plugin Folder Path.
@@ -249,7 +249,7 @@ if ( ! function_exists( 'activate_email_subscribers' ) ) {
249
  if ( is_multisite() && $network_wide ) {
250
 
251
  // Get all active blogs in the network and activate plugin on each one
252
- $blog_ids = $wpdb->get_col( sprintf( "SELECT blog_id FROM $wpdb->blogs WHERE deleted = %d", 0 ) );
253
  foreach ( $blog_ids as $blog_id ) {
254
  ig_es_activate_on_blog( $blog_id );
255
  }
@@ -277,7 +277,7 @@ if ( ! function_exists( 'deactivate_email_subscribers' ) ) {
277
  global $wpdb;
278
 
279
  // Get all active blogs in the network.
280
- $blog_ids = $wpdb->get_col( sprintf( "SELECT blog_id FROM $wpdb->blogs WHERE deleted = %d", 0 ) );
281
  foreach ( $blog_ids as $blog_id ) {
282
  // Run deactivation code on each one
283
  ig_es_trigger_deactivation_in_multisite( $blog_id );
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
+ * Version: 4.6.10
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
10
+ * Tested up to: 5.6.1
11
  * WC requires at least: 3.6.0
12
  * WC tested up to: 4.9.2
13
  * ES WOO: 7120515:9f4c7f8bb491260ef19edf9699db73e6
178
  /* ***************************** Initial Compatibility Work (End) ******************* */
179
 
180
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
181
+ define( 'ES_PLUGIN_VERSION', '4.6.10' );
182
  }
183
 
184
  // Plugin Folder Path.
249
  if ( is_multisite() && $network_wide ) {
250
 
251
  // Get all active blogs in the network and activate plugin on each one
252
+ $blog_ids = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE deleted = %d", 0 ) );
253
  foreach ( $blog_ids as $blog_id ) {
254
  ig_es_activate_on_blog( $blog_id );
255
  }
277
  global $wpdb;
278
 
279
  // Get all active blogs in the network.
280
+ $blog_ids = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE deleted = %d", 0 ) );
281
  foreach ( $blog_ids as $blog_id ) {
282
  // Run deactivation code on each one
283
  ig_es_trigger_deactivation_in_multisite( $blog_id );
lite/admin/class-ig-es-onboarding.php CHANGED
@@ -493,7 +493,6 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
493
  $admin_name = get_option( 'admin_email' );
494
  $user = get_user_by( 'email', $admin_email );
495
  $wp_user_id = 0;
496
- $ip_address = ig_es_get_ip();
497
  if ( $user instanceof WP_User ) {
498
  $wp_user_id = $user->ID;
499
  }
@@ -505,7 +504,6 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
505
  'last_name' => '',
506
  'email' => $admin_email,
507
  'source' => 'admin',
508
- 'ip_address' => $ip_address,
509
  'form_id' => 0,
510
  'status' => 'verified',
511
  'unsubscribed' => 0,
@@ -522,7 +520,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
522
  'status' => 'subscribed',
523
  'optin_type' => IG_SINGLE_OPTIN,
524
  'subscribed_at' => ig_get_current_date_time(),
525
- 'subscribed_ip' => $ip_address,
526
  );
527
 
528
  if ( ! empty( $default_list_id ) ) {
493
  $admin_name = get_option( 'admin_email' );
494
  $user = get_user_by( 'email', $admin_email );
495
  $wp_user_id = 0;
 
496
  if ( $user instanceof WP_User ) {
497
  $wp_user_id = $user->ID;
498
  }
504
  'last_name' => '',
505
  'email' => $admin_email,
506
  'source' => 'admin',
 
507
  'form_id' => 0,
508
  'status' => 'verified',
509
  'unsubscribed' => 0,
520
  'status' => 'subscribed',
521
  'optin_type' => IG_SINGLE_OPTIN,
522
  'subscribed_at' => ig_get_current_date_time(),
523
+ 'subscribed_ip' => '',
524
  );
525
 
526
  if ( ! empty( $default_list_id ) ) {
lite/includes/classes/class-es-contacts-table.php CHANGED
@@ -873,15 +873,11 @@ class ES_Contacts_Table extends ES_List_Table {
873
  return $this->get_lists_to_show( $item['id'] );
874
  case 'created_at':
875
  return ig_es_format_date_time( $item[ $column_name ] );
876
- case 'ip':
877
- $subscribed_ip = ! empty ( $item['ip_address'] ) ? $item['ip_address'] : '-';
878
 
879
- return $subscribed_ip;
880
  case 'first_name':
881
  case 'email':
882
  default:
883
  $column_data = isset( $item[ $column_name ] ) ? $item[ $column_name ] : '-';
884
-
885
  return apply_filters( 'ig_es_contact_column_data', $column_data, $column_name, $item, $this );
886
  }
887
  }
@@ -1025,17 +1021,13 @@ class ES_Contacts_Table extends ES_List_Table {
1025
  */
1026
  public function get_columns() {
1027
  $columns = array(
1028
- 'cb' => '<input type="checkbox"/>',
1029
- 'name' => __( 'Name', 'email-subscribers' ),
1030
- 'email' => __( 'Email', 'email-subscribers' ),
1031
- 'lists' => __( 'List(s)', 'email-subscribers' ),
 
1032
  );
1033
- $can_track_ip = apply_filters( 'ig_es_can_track_subscriber_ip', 'yes' );
1034
- if ( 'yes' === $can_track_ip ) {
1035
- $columns['ip'] = __( 'IP', 'email-subscribers' );
1036
- }
1037
- $columns['created_at'] = __( 'Created', 'email-subscribers' );
1038
-
1039
  return $columns;
1040
  }
1041
 
873
  return $this->get_lists_to_show( $item['id'] );
874
  case 'created_at':
875
  return ig_es_format_date_time( $item[ $column_name ] );
 
 
876
 
 
877
  case 'first_name':
878
  case 'email':
879
  default:
880
  $column_data = isset( $item[ $column_name ] ) ? $item[ $column_name ] : '-';
 
881
  return apply_filters( 'ig_es_contact_column_data', $column_data, $column_name, $item, $this );
882
  }
883
  }
1021
  */
1022
  public function get_columns() {
1023
  $columns = array(
1024
+ 'cb' => '<input type="checkbox"/>',
1025
+ 'name' => __( 'Name', 'email-subscribers' ),
1026
+ 'email' => __( 'Email', 'email-subscribers' ),
1027
+ 'lists' => __( 'List(s)', 'email-subscribers' ),
1028
+ 'created_at' => __( 'Created', 'email-subscribers' )
1029
  );
1030
+
 
 
 
 
 
1031
  return $columns;
1032
  }
1033
 
lite/includes/classes/class-es-cron.php CHANGED
@@ -118,6 +118,8 @@ class ES_Cron {
118
  */
119
  public function schedule() {
120
 
 
 
121
  // Add worker only once
122
  if ( ! wp_next_scheduled( 'ig_es_cron_auto_responder' ) ) {
123
  wp_schedule_event( floor( time() / 300 ) * 300 - 120, 'ig_es_cron_interval', 'ig_es_cron_auto_responder' );
@@ -127,10 +129,24 @@ class ES_Cron {
127
  wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_cron_interval', 'ig_es_cron_worker' );
128
  }
129
 
130
- if ( ! wp_next_scheduled( 'ig_es_wc_abandoned_cart_worker' ) ) {
131
- wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_two_minutes', 'ig_es_wc_abandoned_cart_worker' );
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  }
133
 
 
134
  }
135
 
136
  /**
@@ -249,6 +265,11 @@ class ES_Cron {
249
  'display' => esc_html__( 'Two minutes', 'email-subscribers' ),
250
  );
251
 
 
 
 
 
 
252
  return $schedules;
253
  }
254
 
118
  */
119
  public function schedule() {
120
 
121
+ global $ig_es_tracker;
122
+
123
  // Add worker only once
124
  if ( ! wp_next_scheduled( 'ig_es_cron_auto_responder' ) ) {
125
  wp_schedule_event( floor( time() / 300 ) * 300 - 120, 'ig_es_cron_interval', 'ig_es_cron_auto_responder' );
129
  wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_cron_interval', 'ig_es_cron_worker' );
130
  }
131
 
132
+ $is_woocommerce_active = $ig_es_tracker::is_plugin_activated( 'woocommerce/woocommerce.php' );
133
+
134
+ if ( $is_woocommerce_active && ES()->is_pro() ) {
135
+
136
+ if ( IG_ES_Abandoned_Cart_Options::is_cart_tracking_enabled() ) {
137
+
138
+ if ( ! wp_next_scheduled( 'ig_es_wc_abandoned_cart_worker' ) ) {
139
+ wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_two_minutes', 'ig_es_wc_abandoned_cart_worker' );
140
+ }
141
+ }
142
+
143
+ // Cron job to detect WooCommerce products which are on sale.
144
+ if ( ! wp_next_scheduled( 'ig_es_wc_products_on_sale_worker' ) ) {
145
+ wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_fifteen_minutes', 'ig_es_wc_products_on_sale_worker' );
146
+ }
147
  }
148
 
149
+
150
  }
151
 
152
  /**
265
  'display' => esc_html__( 'Two minutes', 'email-subscribers' ),
266
  );
267
 
268
+ $schedules['ig_es_fifteen_minutes'] = array(
269
+ 'interval' => 900,
270
+ 'display' => esc_html__( 'Fifteen minutes', 'email-subscribers' ),
271
+ );
272
+
273
  return $schedules;
274
  }
275
 
lite/includes/classes/class-es-handle-subscription.php CHANGED
@@ -275,7 +275,7 @@ if ( ! class_exists( 'ES_Handle_Subscription' ) ) {
275
  'status' => $this->status,
276
  'subscribed_at' => ( 'subscribed' === $this->status ) ? ig_get_current_date_time() : '',
277
  'optin_type' => $optin_type,
278
- 'subscribed_ip' => ig_es_get_ip(),
279
  );
280
 
281
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $this->list_ids );
275
  'status' => $this->status,
276
  'subscribed_at' => ( 'subscribed' === $this->status ) ? ig_get_current_date_time() : '',
277
  'optin_type' => $optin_type,
278
+ 'subscribed_ip' => '',
279
  );
280
 
281
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $this->list_ids );
lite/includes/classes/class-es-reports-table.php CHANGED
@@ -301,7 +301,7 @@ class ES_Reports_Table extends ES_List_Table {
301
  */
302
  public function column_default( $item, $column_name ) {
303
  global $wpdb;
304
-
305
  switch ( $column_name ) {
306
  case 'start_at':
307
  case 'finish_at':
@@ -324,7 +324,9 @@ class ES_Reports_Table extends ES_List_Table {
324
  case 'count':
325
  return $item[ $column_name ];
326
  default:
327
- return print_r( $item, true ); // Show the whole array for troubleshooting purposes
 
 
328
  }
329
  }
330
 
301
  */
302
  public function column_default( $item, $column_name ) {
303
  global $wpdb;
304
+ $item = apply_filters( 'es_add_additional_report_column_data', $item, $column_name );
305
  switch ( $column_name ) {
306
  case 'start_at':
307
  case 'finish_at':
324
  case 'count':
325
  return $item[ $column_name ];
326
  default:
327
+ $column_data = isset( $item[ $column_name ] ) ? $item[ $column_name ] : '-';
328
+
329
+ return $column_data;
330
  }
331
  }
332
 
lite/includes/db/class-es-db-contacts.php CHANGED
@@ -937,15 +937,14 @@ class ES_DB_Contacts extends ES_DB {
937
  */
938
  public function insert( $data, $type = '' ) {
939
  $source = array( 'admin','import' );
940
- $can_track_ip = apply_filters('ig_es_can_track_subscriber_ip', 'yes' );
941
 
942
- if ( 'no' === $can_track_ip && ES()->is_pro() ) {
943
  $data['ip_address'] = '';
944
  $data['country_code'] = '';
945
  } else {
946
  if ( empty( $data['ip_address'] ) && ! in_array( $data['source'], $source ) ) {
947
- $data['ip_address'] = ig_es_get_ip();
948
- $data = apply_filters( 'ig_es_get_country_based_on_ip', $data );
949
  }
950
  }
951
  return parent::insert( $data, $type );
937
  */
938
  public function insert( $data, $type = '' ) {
939
  $source = array( 'admin','import' );
 
940
 
941
+ if ( ! ES()->is_pro() ) {
942
  $data['ip_address'] = '';
943
  $data['country_code'] = '';
944
  } else {
945
  if ( empty( $data['ip_address'] ) && ! in_array( $data['source'], $source ) ) {
946
+ $data = apply_filters( 'ig_es_get_subscriber_ip', $data, 'ip_address' );
947
+ $data = apply_filters( 'ig_es_get_country_based_on_ip', $data );
948
  }
949
  }
950
  return parent::insert( $data, $type );
lite/includes/db/class-es-db-lists-contacts.php CHANGED
@@ -107,10 +107,7 @@ class ES_DB_Lists_Contacts extends ES_DB {
107
 
108
  if ( is_array( $list_ids ) && count( $list_ids ) > 0 ) {
109
 
110
- $can_track_ip = apply_filters( 'ig_es_can_track_subscriber_ip', 'yes' );
111
- if ( 'no' === $can_track_ip && ES()->is_pro() ) {
112
- $contact_data['subscribed_ip'] = '';
113
- }
114
 
115
  // Remove entry if it's already there in a list
116
  $contact_id = ! empty( $contact_data['contact_id'] ) ? $contact_data['contact_id'] : 0;
107
 
108
  if ( is_array( $list_ids ) && count( $list_ids ) > 0 ) {
109
 
110
+ $contact_data = apply_filters( 'ig_es_get_subscriber_ip', $contact_data, 'subscribed_ip' );
 
 
 
111
 
112
  // Remove entry if it's already there in a list
113
  $contact_id = ! empty( $contact_data['contact_id'] ) ? $contact_data['contact_id'] : 0;
lite/includes/es-backward.php CHANGED
@@ -76,7 +76,7 @@ class es_cls_dbquery {
76
  'status' => $status,
77
  'optin_type' => $optin_type,
78
  'subscribed_at' => ig_get_current_date_time(),
79
- 'subscribed_ip' => ig_es_get_ip(),
80
  );
81
 
82
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
76
  'status' => $status,
77
  'optin_type' => $optin_type,
78
  'subscribed_at' => ig_get_current_date_time(),
79
+ 'subscribed_ip' => '',
80
  );
81
 
82
  ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
lite/includes/pro-features.php CHANGED
@@ -280,6 +280,24 @@ function ig_es_add_upsale( $fields ) {
280
 
281
  }
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  return $fields;
284
  }
285
 
280
 
281
  }
282
 
283
+ if ( ES()->can_upsell_features( array( 'lite', 'starter', 'trial' ) ) ) {
284
+ $track_ip_address['ig_es_track_ip_address'] = array(
285
+ 'id' => 'ig_es_track_ip_address_p',
286
+ 'name' => __( 'Track IP address', 'email-subscribers' ),
287
+ 'info' => __( 'Store IP address on subscription', 'email-subscribers' ),
288
+ 'type' => 'checkbox',
289
+ 'default' => 'no',
290
+ 'is_premium' => true,
291
+ 'link' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'ip_tracking' ) ),
292
+ 'disabled' => true,
293
+ /* translators: %s: Icegram Pricing page url with utm tracking */
294
+ 'upgrade_title' => __( 'Track subscribers IP addresses with PRO', 'email-subscribers' ),
295
+ 'upgrade_desc' => __( 'Enable IP tracking and get more information about your subscribers <b>eg.</b> which country your subscribers are from.', 'email-subscribers' ),
296
+ );
297
+
298
+ $fields['security_settings'] = array_merge( $fields['security_settings'], $track_ip_address );
299
+ }
300
+
301
  return $fields;
302
  }
303
 
lite/includes/workflows/abstracts/class-es-workflow-trigger.php CHANGED
@@ -236,6 +236,26 @@ abstract class ES_Workflow_Trigger {
236
  return $this->fields;
237
  }
238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  /**
240
  * Get workflow ids registered to use this trigger
241
  *
236
  return $this->fields;
237
  }
238
 
239
+ /**
240
+ * Check if there are active workflow for this trigger
241
+ *
242
+ * @return bool
243
+ *
244
+ * @since 4.6.10
245
+ */
246
+ public function has_workflows() {
247
+
248
+ $workflow_query = new ES_Workflow_Query();
249
+ $workflow_query->set_triggers( $this->get_name() );
250
+
251
+ $workflows = $workflow_query->get_results();
252
+ if ( ! empty( $workflows ) ) {
253
+ return true;
254
+ }
255
+
256
+ return false;
257
+ }
258
+
259
  /**
260
  * Get workflow ids registered to use this trigger
261
  *
lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php CHANGED
@@ -20,6 +20,7 @@ abstract class IG_ES_Workflow_Variable {
20
 
21
  /**
22
  * Variable description
 
23
  * @var string
24
  */
25
  protected $description;
@@ -92,6 +93,7 @@ abstract class IG_ES_Workflow_Variable {
92
 
93
  /**
94
  * Sets the name, data_type and data_field props
 
95
  * @param $name
96
  */
97
  public function setup( $name ) {
20
 
21
  /**
22
  * Variable description
23
+ *
24
  * @var string
25
  */
26
  protected $description;
93
 
94
  /**
95
  * Sets the name, data_type and data_field props
96
+ *
97
  * @param $name
98
  */
99
  public function setup( $name ) {
lite/includes/workflows/actions/class-es-action-add-to-list.php CHANGED
@@ -67,8 +67,10 @@ class ES_Action_Add_To_List extends ES_Workflow_Action {
67
  if ( ! $data_type || ! $data_type->validate( $data_item ) ) {
68
  continue;
69
  }
70
- $data = $data_type->get_data( $data_item );
71
- $this->add_contact( $list_id, $data );
 
 
72
 
73
  // Check if we have WC_Order object.
74
  if ( $data_item instanceof WC_Order && is_callable( array( $data_item, 'get_items' ) ) ) {
67
  if ( ! $data_type || ! $data_type->validate( $data_item ) ) {
68
  continue;
69
  }
70
+ if ( is_callable( array( $data_item, 'get_data' ) ) ) {
71
+ $data = $data_type->get_data( $data_item );
72
+ $this->add_contact( $list_id, $data );
73
+ }
74
 
75
  // Check if we have WC_Order object.
76
  if ( $data_item instanceof WC_Order && is_callable( array( $data_item, 'get_items' ) ) ) {
lite/includes/workflows/class-es-workflow-query.php CHANGED
@@ -77,16 +77,20 @@ class ES_Workflow_Query {
77
  /**
78
  * Set trigger name or array of names to query.
79
  *
80
- * @param string|ES_Workflow_Trigger $trigger Workflow trigger object|name.
81
  */
82
  public function set_triggers( $triggers ) {
83
  if ( ! empty( $triggers ) ) {
84
- foreach ( $triggers as $trigger ) {
85
- if ( $trigger instanceof ES_Workflow_Trigger ) {
86
- $this->triggers[] = $trigger->get_name();
87
- } else {
88
- $this->triggers[] = $trigger;
 
 
89
  }
 
 
90
  }
91
  }
92
  }
77
  /**
78
  * Set trigger name or array of names to query.
79
  *
80
+ * @param string|ES_Workflow_Trigger[] $trigger Workflow trigger object|name.
81
  */
82
  public function set_triggers( $triggers ) {
83
  if ( ! empty( $triggers ) ) {
84
+ if ( is_array( $triggers ) ) {
85
+ foreach ( $triggers as $trigger ) {
86
+ if ( $trigger instanceof ES_Workflow_Trigger ) {
87
+ $this->triggers[] = $trigger->get_name();
88
+ } else {
89
+ $this->triggers[] = $trigger;
90
+ }
91
  }
92
+ } else if ( is_string( $triggers ) ) {
93
+ $this->triggers[] = $triggers;
94
  }
95
  }
96
  }
lite/includes/workflows/class-ig-es-replace-helper.php CHANGED
@@ -28,6 +28,7 @@ class IG_ES_Replace_Helper {
28
 
29
  /**
30
  * Pattern string
 
31
  * @var string
32
  */
33
  public $string;
@@ -74,6 +75,7 @@ class IG_ES_Replace_Helper {
74
 
75
  /**
76
  * Pre process match before using the actual callback
 
77
  * @param $match
78
  * @return string
79
  */
28
 
29
  /**
30
  * Pattern string
31
+ *
32
  * @var string
33
  */
34
  public $string;
75
 
76
  /**
77
  * Pre process match before using the actual callback
78
+ *
79
  * @param $match
80
  * @return string
81
  */
lite/includes/workflows/class-ig-es-variables.php CHANGED
@@ -108,6 +108,7 @@ class IG_ES_Variables {
108
 
109
  /**
110
  * Variable class object
 
111
  * @var IG_ES_Variable $variable_object
112
  */
113
  $variable_object = require_once $path;
108
 
109
  /**
110
  * Variable class object
111
+ *
112
  * @var IG_ES_Variable $variable_object
113
  */
114
  $variable_object = require_once $path;
lite/includes/workflows/class-ig-es-workflow-variable-parser.php CHANGED
@@ -14,8 +14,7 @@ class IG_ES_Workflow_Variable_Parser {
14
  /**
15
  * Variable name
16
  * e.g. wc_order.id, cart.link, user.first_name etc
17
- *
18
- *
19
  * @var string
20
  */
21
  public $name;
@@ -110,6 +109,7 @@ class IG_ES_Workflow_Variable_Parser {
110
 
111
  /**
112
  * Remove single quotes from start and end of a string
 
113
  * @param $string
114
  * @return string
115
  */
14
  /**
15
  * Variable name
16
  * e.g. wc_order.id, cart.link, user.first_name etc
17
+ *
 
18
  * @var string
19
  */
20
  public $name;
109
 
110
  /**
111
  * Remove single quotes from start and end of a string
112
+ *
113
  * @param $string
114
  * @return string
115
  */
lite/includes/workflows/workflow-helper-functions.php CHANGED
@@ -88,7 +88,8 @@ function ig_es_generate_key( $length = 25, $case_sensitive = true, $more_numbers
88
  }
89
 
90
  /**
91
- * str_replace but limited to one replacement
 
92
  * @param string$subject
93
  * @param string$find
94
  * @param string $replace
88
  }
89
 
90
  /**
91
+ * Does str_replace but limited to one replacement
92
+ *
93
  * @param string$subject
94
  * @param string$find
95
  * @param string $replace
lite/public/class-email-subscribers-public.php CHANGED
@@ -324,7 +324,7 @@ class Email_Subscribers_Public {
324
  'status' => 'subscribed',
325
  'subscribed_at' => ig_get_current_date_time(),
326
  'optin_type' => $optin_type,
327
- 'subscribed_ip' => ig_es_get_ip(),
328
  );
329
 
330
  ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
324
  'status' => 'subscribed',
325
  'subscribed_at' => ig_get_current_date_time(),
326
  'optin_type' => $optin_type,
327
+ 'subscribed_ip' => '',
328
  );
329
 
330
  ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
readme.txt CHANGED
@@ -4,9 +4,9 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
- Tested up to: 5.6
8
  Requires PHP: 5.6
9
- Stable tag: 4.6.9
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
@@ -304,6 +304,12 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
304
 
305
  == Changelog ==
306
 
 
 
 
 
 
 
307
  **4.6.9 (05.02.2021)**
308
 
309
  * New: Added placeholder keyword support for WooCommerce [PRO]
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
+ Tested up to: 5.6.1
8
  Requires PHP: 5.6
9
+ Stable tag: 4.6.10
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
304
 
305
  == Changelog ==
306
 
307
+ **4.6.10 (15.02.2021)**
308
+
309
+ * New: Added additional stats on campaigns reports dashboard
310
+ * Update: Disable IP tracking in lite version by default to make GDPR compliant
311
+ * Fix: Database vulnerability
312
+
313
  **4.6.9 (05.02.2021)**
314
 
315
  * New: Added placeholder keyword support for WooCommerce [PRO]