Email Subscribers & Newsletters - Version 5.4.6

Version Description

  • New: New workflow trigger for Paid Membership Pro [PRO]
  • New: New workflow trigger for Ultimate Membe [PRO]
  • Update: Added product rule for WooCommerce order workflow [PRO]

=

Download this release

Release Info

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

Code changes from version 5.4.5 to 5.4.6

email-subscribers.php CHANGED
@@ -3,7 +3,7 @@
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: 5.4.5
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
@@ -187,7 +187,7 @@ if ( 'premium' === $ig_es_plan ) {
187
  /* ***************************** Initial Compatibility Work (End) ******************* */
188
 
189
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
190
- define( 'ES_PLUGIN_VERSION', '5.4.5' );
191
  }
192
 
193
  // Plugin Folder Path.
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: 5.4.6
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
187
  /* ***************************** Initial Compatibility Work (End) ******************* */
188
 
189
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
190
+ define( 'ES_PLUGIN_VERSION', '5.4.6' );
191
  }
192
 
193
  // Plugin Folder Path.
lite/admin/class-es-campaign-admin.php CHANGED
@@ -237,7 +237,7 @@ if ( ! class_exists( 'ES_Campaign_Admin' ) ) {
237
  public function show_campaign_preview_options_content( $campaign_data = array() ) {
238
 
239
  $type = isset( $campaign_data['type'] ) ? $campaign_data['type'] : 'campaign';
240
- $subject = $campaign_data['subject'];
241
  $test_email = ES_Common::fetch_admin_email();
242
  ?>
243
 
237
  public function show_campaign_preview_options_content( $campaign_data = array() ) {
238
 
239
  $type = isset( $campaign_data['type'] ) ? $campaign_data['type'] : 'campaign';
240
+ $subject = isset( $campaign_data['subject'] ) ? $campaign_data['subject'] : '';
241
  $test_email = ES_Common::fetch_admin_email();
242
  ?>
243
 
lite/admin/css/email-subscribers-admin.css CHANGED
@@ -2690,3 +2690,22 @@ top: 50%;}
2690
  height: 35px;
2691
  }
2692
  /** DND form build CSS - END **/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2690
  height: 35px;
2691
  }
2692
  /** DND form build CSS - END **/
2693
+
2694
+ /** Workflow Rules CSS - START **/
2695
+ .ig-es-rule-group:not(:first-child){
2696
+ margin-top:20px;
2697
+ border-top: 2px solid #CCC;
2698
+ }
2699
+ .ig-es-rule-group,.ig-es-rule-container,.ig-es-rule-group .ig-es-rule__fields,.ig-es-rule__fields .select2-container{
2700
+ width: 100% !important;
2701
+ }
2702
+ .ig-es-rule__fields .ig-es-rule-select-container{
2703
+ width: 26%;
2704
+ }
2705
+ .ig-es-rule__fields .ig-es-rule-field-compare{
2706
+ width: 16%;
2707
+ }
2708
+ .ig-es-rule__fields .ig-es-rule-field-value{
2709
+ width: 58%;
2710
+ }
2711
+ /** Workflow Rules CSS - END **/
lite/admin/js/email-subscribers-admin.js CHANGED
@@ -233,7 +233,7 @@
233
  })
234
 
235
  //Upsell Send confirmation email on Audience screen
236
- $(".email-subscribers_page_es_subscribers #bulk-action-selector-top option[value=bulk_send_confirmation_email_upsell").attr('disabled','disabled');
237
  jQuery(".es-audience-view .bulkactions #bulk-action-selector-top").after(statusselect);
238
  jQuery(".es-audience-view .bulkactions #bulk-action-selector-top").after(groupselect);
239
 
@@ -1392,6 +1392,7 @@
1392
  init: function() {
1393
  IG_ES_Workflows.init_triggers_box();
1394
  IG_ES_Workflows.init_actions_box();
 
1395
  IG_ES_Workflows.init_variables_box();
1396
  IG_ES_Workflows.init_show_hide();
1397
  IG_ES_Workflows.init_workflow_status_switch();
@@ -1566,6 +1567,7 @@
1566
  IG_ES_Workflows.$triggers_box.find('tbody').append( response.data.fields );
1567
  IG_ES_Workflows.$triggers_box.removeClass('ig-es-loading');
1568
  IG_ES_Workflows.$triggers_box.find('.js-trigger-description').html( '<p class="ig-es-field-description">' + response.data.trigger.description + '</p>' );
 
1569
  });
1570
  } else {
1571
  $('.ig-es-variables-group').addClass('hidden');
@@ -1573,6 +1575,377 @@
1573
  }
1574
  },
1575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1576
  /**
1577
  *
1578
  */
233
  })
234
 
235
  //Upsell Send confirmation email on Audience screen
236
+ $(".email-subscribers_page_es_subscribers #bulk-action-selector-top option[value=bulk_send_confirmation_email_upsell]").attr('disabled','disabled');
237
  jQuery(".es-audience-view .bulkactions #bulk-action-selector-top").after(statusselect);
238
  jQuery(".es-audience-view .bulkactions #bulk-action-selector-top").after(groupselect);
239
 
1392
  init: function() {
1393
  IG_ES_Workflows.init_triggers_box();
1394
  IG_ES_Workflows.init_actions_box();
1395
+ IG_ES_Workflows.init_rules_box();
1396
  IG_ES_Workflows.init_variables_box();
1397
  IG_ES_Workflows.init_show_hide();
1398
  IG_ES_Workflows.init_workflow_status_switch();
1567
  IG_ES_Workflows.$triggers_box.find('tbody').append( response.data.fields );
1568
  IG_ES_Workflows.$triggers_box.removeClass('ig-es-loading');
1569
  IG_ES_Workflows.$triggers_box.find('.js-trigger-description').html( '<p class="ig-es-field-description">' + response.data.trigger.description + '</p>' );
1570
+ $(document).trigger('ig_es_workflow_trigger_updated', [response.data]);
1571
  });
1572
  } else {
1573
  $('.ig-es-variables-group').addClass('hidden');
1575
  }
1576
  },
1577
 
1578
+ init_rules_box: function () {
1579
+ try {
1580
+ //All rules avalilable in ES workflow
1581
+ let rule_details = igEsWorkflowRules;
1582
+ let all_rules = rule_details?.all_rules;
1583
+ let grouped_rules = [];
1584
+ let valid_rules = {};
1585
+
1586
+ let $meta_box_footer = $('.rules-metabox-footer');
1587
+ let $rule_template_container = $('#rule-template-container');
1588
+ let $rules_container = $('#ig-es-rules-container');
1589
+
1590
+ //Add new rule group.
1591
+ $(document).on('click', '.ig-es-add-rule-group', function () {
1592
+ let $new_rule_group = add_new_rule_group();
1593
+ $rules_container.append($new_rule_group);
1594
+ });
1595
+
1596
+ //Add one more rules in respective rule group
1597
+ $(document).on('click', '.ig-es-rule__add', function () {
1598
+ let $rule_group = $(this).closest('.ig-es-rule-group');
1599
+
1600
+ let rule_id = get_unique_number();
1601
+ let rule_group_id = $rule_group.data('group-id');
1602
+
1603
+ $new_rule_container = $rule_template_container.find('.ig-es-rule-container').clone();
1604
+ $new_rule_container.data('rule-id', rule_id);
1605
+ add_rule_container_to_rule_group($new_rule_container, rule_group_id, rule_id);
1606
+
1607
+ $rule_group.append($new_rule_container);
1608
+ });
1609
+
1610
+ //Remove rule from the respective rule group..If there is no rules in the group, then remove entire rule group
1611
+ $(document).on('click', '.ig-es-rule__remove', function () {
1612
+ let $rule_group = $(this).closest('.ig-es-rule-group');
1613
+
1614
+ let rules_count = $rule_group.find('.ig-es-rule-container').length;
1615
+ if (rules_count > 1) {
1616
+ $(this).closest('.ig-es-rule-container').remove();
1617
+ } else {
1618
+ $rule_group.remove();
1619
+ }
1620
+ validate_and_show_option_to_add_rules(false);
1621
+ });
1622
+
1623
+ //On selecting rule, reset the compare field and value field
1624
+ $(document).on('change', '.rule-select-field', function () {
1625
+ let $rule_group = $(this).closest('.ig-es-rule-group');
1626
+ let $rule_container = $(this).closest('.ig-es-rule-container');
1627
+ let $compare_field = $rule_container.find('.rule-compare-field');
1628
+
1629
+ let rule_name = $(this).val();
1630
+ let rule_group_id = $rule_group.data('group-id');
1631
+ let rule_id = $rule_container.data('rule-id');
1632
+
1633
+ render_compare_field($rule_container, $compare_field, rule_group_id, rule_id, {name: rule_name})
1634
+ });
1635
+
1636
+ // Reset everything while changing the trigger
1637
+ $(document).on('ig_es_workflow_trigger_updated', function (e, data) {
1638
+ filter_valid_rules(data?.trigger?.supplied_data_items,data?.trigger?.name);
1639
+ validate_and_show_option_to_add_rules(true);
1640
+ });
1641
+
1642
+ /**
1643
+ * Get the timestamp for Rule group ID and Rule ID.
1644
+ *
1645
+ * @returns {number}
1646
+ */
1647
+ const get_unique_number = function () {
1648
+ return Date.now();
1649
+ }
1650
+
1651
+ /**
1652
+ * Render the compare field and value field of the respective rule container
1653
+ * @param $rule_container
1654
+ * @param $compare_field
1655
+ * @param rule_group_id
1656
+ * @param rule_id
1657
+ * @param rule_details
1658
+ */
1659
+ const render_compare_field = function ($rule_container, $compare_field, rule_group_id = 0, rule_id = 0, rule_details = {}) {
1660
+ let rule_name = rule_details?.name;
1661
+ if (rule_name && rule_name.length > 1) {
1662
+ let rule = all_rules[rule_name];
1663
+ let compare_types = rule?.compare_types;
1664
+ if (compare_types && Object.keys(compare_types).length > 0) {
1665
+ for (const compare_name in compare_types) {
1666
+ var option = "<option value='" + compare_name + "'>" + compare_types[compare_name] + "</option>";
1667
+ $compare_field.append(option);
1668
+ }
1669
+ let rule_compare = rule_details?.compare;
1670
+ if (rule_compare) {
1671
+ $compare_field.val(rule_compare);
1672
+ }
1673
+ $compare_field.removeAttr('disabled')
1674
+ }
1675
+ add_rule_value_field($rule_container, rule, rule_group_id, rule_id, rule_details);
1676
+ } else {
1677
+ $compare_field.html('');
1678
+ $compare_field.attr('disabled', true);
1679
+ add_rule_value_field($rule_container, {type: ''}, rule_group_id, rule_id, rule_details)
1680
+ }
1681
+ }
1682
+
1683
+ /**
1684
+ * Add new rule group to the wokflow
1685
+ *
1686
+ * @param group_id
1687
+ * @param rule_id
1688
+ * @param include_default_rule
1689
+ * @returns {boolean|*}
1690
+ */
1691
+ const add_new_rule_group = function (group_id, rule_id = 0, include_default_rule = true) {
1692
+ $rules_container.find('.ig-es-rules-empty-message').remove();
1693
+ $rules_container.find('.ig-es-no-rules-message').remove();
1694
+
1695
+ let total_rule_groups = $rules_container.find('.ig-es-rule-group').length;
1696
+ if (!group_id) {
1697
+ group_id = get_unique_number();
1698
+ }
1699
+
1700
+ //For this release allow only one rule group. Remove IF/ELSE statement to allow multiple rule groups
1701
+ if (total_rule_groups >= 1) {
1702
+ return false;
1703
+ } else {
1704
+ $meta_box_footer.addClass('hidden');
1705
+ }
1706
+
1707
+ let $new_rule_group = $rule_template_container.find('.ig-es-rule-group').clone();
1708
+ $new_rule_group.data('group-id', group_id);
1709
+
1710
+ if (include_default_rule) {
1711
+ let $new_rule_container = $rule_template_container.find('.ig-es-rule-container').clone();
1712
+ $new_rule_container.data('rule-id', 0);
1713
+
1714
+ add_rule_container_to_rule_group($new_rule_container, group_id, rule_id);
1715
+ $new_rule_group.append($new_rule_container)
1716
+ }
1717
+
1718
+ return $new_rule_group;
1719
+ }
1720
+
1721
+ /**
1722
+ * Add rule to rule group
1723
+ * @param $rule_container
1724
+ * @param rule_group_id
1725
+ * @param rule_id
1726
+ * @param rule_details
1727
+ */
1728
+ const add_rule_container_to_rule_group = function ($rule_container, rule_group_id, rule_id, rule_details = {}) {
1729
+ let $rule_select_field = $rule_container.find('.rule-select-field')
1730
+ if (Object.keys(grouped_rules).length > 0) {
1731
+ for (const group_name in grouped_rules) {
1732
+ if (grouped_rules.hasOwnProperty(group_name)) {
1733
+ let $option_group = $(`<optgroup label='${group_name}'>`);
1734
+ let rules = grouped_rules[group_name];
1735
+ for (i = 0; i < rules.length; i++) {
1736
+ var option = "<option value='" + rules[i].name + "'>" + rules[i].title + "</option>";
1737
+ $option_group.append(option);
1738
+ }
1739
+ $rule_select_field.append($option_group);
1740
+ }
1741
+ $rule_select_field.removeAttr('disabled');
1742
+ }
1743
+ }
1744
+ let rule_name = rule_details?.name
1745
+ $rule_select_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][name]');
1746
+ $rule_select_field.val(rule_name);
1747
+
1748
+ $rule_compare_field = $rule_container.find('.rule-compare-field');
1749
+ $rule_compare_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][compare]');
1750
+ render_compare_field($rule_container, $rule_compare_field, rule_group_id, rule_id, rule_details);
1751
+
1752
+ $rule_container.find('.rule-value-field').attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value]');
1753
+ }
1754
+
1755
+ /**
1756
+ * Render the rule value field based on rule settings
1757
+ * @param $rule_group_container
1758
+ * @param rule
1759
+ * @param rule_group_id
1760
+ * @param rule_id
1761
+ * @param rule_details
1762
+ */
1763
+ const add_rule_value_field = function ($rule_group_container, rule, rule_group_id, rule_id, rule_details = {}) {
1764
+ let rule_value = rule_details?.value;
1765
+ switch (rule.type) {
1766
+ case "select":
1767
+ let $select_value_field = $rule_template_container.find('.rule-value-select-field').clone();
1768
+ if (rule.placeholder) {
1769
+ $select_value_field.data('placeholder', rule.placeholder)
1770
+ }
1771
+ if (rule.is_single_select) {
1772
+ $select_value_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value]');
1773
+ } else {
1774
+ $select_value_field.attr('multiple', 'multiple');
1775
+ $select_value_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value][]');
1776
+ $select_value_field.addClass('ig-es-form-multiselect');
1777
+ }
1778
+ let select_choices = rule?.select_choices;
1779
+ if (select_choices) {
1780
+ for (const value in select_choices) {
1781
+ if (select_choices.hasOwnProperty(value)) {
1782
+ let selected = false;
1783
+ if (rule_value) {
1784
+ if (Array.isArray(rule_value)) {
1785
+ if (rule_value.includes(value)) {
1786
+ selected = true;
1787
+ }
1788
+ } else {
1789
+ if (rule_value === value) {
1790
+ selected = true;
1791
+ }
1792
+ }
1793
+ }
1794
+ let $option = `<option value='${value}' ${selected?'selected':''}>${select_choices[value]}</option>`;
1795
+ $select_value_field.append($option);
1796
+ }
1797
+ }
1798
+ }
1799
+ $rule_group_container.find('.ig-es-rule-field-value').html($select_value_field);
1800
+ // $('body').trigger('wc-enhanced-select-init');
1801
+ $select_value_field.ig_es_select2();
1802
+ break;
1803
+ case "object":
1804
+ let selected_values = rule_details?.selected;
1805
+ let $object_value_field = $rule_template_container.find('.rule-value-object-field').clone();
1806
+ if (rule.class) {
1807
+ $object_value_field.addClass(rule.class)
1808
+ }
1809
+ if (rule.placeholder) {
1810
+ $object_value_field.data('placeholder', rule.placeholder)
1811
+ }
1812
+ if (rule.ajax_action) {
1813
+ $object_value_field.data('action', rule.ajax_action)
1814
+ }
1815
+ if (rule.is_multi) {
1816
+ $object_value_field.attr('multiple', 'multiple')
1817
+ $object_value_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value][]');
1818
+ if(rule_value) {
1819
+ for (let i = 0; i < rule_value.length; i++) {
1820
+ var option = "<option value='" + rule_value[i] + "' selected>" + selected_values[i] + "</option>";
1821
+ $object_value_field.append(option);
1822
+ }
1823
+ }
1824
+ } else {
1825
+ $object_value_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value]');
1826
+ if(rule_value) {
1827
+ var option = "<option value='" + rule_value + "' selected>" + selected_values + "</option>";
1828
+ $object_value_field.append(option);
1829
+ }
1830
+ }
1831
+ $rule_group_container.find('.ig-es-rule-field-value').html($object_value_field)
1832
+ $('body').trigger('wc-enhanced-select-init');
1833
+ break;
1834
+ default:
1835
+ let $default_value_field = $rule_template_container.find('.rule-value-text-field').clone();
1836
+ $default_value_field.attr('name', 'ig_es_workflow_data[rules][' + rule_group_id + '][' + rule_id + '][value]');
1837
+ $rule_group_container.find('.ig-es-rule-field-value').html($default_value_field)
1838
+ break;
1839
+ }
1840
+ }
1841
+
1842
+ /**
1843
+ * Validate the rules for trigger and toggle action buttons for the rules
1844
+ * @param force_reset
1845
+ */
1846
+ const validate_and_show_option_to_add_rules = function (force_reset = false) {
1847
+ let rule_groups_count = $rules_container.find('.ig-es-rule-group').length;
1848
+ if (rule_groups_count > 0 && !force_reset) {
1849
+ return;
1850
+ }
1851
+ let $rule_groups = $rules_container.find('.ig-es-rule-group');
1852
+ let has_valid_rules = false;
1853
+ if ($rule_groups.length > 0) {
1854
+ $rule_groups.each(function (index) {
1855
+ let $rule_group = $(this);
1856
+ let $rules = $rule_group.find('.ig-es-rule-container');
1857
+ let total_rules_count = $rules.length;
1858
+ let valid_rules_count = 0;
1859
+ if (total_rules_count > 0) {
1860
+ $rules.each(function (index) {
1861
+ let $rule = $(this);
1862
+ let rule_name = $rule.find('.rule-select-field').val();
1863
+ if (valid_rules.hasOwnProperty(rule_name)) {
1864
+ has_valid_rules = true;
1865
+ valid_rules_count += 1;
1866
+ } else {
1867
+ $rule.remove();
1868
+ }
1869
+ });
1870
+ }
1871
+ if (valid_rules_count <= 0) {
1872
+ $rule_group.remove();
1873
+ }
1874
+ });
1875
+ }
1876
+ if (has_valid_rules) {
1877
+ return;
1878
+ } else {
1879
+ $rules_container.html('')
1880
+ }
1881
+ if (Object.keys(grouped_rules).length > 0) {
1882
+ $rule_template_container.find('.ig-es-rules-empty-message').clone().appendTo($rules_container)
1883
+ $meta_box_footer.removeClass('hidden');
1884
+ } else {
1885
+ $meta_box_footer.addClass('hidden');
1886
+ $rule_template_container.find('.ig-es-no-rules-message').clone().appendTo($rules_container)
1887
+ }
1888
+ }
1889
+
1890
+ /**
1891
+ * Filter the valid rules for the trigger
1892
+ * @param supplied_data_items
1893
+ */
1894
+ const filter_valid_rules = function (supplied_data_items,trigger_name) {
1895
+ grouped_rules = [];
1896
+ valid_rules = {};
1897
+ if (supplied_data_items) {
1898
+ for (const rule_name in all_rules) {
1899
+ if (all_rules.hasOwnProperty(rule_name)) {
1900
+ let rule = all_rules[rule_name];
1901
+ let excluded_triggers = rule.excluded_triggers;
1902
+ if (supplied_data_items.includes(rule.data_item) && !excluded_triggers.includes(trigger_name)) {
1903
+ if (!grouped_rules[rule.group]) {
1904
+ grouped_rules[rule.group] = []
1905
+ }
1906
+ grouped_rules[rule.group].push(rule);
1907
+ valid_rules[rule_name] = rule;
1908
+ }
1909
+ }
1910
+ }
1911
+ }
1912
+ }
1913
+
1914
+ /**
1915
+ * While editing the workflow, render the rules
1916
+ */
1917
+ const render_existing_rules = function () {
1918
+ let workflow_rules = rule_details?.workflow_rules;
1919
+ filter_valid_rules(rule_details?.supplied_data_items,rule_details?.trigger_name);
1920
+ validate_and_show_option_to_add_rules(true);
1921
+ if (workflow_rules.length > 0) {
1922
+ for (let group_id = 0; group_id < workflow_rules.length; group_id++) {
1923
+ let rules = workflow_rules[group_id];
1924
+ let rule_group_id = get_unique_number() + group_id;
1925
+ let $new_rule_group = add_new_rule_group(rule_group_id, 0, false);
1926
+ for (let rule_id = 0; rule_id < rules.length; rule_id++) {
1927
+ let saved_rule = rules[rule_id];
1928
+ let original_rule = all_rules[saved_rule.name];
1929
+
1930
+ let $new_rule_container = $rule_template_container.find('.ig-es-rule-container').clone();
1931
+ $new_rule_container.data('rule-id', rule_id);
1932
+ let unique_rule_id = get_unique_number() + group_id;
1933
+
1934
+ add_rule_container_to_rule_group($new_rule_container, rule_group_id, unique_rule_id, saved_rule);
1935
+
1936
+ $new_rule_group.append($new_rule_container)
1937
+ }
1938
+ $rules_container.append($new_rule_group)
1939
+ }
1940
+ }
1941
+ }
1942
+
1943
+ render_existing_rules();
1944
+ } catch (e) {
1945
+
1946
+ }
1947
+ },
1948
+
1949
  /**
1950
  *
1951
  */
lite/includes/class-email-subscribers.php CHANGED
@@ -840,6 +840,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
840
  // Workflow Abstracts
841
  'lite/includes/workflows/abstracts/class-es-workflow-registry.php',
842
  'lite/includes/workflows/abstracts/class-es-workflow-trigger.php',
 
843
  'lite/includes/workflows/abstracts/class-es-workflow-action.php',
844
  'lite/includes/workflows/abstracts/class-es-workflow-data-type.php',
845
  'lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php',
@@ -911,6 +912,15 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
911
  'lite/includes/workflows/class-es-workflow-actions.php',
912
  'lite/includes/workflows/class-es-workflow-action-preview.php',
913
 
 
 
 
 
 
 
 
 
 
914
  // Workflow Query
915
  'lite/includes/workflows/class-es-workflow-query.php',
916
 
840
  // Workflow Abstracts
841
  'lite/includes/workflows/abstracts/class-es-workflow-registry.php',
842
  'lite/includes/workflows/abstracts/class-es-workflow-trigger.php',
843
+ 'lite/includes/workflows/abstracts/class-es-workflow-rule.php',
844
  'lite/includes/workflows/abstracts/class-es-workflow-action.php',
845
  'lite/includes/workflows/abstracts/class-es-workflow-data-type.php',
846
  'lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php',
912
  'lite/includes/workflows/class-es-workflow-actions.php',
913
  'lite/includes/workflows/class-es-workflow-action-preview.php',
914
 
915
+ // Abstracts workflow rules
916
+ 'lite/includes/workflows/rules/abstracts/class-es-rule-select-abstract.php',
917
+ 'lite/includes/workflows/rules/abstracts/class-es-rule-searchable-select-abstract.php',
918
+ 'lite/includes/workflows/rules/abstracts/class-es-rule-preloaded-select-abstract.php',
919
+ 'lite/includes/workflows/rules/abstracts/class-es-rule-product-select-abstract.php',
920
+
921
+ // Workflow Rules
922
+ 'lite/includes/workflows/class-es-workflow-rules.php',
923
+
924
  // Workflow Query
925
  'lite/includes/workflows/class-es-workflow-query.php',
926
 
lite/includes/class-es-install.php CHANGED
@@ -301,6 +301,10 @@ if ( ! class_exists( 'ES_Install' ) ) {
301
  'ig_es_update_540_alter_contacts_table',
302
  'ig_es_update_540_db_version',
303
  ),
 
 
 
 
304
  );
305
 
306
  /**
301
  'ig_es_update_540_alter_contacts_table',
302
  'ig_es_update_540_db_version',
303
  ),
304
+ '5.5.0' => array(
305
+ 'ig_es_migrate_workflow_trigger_conditions_to_rules',
306
+ 'ig_es_update_550_db_version',
307
+ ),
308
  );
309
 
310
  /**
lite/includes/classes/class-es-admin-settings.php CHANGED
@@ -403,10 +403,21 @@ class ES_Admin_Settings {
403
 
404
  $signup_confirmation_settings = apply_filters( 'ig_es_registered_signup_confirmation_settings', $signup_confirmation_settings );
405
 
 
 
 
 
 
 
 
 
 
 
 
406
  $cron_url_setting_desc = '';
407
 
408
  if ( ES()->trial->is_trial_valid() || ES()->is_premium() ) {
409
- $cron_url_setting_desc = '<span class="es-send-success es-icon"></span>' . esc_html__( ' We will take care of it. You don\'t need to visit this URL manually.', 'email-subscribers' );
410
  } else {
411
  /* translators: %s: Link to Icegram documentation */
412
  $cron_url_setting_desc = sprintf( __( "You need to visit this URL to send email notifications. Know <a href='%s' target='_blank'>how to run this in background</a>", 'email-subscribers' ), 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page' );
403
 
404
  $signup_confirmation_settings = apply_filters( 'ig_es_registered_signup_confirmation_settings', $signup_confirmation_settings );
405
 
406
+ if ( ES()->trial->is_trial_valid() || ES()->is_premium() ) {
407
+ $gmt_offset = ig_es_get_gmt_offset( true );
408
+ $icegram_cron_last_hit_timestamp = get_option( 'ig_es_cron_last_hit' );
409
+ $icegram_cron_last_hit_message = '';
410
+ if ( !empty( $icegram_cron_last_hit_timestamp['icegram_timestamp'] ) ) {
411
+ $icegram_timestamp_with_gmt_offset = $icegram_cron_last_hit_timestamp['icegram_timestamp'] + $gmt_offset;
412
+ $icegram_cron_last_hit_date_and_time = ES_Common::convert_timestamp_to_date( $icegram_timestamp_with_gmt_offset );
413
+ $icegram_cron_last_hit_message = __( '<br><span class="ml-6">Cron last hit time : <b>' . $icegram_cron_last_hit_date_and_time . '</b></span>', 'email-subscribers' );
414
+ }
415
+ }
416
+
417
  $cron_url_setting_desc = '';
418
 
419
  if ( ES()->trial->is_trial_valid() || ES()->is_premium() ) {
420
+ $cron_url_setting_desc = __( '<span class="es-send-success es-icon"></span> We will take care of it. You don\'t need to visit this URL manually.' . $icegram_cron_last_hit_message, 'email-subscribers' );
421
  } else {
422
  /* translators: %s: Link to Icegram documentation */
423
  $cron_url_setting_desc = sprintf( __( "You need to visit this URL to send email notifications. Know <a href='%s' target='_blank'>how to run this in background</a>", 'email-subscribers' ), 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page' );
lite/includes/classes/class-es-cron.php CHANGED
@@ -390,6 +390,8 @@ class ES_Cron {
390
  * @return bool
391
  *
392
  * @since 4.3.3
 
 
393
  */
394
  public function set_last_hit() {
395
 
@@ -397,6 +399,11 @@ class ES_Cron {
397
 
398
  $last_hit['timestamp'] = time();
399
 
 
 
 
 
 
400
  return update_option( 'ig_es_cron_last_hit', $last_hit );
401
  }
402
 
@@ -449,7 +456,7 @@ class ES_Cron {
449
  *
450
  * @since 4.0.0
451
  *
452
- * @modify 4.3.1
453
  */
454
  public function handle_cron_request() {
455
 
390
  * @return bool
391
  *
392
  * @since 4.3.3
393
+ *
394
+ * @modify 5.4.5
395
  */
396
  public function set_last_hit() {
397
 
399
 
400
  $last_hit['timestamp'] = time();
401
 
402
+ if ( isset( $_SERVER['HTTP_X_ES_EMAIL_SENDING_LIMIT'] ) ) {
403
+ $last_hit['icegram_timestamp'] = time();
404
+ }
405
+
406
+
407
  return update_option( 'ig_es_cron_last_hit', $last_hit );
408
  }
409
 
456
  *
457
  * @since 4.0.0
458
  *
459
+ * @modify 5.4.5.
460
  */
461
  public function handle_cron_request() {
462
 
lite/includes/upgrade/es-update-functions.php CHANGED
@@ -1908,3 +1908,74 @@ function ig_es_update_540_db_version() {
1908
  }
1909
 
1910
  /* --------------------- ES 5.4.0(End)--------------------------- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1908
  }
1909
 
1910
  /* --------------------- ES 5.4.0(End)--------------------------- */
1911
+
1912
+ /* --------------------- ES 5.5.0(Start)--------------------------- */
1913
+
1914
+ /**
1915
+ * Migrate Existing Workflow trigger conditions to rules section
1916
+ *
1917
+ * @since 5.5.0
1918
+ */
1919
+ function ig_es_migrate_workflow_trigger_conditions_to_rules() {
1920
+ $workflows = ES()->workflows_db->get_workflows();
1921
+ if ( ! empty( $workflows ) ) {
1922
+ foreach ( $workflows as $workflow ) {
1923
+ $workflow_id = $workflow['id'];
1924
+ $trigger_name = $workflow['trigger_name'];
1925
+ $trigger_options = maybe_unserialize( $workflow['trigger_options'] );
1926
+ $data_to_update = array(
1927
+ 'rules' => maybe_serialize( array() ),
1928
+ 'trigger_options' => maybe_serialize( array() ),
1929
+ );
1930
+ $do_migration = true;
1931
+ $new_rule = array( array() );
1932
+
1933
+ switch ( $trigger_name ) {
1934
+ case 'ig_es_user_registered':
1935
+ $rule_value = ! empty( $trigger_options['ig-es-allowed-user-roles'] ) ? $trigger_options['ig-es-allowed-user-roles'] : array();
1936
+ if ( ! empty( $rule_value ) ) {
1937
+ $new_rule[0][] = array(
1938
+ 'name' => 'ig_es_user_role',
1939
+ 'compare' => 'matches_any',
1940
+ 'value' => $rule_value
1941
+ );
1942
+ $data_to_update['rules'] = maybe_serialize( $new_rule);
1943
+ } else {
1944
+ $do_migration = false;
1945
+ }
1946
+ break;
1947
+ case 'ig_es_user_unconfirmed':
1948
+ case 'ig_es_user_subscribed':
1949
+ $rule_value = ! empty( $trigger_options['ig-es-list'] ) ? $trigger_options['ig-es-list'] : array();
1950
+ if ( ! empty( $rule_value ) ) {
1951
+ $new_rule[0][] = array(
1952
+ 'name' => 'ig_es_subscriber_list',
1953
+ 'compare' => 'matches_any',
1954
+ 'value' => $rule_value
1955
+ );
1956
+ $data_to_update['rules'] = maybe_serialize( $new_rule);
1957
+ } else {
1958
+ $do_migration = false;
1959
+ }
1960
+ break;
1961
+ default:
1962
+ $do_migration = false;
1963
+ break;
1964
+ }
1965
+ if ( $do_migration ) {
1966
+ ES()->workflows_db->update( $workflow_id, $data_to_update );
1967
+ }
1968
+ }
1969
+ }
1970
+ }
1971
+
1972
+ /**
1973
+ * Update DB version
1974
+ *
1975
+ * @since 5.5.0
1976
+ */
1977
+ function ig_es_update_550_db_version() {
1978
+ ES_Install::update_db_version( '5.5.0' );
1979
+ }
1980
+
1981
+ /* --------------------- ES 5.5.0(End)--------------------------- */
lite/includes/workflows/abstracts/class-es-workflow-rule.php ADDED
@@ -0,0 +1,525 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Abstract rule class.
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit; // Exit if accessed directly.
12
+ }
13
+
14
+ if ( ! class_exists( 'Es_Workflow_Rule' ) ) {
15
+
16
+ /**
17
+ * Abstract class for workflow rules
18
+ *
19
+ * @class Es_Rule_Abstract
20
+ *
21
+ * @since 5.5.0
22
+ */
23
+ abstract class Es_Workflow_Rule {
24
+
25
+ /**
26
+ * Name of the rule
27
+ *
28
+ * @var string
29
+ */
30
+ public $name;
31
+
32
+ /**
33
+ * Title of the rule
34
+ *
35
+ * @var string
36
+ */
37
+ public $title;
38
+
39
+ /**
40
+ * Group that rules belongs to
41
+ * @var string
42
+ */
43
+ public $group;
44
+
45
+ /**
46
+ * Type of the rule
47
+ *
48
+ * @var string string|number|object|select
49
+ */
50
+ public $type;
51
+
52
+ /**
53
+ * Define the data type used by the rule.
54
+ *
55
+ * @var string
56
+ */
57
+ public $data_item;
58
+
59
+ /**
60
+ * Comparison type that the rule has used
61
+ *
62
+ * @var array
63
+ */
64
+ public $compare_types = [];
65
+
66
+ /**
67
+ * Workflow that the rule belongs to
68
+ *
69
+ * @var ES_Workflow
70
+ */
71
+ private $workflow;
72
+
73
+ /**
74
+ * Is that rule has multiple input value fields?
75
+ *
76
+ * @var bool - e.g meta rules have 2 value fields so their value data is an stored as an array
77
+ */
78
+ public $has_multiple_value_fields = false;
79
+
80
+ /**
81
+ * Some triggers excluded for particular rule
82
+ * @var array
83
+ */
84
+ public $excluded_triggers = array();
85
+
86
+ /**
87
+ * Constructor
88
+ */
89
+ public function __construct() {
90
+ $this->init();
91
+ $this->determine_rule_group();
92
+ }
93
+
94
+ /**
95
+ * Init the rule.
96
+ */
97
+ abstract public function init();
98
+
99
+ /**
100
+ * Validates that a given workflow data item passed the rule validation
101
+ * based on the supplied $compare_type and $value.
102
+ *
103
+ * @param mixed $data_item A valid workflow data item e.g. an instance of `\WC_Order` for an order based rule.
104
+ * @param string $compare_type The user selected compare type for the rule.
105
+ * @param mixed $value The user entered value for the rule. This value is validated by the validate_value() method beforehand.
106
+ *
107
+ * @return bool
108
+ */
109
+ abstract public function validate( $data_item, $compare_type, $value );
110
+
111
+ /**
112
+ * Validate the rule's user entered value.
113
+ *
114
+ * @param mixed $value
115
+ *
116
+ * @throws UnexpectedValueException When the value is not valid.
117
+ */
118
+ public function validate_value( $value ) {
119
+ // Override this method in child classes.
120
+ }
121
+
122
+ /**
123
+ * Get rule group
124
+ *
125
+ * @return string
126
+ */
127
+ public function get_group() {
128
+ return $this->group;
129
+ }
130
+
131
+ /**
132
+ * Get rule name
133
+ *
134
+ * @return string
135
+ */
136
+ public function get_name() {
137
+ return $this->name;
138
+ }
139
+
140
+ /**
141
+ * Get rule title
142
+ *
143
+ * @return string
144
+ */
145
+ public function get_title() {
146
+ return $this->title;
147
+ }
148
+
149
+ /**
150
+ * Set workflow
151
+ *
152
+ * @param $workflow
153
+ */
154
+ public function set_workflow( $workflow ) {
155
+ $this->workflow = $workflow;
156
+ }
157
+
158
+ /**
159
+ * Determine the rule group based on it's title.
160
+ *
161
+ * If the group prop is already set that will be used.
162
+ *
163
+ * @return void
164
+ */
165
+ public function determine_rule_group() {
166
+ if ( isset( $this->group ) ) {
167
+ return;
168
+ }
169
+
170
+ // extract the hyphenated part of the title and use as group
171
+ if ( isset( $this->title ) && strstr( $this->title, '-' ) ) {
172
+ list( $this->group ) = explode( ' - ', $this->title, 2 );
173
+ }
174
+
175
+ if ( empty( $this->group ) ) {
176
+ $this->group = __( 'Other', 'email-subscribers' );
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Get is/is not compare types.
182
+ *
183
+ * @return array
184
+ */
185
+ public function get_is_or_not_compare_types() {
186
+ return [
187
+ 'is' => __( 'is', 'email-subscribers' ),
188
+ 'is_not' => __( 'is not', 'email-subscribers' ),
189
+ ];
190
+ }
191
+
192
+
193
+ /**
194
+ * Get the string comparison types
195
+ *
196
+ * @return array
197
+ */
198
+ public function get_string_compare_types() {
199
+ return [
200
+ 'contains' => __( 'contains', 'email-subscribers' ),
201
+ 'not_contains' => __( 'does not contain', 'email-subscribers' ),
202
+ 'is' => __( 'is', 'email-subscribers' ),
203
+ 'is_not' => __( 'is not', 'email-subscribers' ),
204
+ 'starts_with' => __( 'starts with', 'email-subscribers' ),
205
+ 'ends_with' => __( 'ends with', 'email-subscribers' ),
206
+ 'blank' => __( 'is blank', 'email-subscribers' ),
207
+ 'not_blank' => __( 'is not blank', 'email-subscribers' ),
208
+ 'regex' => __( 'matches regex', 'email-subscribers' ),
209
+ ];
210
+ }
211
+
212
+
213
+ /**
214
+ * Get the multiple string comparison types
215
+ *
216
+ * @return array
217
+ */
218
+ public function get_multi_string_compare_types() {
219
+ return [
220
+ 'contains' => __( 'any contains', 'email-subscribers' ),
221
+ 'is' => __( 'any matches exactly', 'email-subscribers' ),
222
+ 'starts_with' => __( 'any starts with', 'email-subscribers' ),
223
+ 'ends_with' => __( 'any ends with', 'email-subscribers' ),
224
+ ];
225
+ }
226
+
227
+
228
+ /**
229
+ * Get the Float value comparison types
230
+ *
231
+ * @return array
232
+ */
233
+ public function get_float_compare_types() {
234
+ return $this->get_is_or_not_compare_types() + [
235
+ 'greater_than' => __( 'is greater than', 'email-subscribers' ),
236
+ 'less_than' => __( 'is less than', 'email-subscribers' ),
237
+ ];
238
+ }
239
+
240
+
241
+ /**
242
+ * Get the integer comparison types
243
+ *
244
+ * @return array
245
+ */
246
+ public function get_integer_compare_types() {
247
+ return $this->get_float_compare_types() + [
248
+ 'multiple_of' => __( 'is a multiple of', 'email-subscribers' ),
249
+ 'not_multiple_of' => __( 'is not a multiple of', 'email-subscribers' )
250
+ ];
251
+ }
252
+
253
+ /**
254
+ * Get multi-select match compare types.
255
+ *
256
+ * @return array
257
+ */
258
+ public function get_multi_select_compare_types() {
259
+ return [
260
+ 'matches_all' => __( 'matches all', 'email-subscribers' ),
261
+ 'matches_any' => __( 'matches any', 'email-subscribers' ),
262
+ 'matches_none' => __( 'matches none', 'email-subscribers' ),
263
+ ];
264
+ }
265
+
266
+ /**
267
+ * Get includes or not includes compare types.
268
+ *
269
+ * @return array
270
+ */
271
+ public function get_includes_or_not_compare_types() {
272
+ return [
273
+ 'includes' => __( 'includes', 'email-subscribers' ),
274
+ 'not_includes' => __( 'does not include', 'email-subscribers' ),
275
+ ];
276
+ }
277
+
278
+ /**
279
+ * Check the comparison type
280
+ *
281
+ * @param $compare_type
282
+ *
283
+ * @return bool
284
+ */
285
+ public function is_string_compare_type( $compare_type ) {
286
+ return array_key_exists( $compare_type, $this->get_string_compare_types() );
287
+ }
288
+
289
+
290
+ /**
291
+ * Check the comparison type
292
+ *
293
+ * @param $compare_type
294
+ *
295
+ * @return bool
296
+ */
297
+ public function is_integer_compare_type( $compare_type ) {
298
+ return array_key_exists( $compare_type, $this->get_integer_compare_types() );
299
+ }
300
+
301
+
302
+ /**
303
+ * Check the comparison type
304
+ *
305
+ * @param $compare_type
306
+ *
307
+ * @return bool
308
+ */
309
+ public function is_float_compare_type( $compare_type ) {
310
+ return array_key_exists( $compare_type, $this->get_float_compare_types() );
311
+ }
312
+
313
+
314
+ /**
315
+ * Get the is/is not comparison type
316
+ *
317
+ * @param $compare_type
318
+ *
319
+ * @return bool
320
+ */
321
+ public function is_is_or_is_not_compare_type( $compare_type ) {
322
+ return array_key_exists( $compare_type, $this->get_is_or_not_compare_types() );
323
+ }
324
+
325
+
326
+ /**
327
+ * Validate a string based rule value.
328
+ *
329
+ * @param string $actual_value
330
+ * @param string $compare_type
331
+ * @param string $expected_value
332
+ *
333
+ * @return bool
334
+ */
335
+ public function validate_string( $actual_value, $compare_type, $expected_value ) {
336
+
337
+ $actual_value = (string) $actual_value;
338
+ $expected_value = (string) $expected_value;
339
+
340
+ // most comparisons are case in-sensitive
341
+ $actual_value_lowercase = strtolower( $actual_value );
342
+ $expected_value_lowercase = strtolower( $expected_value );
343
+
344
+ switch ( $compare_type ) {
345
+
346
+ case 'is':
347
+ return $actual_value_lowercase == $expected_value_lowercase;
348
+
349
+ case 'is_not':
350
+ return $actual_value_lowercase != $expected_value_lowercase;
351
+
352
+ case 'contains':
353
+ return strstr( $actual_value_lowercase, $expected_value_lowercase ) !== false;
354
+
355
+ case 'not_contains':
356
+ return strstr( $actual_value_lowercase, $expected_value_lowercase ) === false;
357
+
358
+ case 'starts_with':
359
+ return str_starts_with( $actual_value_lowercase, $expected_value_lowercase );
360
+
361
+ case 'ends_with':
362
+ return str_ends_with( $actual_value_lowercase, $expected_value_lowercase );
363
+
364
+ case 'blank':
365
+ return empty( $actual_value );
366
+
367
+ case 'not_blank':
368
+ return ! empty( $actual_value );
369
+
370
+ case 'regex':
371
+ // Regex validation must not use case insensitive values
372
+ return $this->validate_string_regex( $actual_value, $expected_value );
373
+ }
374
+
375
+ return false;
376
+ }
377
+
378
+ /**
379
+ * Remove the global regex modifier as it is not supported by PHP.
380
+ *
381
+ * @param string $regex
382
+ *
383
+ * @return string
384
+ */
385
+ protected function remove_global_regex_modifier( $regex ) {
386
+ return preg_replace_callback( '/(\/[a-z]+)$/', function ( $modifiers ) {
387
+ return str_replace( 'g', '', $modifiers[0] );
388
+ }, $regex );
389
+ }
390
+
391
+ /**
392
+ * Validates string regex rule.
393
+ *
394
+ *
395
+ * @param string $string
396
+ * @param string $regex
397
+ *
398
+ * @return bool
399
+ */
400
+ protected function validate_string_regex( $string, $regex ) {
401
+ $regex = $this->remove_global_regex_modifier( trim( $regex ) );
402
+
403
+ // Add '/' delimiters if none are provided in the regex.
404
+ if ( ! preg_match( '#^/(.+)/[gi]*$#', $regex ) ) {
405
+
406
+ // Escape any unescaped delimiters in the regex first.
407
+ if ( preg_match( '#[^\\\\]/#', $regex ) ) {
408
+ $regex = str_replace( '/', '\\/', $regex );
409
+ }
410
+
411
+ $regex = '/' . $regex . '/';
412
+ }
413
+
414
+ return (bool) @preg_match( $regex, $string );
415
+ }
416
+
417
+
418
+ /**
419
+ * Only supports 'contains', 'is', 'starts_with', 'ends_with'
420
+ *
421
+ * @param array $actual_values
422
+ * @param string $compare_type
423
+ * @param string $expected_value
424
+ *
425
+ * @return bool
426
+ */
427
+ public function validate_string_multi( $actual_values, $compare_type, $expected_value ) {
428
+
429
+ if ( empty( $expected_value ) ) {
430
+ return false;
431
+ }
432
+
433
+ // look for at least one item that validates the text match
434
+ foreach ( $actual_values as $coupon_code ) {
435
+ if ( $this->validate_string( $coupon_code, $compare_type, $expected_value ) ) {
436
+ return true;
437
+ }
438
+ }
439
+
440
+ return false;
441
+ }
442
+
443
+
444
+ /**
445
+ * Check the given two numbers against the operator
446
+ *
447
+ * @param $actual_value
448
+ * @param $compare_type
449
+ * @param $expected_value
450
+ *
451
+ * @return bool
452
+ */
453
+ public function validate_number( $actual_value, $compare_type, $expected_value ) {
454
+
455
+ $actual_value = (float) $actual_value;
456
+ $expected_value = (float) $expected_value;
457
+
458
+ switch ( $compare_type ) {
459
+
460
+ case 'is':
461
+ return $actual_value == $expected_value;
462
+ break;
463
+
464
+ case 'is_not':
465
+ return $actual_value != $expected_value;
466
+ break;
467
+
468
+ case 'greater_than':
469
+ return $actual_value > $expected_value;
470
+ break;
471
+
472
+ case 'less_than':
473
+ return $actual_value < $expected_value;
474
+ break;
475
+
476
+ }
477
+
478
+
479
+ // validate 'multiple of' compares, only accept integers
480
+ if ( ! $this->is_whole_number( $actual_value ) || ! $this->is_whole_number( $expected_value ) ) {
481
+ return false;
482
+ }
483
+
484
+ $actual_value = (int) $actual_value;
485
+ $expected_value = (int) $expected_value;
486
+
487
+ switch ( $compare_type ) {
488
+
489
+ case 'multiple_of':
490
+ return 0 == $actual_value % $expected_value;
491
+
492
+ case 'not_multiple_of':
493
+ return 0!= $actual_value % $expected_value;
494
+ }
495
+
496
+ return false;
497
+ }
498
+
499
+
500
+ /**
501
+ * Check the given input is whole number or not
502
+ *
503
+ * @param $number
504
+ *
505
+ * @return bool
506
+ */
507
+ public function is_whole_number( $number ) {
508
+ $number = (float) $number;
509
+
510
+ return floor( $number ) == $number;
511
+ }
512
+
513
+ /**
514
+ * Format the given value
515
+ *
516
+ * @param $value
517
+ *
518
+ * @return mixed
519
+ */
520
+ public function format_value( $value ) {
521
+ return $value;
522
+ }
523
+
524
+ }
525
+ }
lite/includes/workflows/admin/class-es-workflow-admin-edit.php CHANGED
@@ -394,8 +394,9 @@ class ES_Workflow_Admin_Edit {
394
 
395
  $page_prefix = ES()->get_admin_page_prefix();
396
 
397
- add_meta_box( 'ig_es_workflow_trigger', __( 'Trigger', 'email-subscribers' ), array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
398
- add_meta_box( 'ig_es_workflow_actions', __( 'Actions', 'email-subscribers' ), array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
 
399
  add_meta_box( 'ig_es_workflow_save', __( 'Save', 'email-subscribers' ), array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
400
  add_meta_box( 'ig_es_workflow_variables', __( 'Placeholders', 'email-subscribers' ), array( __CLASS__, 'variables_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
401
 
@@ -490,6 +491,91 @@ class ES_Workflow_Admin_Edit {
490
  );
491
  }
492
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  /**
494
  * Save workflow meta box
495
  *
@@ -567,7 +653,7 @@ class ES_Workflow_Admin_Edit {
567
  $workflow_name = ! empty( $workflow_title ) ? sanitize_title( ES_Clean::string( $workflow_title ) ) : '';
568
  $trigger_name = isset( $posted['trigger_name'] ) ? ig_es_clean( $posted['trigger_name'] ) : '';
569
  $trigger_options = isset( $posted['trigger_options'] ) ? ig_es_clean( $posted['trigger_options'] ) : array();
570
- $rules = isset( $posted['rules'] ) ? ig_es_clean( $posted['rules'] ) : array();
571
  $actions = isset( $posted['actions'] ) ? $posted['actions'] : array(); // We can't sanitize actions data since some actions like Send email allows html in its field.
572
  $status = isset( $posted['status'] ) ? ig_es_clean( $posted['status'] ) : 0;
573
  $type = isset( $posted['type'] ) ? ig_es_clean( $posted['type'] ) : 0;
@@ -641,6 +727,39 @@ class ES_Workflow_Admin_Edit {
641
  return $workflow_id;
642
  }
643
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
644
  /**
645
  * Update campaign data in workflow
646
  *
394
 
395
  $page_prefix = ES()->get_admin_page_prefix();
396
 
397
+ add_meta_box( 'ig_es_workflow_trigger', __( 'Trigger', 'email-subscribers' ), array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'high' );
398
+ add_meta_box( 'ig_es_workflow_rules', __( 'Rules', 'email-subscribers' ), array( __CLASS__, 'rules_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'core' );
399
+ add_meta_box( 'ig_es_workflow_actions', __( 'Actions', 'email-subscribers' ), array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'low' );
400
  add_meta_box( 'ig_es_workflow_save', __( 'Save', 'email-subscribers' ), array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
401
  add_meta_box( 'ig_es_workflow_variables', __( 'Placeholders', 'email-subscribers' ), array( __CLASS__, 'variables_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
402
 
491
  );
492
  }
493
 
494
+ /**
495
+ * Get all rules in the workflow
496
+ *
497
+ * @return array
498
+ *
499
+ * @since 5.5.0
500
+ */
501
+ public static function get_rules_data() {
502
+ $data = [];
503
+
504
+ foreach ( Es_Workflow_Rules::get_all() as $rule ) {
505
+ $rule_data = (array) $rule;
506
+ if ( is_callable( [ $rule, 'get_search_ajax_action' ] ) ) {
507
+ $rule_data['ajax_action'] = $rule->get_search_ajax_action();
508
+ }
509
+ $data[ $rule->name ] = $rule_data;
510
+ }
511
+
512
+ return $data;
513
+ }
514
+
515
+ /**
516
+ * Get the workflow rules to edit
517
+ *
518
+ * @return array
519
+ */
520
+ public static function get_workflow_rules() {
521
+ Es_Workflow_Rules::get_all(); // load all the rules into memory so the order is preserved
522
+
523
+ if ( self::$workflow ) {
524
+ $rule_options = self::$workflow->get_rule_data();
525
+ foreach ( $rule_options as &$rule_group ) {
526
+ foreach ( $rule_group as &$rule ) {
527
+ if ( ! isset( $rule['name'] ) ) {
528
+ continue;
529
+ }
530
+
531
+ $rule_object = Es_Workflow_Rules::get( $rule['name'] );
532
+ if ( ! $rule_object ) {
533
+ continue;
534
+ }
535
+
536
+ if ( 'object' === $rule_object->type ) {
537
+ /**
538
+ * Searchable search rule value field
539
+ * @var Es_Rule_Searchable_Select_Abstract $rule_object
540
+ */
541
+ // If rule has multiple values get the display value for all keys
542
+ if ( $rule_object->is_multi ) {
543
+ foreach ( (array) $rule['value'] as $item ) {
544
+ $rule['selected'][] = $rule_object->get_object_display_value( $item );
545
+ }
546
+ } else {
547
+ $rule['selected'] = $rule_object->get_object_display_value( $rule['value'] );
548
+ }
549
+ } else {
550
+ // Format the rule value
551
+ $rule['value'] = $rule_object->format_value( $rule['value'] );
552
+ }
553
+ }
554
+ }
555
+ } else {
556
+ $rule_options = [];
557
+ }
558
+
559
+ return $rule_options;
560
+ }
561
+
562
+ /**
563
+ * Rules meta box
564
+ *
565
+ * @since 5.5.0
566
+ */
567
+ public static function rules_metabox() {
568
+ ES_Workflow_Admin::get_view(
569
+ 'meta-box-rules',
570
+ array(
571
+ 'workflow' => self::$workflow,
572
+ 'workflow_rules' => self::get_workflow_rules(),
573
+ 'selected_trigger' => self::$workflow ? self::$workflow->get_trigger() : false,
574
+ 'all_rules' => self::get_rules_data(),
575
+ )
576
+ );
577
+ }
578
+
579
  /**
580
  * Save workflow meta box
581
  *
653
  $workflow_name = ! empty( $workflow_title ) ? sanitize_title( ES_Clean::string( $workflow_title ) ) : '';
654
  $trigger_name = isset( $posted['trigger_name'] ) ? ig_es_clean( $posted['trigger_name'] ) : '';
655
  $trigger_options = isset( $posted['trigger_options'] ) ? ig_es_clean( $posted['trigger_options'] ) : array();
656
+ $rules = isset( $posted['rules'] ) ? self::filter_valid_rules_to_save( ig_es_clean( $posted['rules'] ) ) : array();
657
  $actions = isset( $posted['actions'] ) ? $posted['actions'] : array(); // We can't sanitize actions data since some actions like Send email allows html in its field.
658
  $status = isset( $posted['status'] ) ? ig_es_clean( $posted['status'] ) : 0;
659
  $type = isset( $posted['type'] ) ? ig_es_clean( $posted['type'] ) : 0;
727
  return $workflow_id;
728
  }
729
 
730
+ /**
731
+ * Filter the rules before saving it into DB
732
+ *
733
+ * @param $rules
734
+ *
735
+ * @return array
736
+ */
737
+ public static function filter_valid_rules_to_save( $rules ) {
738
+ if ( empty( $rules ) || ! is_array( $rules ) ) {
739
+ return array();
740
+ }
741
+ $valid_rules = array();
742
+
743
+ foreach ( $rules as $rule_group ) {
744
+ if ( empty( $rule_group ) || ! is_array( $rule_group ) ) {
745
+ continue;
746
+ }
747
+ $valid_rule_group = array();
748
+ foreach ( $rule_group as $rule ) {
749
+ if ( empty( $rule['name'] ) || empty( $rule['compare'] ) || empty( $rule['value'] ) ) {
750
+ continue;
751
+ }
752
+ array_push( $valid_rule_group, $rule );
753
+ }
754
+
755
+ if ( ! empty( $valid_rule_group ) ) {
756
+ array_push( $valid_rules, $valid_rule_group );
757
+ }
758
+ }
759
+
760
+ return $valid_rules;
761
+ }
762
+
763
  /**
764
  * Update campaign data in workflow
765
  *
lite/includes/workflows/admin/views/meta-box-actions.php CHANGED
@@ -16,7 +16,7 @@
16
  * @var ES_Workflow_Action[] $workflow_actions
17
  *
18
  * Action select box value
19
- * @var array $action_select_box_value
20
  */
21
 
22
  if ( ! defined( 'ABSPATH' ) ) {
16
  * @var ES_Workflow_Action[] $workflow_actions
17
  *
18
  * Action select box value
19
+ * @var array $action_select_box_values
20
  */
21
 
22
  if ( ! defined( 'ABSPATH' ) ) {
lite/includes/workflows/admin/views/meta-box-rules.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin workflow rules metabox
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ /**
11
+ * Worfklow object
12
+ *
13
+ * @var ES_Workflow $workflow
14
+ *
15
+ * All available rules
16
+ * @var array $all_rules
17
+ *
18
+ * Workflow rules
19
+ * @var array $workflow_rules
20
+ *
21
+ * Workflow trigger
22
+ * @var ES_Workflow_Trigger | false $selected_trigger
23
+ */
24
+
25
+ if ( ! defined( 'ABSPATH' ) ) {
26
+ exit;
27
+ }
28
+
29
+ $supplied_data_items = array();
30
+ if ( is_callable( array( $selected_trigger, 'get_supplied_data_items' ) ) ) {
31
+ $supplied_data_items = $selected_trigger->get_supplied_data_items();
32
+ }
33
+
34
+ $trigger_name = array();
35
+ if ( is_callable( array( $selected_trigger, 'get_name' ) ) ) {
36
+ $trigger_name = $selected_trigger->get_name();
37
+ }
38
+
39
+ ?>
40
+ <div id="ig-es-rules-container"></div>
41
+
42
+ <script>
43
+ let igEsWorkflowRules =
44
+ <?php
45
+ echo wp_json_encode( array(
46
+ 'all_rules' => $all_rules,
47
+ 'workflow_rules' => $workflow_rules,
48
+ 'supplied_data_items' => $supplied_data_items,
49
+ 'trigger_name' => $trigger_name
50
+ ) );
51
+ ?>
52
+ ;
53
+ </script>
54
+ <div class="ig-es-metabox-footer rules-metabox-footer hidden">
55
+ <button type="button"
56
+ class="ig-es-add-rule-group inline-flex justify-center rounded-md border border-transparent px-4 py-1.5 bg-white text-sm leading-5 font-medium text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:shadow-outline-blue transition ease-in-out duration-150"><?php echo esc_html__( '+ Add Rule Group', 'email-subscribers' ); ?></button>
57
+ </div>
58
+
59
+ <div class="hidden" id="rule-template-container">
60
+ <p class="ig-es-rules-empty-message px-4 py-1.5">
61
+ <?php
62
+ printf(
63
+ /* translators: 1: HTML Tag 2: HTML Tag */
64
+ esc_attr__( 'Rules can be used to add conditional logic to workflows. Click the %1$s+ Add Rule Group%2$s button to create a rule.', 'email-subscribers' ), '<strong>', '</strong>'
65
+ );
66
+ ?>
67
+ </p>
68
+ <p class="ig-es-no-rules-message px-4 py-1.5"><?php printf( esc_attr__( 'Selected triggers has no rules.. Please select different triggers', 'email-subscribers' ), '<strong>', '</strong>' ); ?></p>
69
+ <input type="text" disabled class="ig-es-field rule-value-text-field border-gray-400">
70
+ <select class="ig-es-field rule-value-object-field" data-placeholder="" data-action=""></select>
71
+ <select class="ig-es-field rule-value-select-field ig-es-field--type-select"></select>
72
+
73
+ <div class="ig-es-rule-group px-4 py-1.5">
74
+ </div>
75
+
76
+ <div class="ig-es-rule-container inline-flex mt-3 mb-3">
77
+ <div class="ig-es-rule__fields inline-flex">
78
+ <div class="ig-es-rule-select-container ig-es-rule__field-container pr-3">
79
+ <select name="" class="rule-select-field ig-es-field" disabled>
80
+ <option value=""><?php esc_attr_e( '[Select Rule]', 'email-subscribers' ); ?></option>
81
+ </select>
82
+ </div>
83
+ <div class="ig-es-rule-field-compare ig-es-rule__field-container pr-3">
84
+ <select name="" class="ig-es-field rule-compare-field" disabled>
85
+ </select>
86
+ </div>
87
+ <div class="ig-es-rule-field-value ig-es-rule__field-container pr-3">
88
+ <input type="text" disabled class="ig-es-field rule-value-field border-gray-400">
89
+ </div>
90
+ </div>
91
+
92
+ <div class="ig-es-rule__buttons inline-flex">
93
+ <button type="button"
94
+ class="add-rule ig-es-rule__add button h-5"><?php esc_html_e( 'and', 'email-subscribers' ); ?></button>
95
+ <button type="button"
96
+ class="remove-rule ig-es-rule__remove text-red-600 mx-3 h-5 py-1"><span class="dashicons dashicons-remove"></span></button>
97
+ </div>
98
+ </div>
99
+ </div>
lite/includes/workflows/class-es-workflow-rules.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
+ /**
8
+ * Class to load workflow rules
9
+ *
10
+ * @class ES_Workflow_Rules
11
+ * @since 5.5.0
12
+ */
13
+ class ES_Workflow_Rules extends ES_Workflow_Registry {
14
+
15
+ /**
16
+ * Registered include classes
17
+ *
18
+ * @var array
19
+ */
20
+ public static $includes;
21
+
22
+ /**
23
+ * Loaded registered class objects
24
+ *
25
+ * @var array
26
+ */
27
+ public static $loaded = array();
28
+
29
+ /**
30
+ *
31
+ * Implement this method in sub classes
32
+ *
33
+ * @return array
34
+ */
35
+ public static function load_includes() {
36
+
37
+ $includes = array();
38
+
39
+ return apply_filters( 'ig_es_workflow_rules', $includes );
40
+ }
41
+
42
+
43
+ /**
44
+ * Get object of specific rule class.
45
+ *
46
+ * @param $name string
47
+ *
48
+ * @return ES_Workflow_Rule|false
49
+ *
50
+ */
51
+ public static function get( $name ) {
52
+ static::load( $name );
53
+
54
+ if ( ! isset( static::$loaded[ $name ] ) ) {
55
+ return false;
56
+ }
57
+
58
+ return static::$loaded[ $name ];
59
+ }
60
+
61
+ /**
62
+ * Load rule class object by rule name
63
+ *
64
+ * @param $name
65
+ */
66
+ public static function load( $name ) {
67
+ if ( static::is_loaded( $name ) ) {
68
+ return;
69
+ }
70
+
71
+ $rule = false;
72
+ $includes = static::get_includes();
73
+
74
+ if ( ! empty( $includes[ $name ] ) ) {
75
+ /**
76
+ * Registered include classes
77
+ *
78
+ * @var ES_Workflow_Rule $rule
79
+ */
80
+ $rule_class = $includes[ $name ];
81
+ if ( class_exists( $rule_class ) ) {
82
+ $rule = new $rule_class();
83
+ }
84
+ }
85
+
86
+ static::$loaded[ $name ] = $rule;
87
+ }
88
+
89
+ /**
90
+ * Get all registered workflow rules
91
+ *
92
+ * @return ES_Workflow_Rule[]
93
+ *
94
+ */
95
+ public static function get_all() {
96
+ foreach ( static::get_includes() as $name => $path ) {
97
+ static::load( $name );
98
+ }
99
+
100
+ return static::$loaded;
101
+ }
102
+
103
+ }
lite/includes/workflows/class-es-workflow.php CHANGED
@@ -157,8 +157,8 @@ class ES_Workflow {
157
 
158
  /**
159
  * Class constructor
160
- *
161
- * @param $post mixed (object or post ID)
162
  */
163
  public function __construct( $workflow = null ) {
164
 
@@ -184,6 +184,96 @@ class ES_Workflow {
184
  }
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  /**
188
  * Retrieve ES_Workflow instance.
189
  *
@@ -330,7 +420,7 @@ class ES_Workflow {
330
  * Returns the saved actions with their data
331
  *
332
  * @param $number
333
- * @return Action|false
334
  */
335
  public function get_action( $number ) {
336
 
@@ -423,6 +513,10 @@ class ES_Workflow {
423
  if ( ! $trigger->validate_workflow( $this ) ) {
424
  return false;
425
  }
 
 
 
 
426
 
427
  // Allow third party developers to hook their validation logic.
428
  if ( ! apply_filters( 'ig_es_custom_validate_workflow', true, $this ) ) {
157
 
158
  /**
159
  * Class constructor
160
+ *
161
+ * @param mixed $workflow
162
  */
163
  public function __construct( $workflow = null ) {
164
 
184
  }
185
  }
186
 
187
+ /**
188
+ * Validate rules against user input
189
+ *
190
+ * @return bool
191
+ */
192
+ public function validate_rules() {
193
+ $rules = self::get_rule_data();
194
+
195
+ // no rules found
196
+ if ( empty( $rules ) ) {
197
+ return true;
198
+ }
199
+
200
+ foreach ( $rules as $rule_group ) {
201
+ $is_group_valid = true;
202
+ foreach ( $rule_group as $rule ) {
203
+ // rules have AND relationship so all must return true
204
+ if ( ! $this->validate_rule( $rule ) ) {
205
+ $is_group_valid = false;
206
+ break;
207
+ }
208
+ }
209
+
210
+ // groups have an OR relationship so if one is valid we can break the loop and return true
211
+ if ( $is_group_valid ) {
212
+ return true;
213
+ }
214
+ }
215
+
216
+ // no groups were valid
217
+ return false;
218
+ }
219
+
220
+ /**
221
+ * Returns true if rule is missing data so that the rule is skipped
222
+ *
223
+ * @param array $rule
224
+ * @return bool
225
+ */
226
+ public function validate_rule( $rule ) {
227
+ if ( ! is_array( $rule ) ) {
228
+ return true;
229
+ }
230
+
231
+ $rule_name = isset( $rule['name'] ) ? $rule['name'] : false;
232
+ $rule_compare = isset( $rule['compare'] ) ? $rule['compare'] : false;
233
+ $rule_value = isset( $rule['value'] ) ? $rule['value'] : false;
234
+
235
+ // it's ok for compare to be false for boolean type rules
236
+ if ( ! $rule_name ) {
237
+ return true;
238
+ }
239
+
240
+ $rule_object = ES_Workflow_Rules::get( $rule_name );
241
+
242
+ // rule doesn't exists
243
+ if ( ! $rule_object ) {
244
+ return false;
245
+ }
246
+
247
+ // get the data required to validate the rule
248
+ $data_item = $this->get_data_item( $rule_object->data_item );
249
+
250
+ if ( ! $data_item ) {
251
+ return false;
252
+ }
253
+
254
+ // some rules need the full workflow object
255
+ $rule_object->set_workflow( $this );
256
+
257
+ // Check the expected rule value is valid.
258
+ try {
259
+ $rule_object->validate_value( $rule_value );
260
+ } catch ( \Exception $e ) {
261
+ // Always return false if the rule value is invalid
262
+ return false;
263
+ }
264
+
265
+ return $rule_object->validate( $data_item, $rule_compare, $rule_value );
266
+ }
267
+
268
+ /**
269
+ * Get rule data
270
+ *
271
+ * @return array
272
+ */
273
+ public function get_rule_data() {
274
+ return is_array( $this->rules ) ? $this->rules : [];
275
+ }
276
+
277
  /**
278
  * Retrieve ES_Workflow instance.
279
  *
420
  * Returns the saved actions with their data
421
  *
422
  * @param $number
423
+ * @return ES_Workflow_Action|false
424
  */
425
  public function get_action( $number ) {
426
 
513
  if ( ! $trigger->validate_workflow( $this ) ) {
514
  return false;
515
  }
516
+
517
+ if ( ! $this->validate_rules() ) {
518
+ return false;
519
+ }
520
 
521
  // Allow third party developers to hook their validation logic.
522
  if ( ! apply_filters( 'ig_es_custom_validate_workflow', true, $this ) ) {
lite/includes/workflows/rules/abstracts/class-es-rule-preloaded-select-abstract.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Select Abstract rule class.
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit; // Exit if accessed directly.
12
+ }
13
+
14
+ if ( ! class_exists( 'Es_Rule_Preloaded_Select_Abstract' ) ) {
15
+ abstract class Es_Rule_Preloaded_Select_Abstract extends Es_Rule_Select {
16
+ /**
17
+ * Cached select options. Leave public for JSON.
18
+ *
19
+ * @var array
20
+ */
21
+ public $select_choices;
22
+
23
+ /**
24
+ * Load select choices for rule.
25
+ *
26
+ * @return array
27
+ */
28
+ public function load_select_choices() {
29
+ return [];
30
+ }
31
+
32
+ /**
33
+ * Get the select choices for the rule.
34
+ *
35
+ * Choices are cached in memory.
36
+ *
37
+ * @return array
38
+ */
39
+ public function get_select_choices() {
40
+ if ( ! isset( $this->select_choices ) ) {
41
+ $this->select_choices = apply_filters( 'ig_es_rules_preloaded_select_choices', $this->load_select_choices(), $this );
42
+ }
43
+
44
+ return $this->select_choices;
45
+ }
46
+ }
47
+ }
lite/includes/workflows/rules/abstracts/class-es-rule-product-select-abstract.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Select Abstract rule class.
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit; // Exit if accessed directly.
12
+ }
13
+
14
+ if ( ! class_exists( 'Es_Rule_Product_Select_Abstract' ) ) {
15
+ abstract class Es_Rule_Product_Select_Abstract extends Es_Rule_Searchable_Select_Abstract {
16
+ /**
17
+ * The CSS class to use on the search field.
18
+ *
19
+ * @var string
20
+ */
21
+ public $class = 'wc-product-search';
22
+
23
+ /**
24
+ * Init.
25
+ */
26
+ public function init() {
27
+ parent::init();
28
+
29
+ $this->placeholder = __( 'Search products...', 'email-subscribers' );
30
+ }
31
+
32
+ /**
33
+ * Display product name on frontend.
34
+ *
35
+ * @param int $value
36
+ *
37
+ * @return string|int
38
+ */
39
+ public function get_object_display_value( $value ) {
40
+ $value = absint( $value );
41
+ $product = wc_get_product( $value );
42
+
43
+ return $product ? $product->get_formatted_name() : $value;
44
+ }
45
+
46
+ /**
47
+ * Get the ajax action to use for the AJAX search.
48
+ *
49
+ * @return string
50
+ */
51
+ public function get_search_ajax_action() {
52
+ return 'woocommerce_json_search_products_and_variations';
53
+ }
54
+ }
55
+ }
lite/includes/workflows/rules/abstracts/class-es-rule-searchable-select-abstract.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Select Abstract rule class.
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit; // Exit if accessed directly.
12
+ }
13
+
14
+ if ( ! class_exists( 'Es_Rule_Searchable_Select_Abstract' ) ) {
15
+ abstract class Es_Rule_Searchable_Select_Abstract extends Es_Rule_Select {
16
+ /**
17
+ * The rule type.
18
+ *
19
+ * @var string
20
+ */
21
+ public $type = 'object';
22
+
23
+ /**
24
+ * The CSS class to use on the search field.
25
+ *
26
+ * @var string
27
+ */
28
+ public $class = 'ig-es-json-search';
29
+
30
+ /**
31
+ * The field placeholder.
32
+ *
33
+ * @var string
34
+ */
35
+ public $placeholder;
36
+
37
+ /**
38
+ * Get the ajax action to use for the AJAX search.
39
+ *
40
+ * @return string
41
+ */
42
+ abstract public function get_search_ajax_action();
43
+
44
+ /**
45
+ * Init.
46
+ */
47
+ public function init() {
48
+ parent::init();
49
+
50
+ $this->placeholder = __( 'Search...', 'email-subscribers' );
51
+
52
+ if ( ! $this->is_multi ) {
53
+ $this->compare_types = $this->get_includes_or_not_compare_types();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Override this method to alter how saved values are displayed.
59
+ *
60
+ * @param string $value
61
+ *
62
+ * @return string
63
+ */
64
+ public function get_object_display_value( $value ) {
65
+ return $value;
66
+ }
67
+ }
68
+ }
lite/includes/workflows/rules/abstracts/class-es-rule-select-abstract.php ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Select Abstract rule class.
4
+ *
5
+ * @since 5.5.0
6
+ * @version 1.0
7
+ * @package Email Subscribers
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit; // Exit if accessed directly.
12
+ }
13
+
14
+ if ( ! class_exists( 'Es_Rule_Select' ) ) {
15
+ abstract class Es_Rule_Select extends Es_Workflow_Rule {
16
+ /**
17
+ * The rule type.
18
+ *
19
+ * @var string
20
+ */
21
+ public $type = 'select';
22
+
23
+ /**
24
+ * Allow multiple selections?
25
+ *
26
+ * @var bool
27
+ */
28
+ public $is_multi = false;
29
+
30
+ /**
31
+ * Init rule.
32
+ */
33
+ public function init() {
34
+ if ( $this->is_multi ) {
35
+ $this->compare_types = $this->get_multi_select_compare_types();
36
+ } else {
37
+ $this->compare_types = $this->get_is_or_not_compare_types();
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Validate a select rule.
43
+ *
44
+ * @param string|array $actual Will be an array when is_multi prop is true.
45
+ * @param string $compare_type
46
+ * @param array|string $expected
47
+ *
48
+ * @return bool
49
+ */
50
+ public function validate_select( $actual, $compare_type, $expected ) {
51
+
52
+ if ( $this->is_multi ) {
53
+
54
+ // actual can be empty
55
+ if ( ! $actual ) {
56
+ $actual = [];
57
+ }
58
+
59
+ // expected must have a value
60
+ if ( ! $expected ) {
61
+ return false;
62
+ }
63
+
64
+ $actual = (array) $actual;
65
+ $expected = (array) $expected;
66
+
67
+ switch ( $compare_type ) {
68
+ case 'matches_all':
69
+ return count( array_intersect( $expected, $actual ) ) === count( $expected );
70
+
71
+ case 'matches_none':
72
+ return count( array_intersect( $expected, $actual ) ) === 0;
73
+
74
+ case 'matches_any':
75
+ return count( array_intersect( $expected, $actual ) ) >= 1;
76
+ }
77
+ } else {
78
+
79
+ // actual must be scalar, but expected could be multiple values
80
+ if ( ! is_scalar( $actual ) ) {
81
+ return false;
82
+ }
83
+
84
+ // TODO review above exclusions
85
+ // phpcs:disable WordPress.PHP.StrictComparisons.LooseComparison
86
+ // phpcs:disable WordPress.PHP.StrictInArray.MissingTrueStrict
87
+
88
+ if ( is_array( $expected ) ) {
89
+ $is_equal = in_array( $actual, $expected );
90
+ } else {
91
+ $is_equal = $expected == $actual;
92
+ }
93
+
94
+ // phpcs:enable
95
+
96
+ switch ( $compare_type ) {
97
+ case 'is':
98
+ return $is_equal;
99
+
100
+ case 'is_not':
101
+ return ! $is_equal;
102
+ }
103
+ }
104
+
105
+ return false;
106
+ }
107
+
108
+
109
+ /**
110
+ * Validate select rule, but case insensitive.
111
+ *
112
+ * @param array|string $actual Will be an array when is_multi prop is true.
113
+ * @param string $compare_type
114
+ * @param array|string $expected
115
+ *
116
+ * @return bool
117
+ * @since 4.4.0
118
+ *
119
+ */
120
+ public function validate_select_case_insensitive( $actual, $compare_type, $expected ) {
121
+ if ( is_array( $actual ) ) {
122
+ $actual = array_map( 'wc_strtolower', $actual );
123
+ } else {
124
+ $actual = strtolower( (string) $actual );
125
+ }
126
+ $expected = array_map( 'wc_strtolower', (array) $expected );
127
+
128
+ return $this->validate_select( $actual, $compare_type, $expected );
129
+ }
130
+ }
131
+ }
lite/language.php CHANGED
@@ -477,7 +477,8 @@ __( 'Show this message if any error occured after clicking on unsubscribe link.'
477
  __( 'Share Icegram', 'email-subscribers' ),
478
  __( 'Delete plugin data on uninstall', 'email-subscribers' ),
479
  __( 'Be careful with this! When enabled, it will remove all lists, campaigns and other data if you uninstall the plugin.', 'email-subscribers' ),
480
- __( ' We will take care of it. You don\'t need to visit this URL manually.', 'email-subscribers' ),
 
481
  /* translators: %s: Link to Icegram documentation */
482
  __( 'You need to visit this URL to send email notifications. Know <a href=\'%s\' target=\'_blank\'>how to run this in background</a>', 'email-subscribers' ),
483
  __( 'How to configure Email Sending', 'email-subscribers' ),
@@ -1045,6 +1046,23 @@ __( 'Manage Custom Fields', 'email-subscribers' ),
1045
  __( 'Want to add more form fields?', 'email-subscribers' ),
1046
  __( ' The test email did not reach our test server. Did you get any test emails on your email? This could be a temporary problem, but it can also mean that emails are getting stuck on your server, or getting rejected by recipients.', 'email-subscribers' ),
1047
  __( 'Other', 'email-subscribers' ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1048
  __( 'Send to', 'email-subscribers' ),
1049
  __( 'Enter emails here or use variable such as {{EMAIL}}. Multiple emails can be separated by commas.', 'email-subscribers' ),
1050
  __( 'E.g. {{EMAIL}}, admin@example.com', 'email-subscribers' ),
@@ -1065,6 +1083,7 @@ __( ' Add New Workflow', 'email-subscribers' ),
1065
  __( ' Edit Workflow', 'email-subscribers' ),
1066
  __( 'Add title', 'email-subscribers' ),
1067
  __( 'Trigger', 'email-subscribers' ),
 
1068
  __( 'Actions', 'email-subscribers' ),
1069
  __( 'Placeholders', 'email-subscribers' ),
1070
  __( 'New Action', 'email-subscribers' ),
@@ -1073,6 +1092,11 @@ __( 'Action', 'email-subscribers' ),
1073
  __( 'No actions found. Click the %1$s+ Add action%2$s to create an action.', 'email-subscribers' ),
1074
  __( '+ Add action', 'email-subscribers' ),
1075
  __( 'Workflow priority', 'email-subscribers' ),
 
 
 
 
 
1076
  __( 'Performs add to list action on existing orders that match trigger conditions.', 'email-subscribers' ),
1077
  __( 'Run now', 'email-subscribers' ),
1078
  __( 'Timing', 'email-subscribers' ),
@@ -1175,6 +1199,8 @@ __( 'Send welcome email when someone subscribes.', 'email-subscribers' ),
1175
  __( 'Welcome to {{SITENAME}}', 'email-subscribers' ),
1176
  /* translators: %s: Table name */
1177
  __( 'Could not insert into \'%1$s\' table. \'%1$s\' may not be present in the database.', 'email-subscribers' ),
 
 
1178
  __( 'Campaign sent', 'email-subscribers' ),
1179
  __( 'Fires when a campaign is sent successfully.', 'email-subscribers' ),
1180
  __( 'User Deleted', 'email-subscribers' ),
@@ -1377,7 +1403,6 @@ __( 'Proceed ', 'email-subscribers' ),
1377
  __( 'Import from WooCommerce orders', 'email-subscribers' ),
1378
  __( 'Select order statuses', 'email-subscribers' ),
1379
  __( 'Orders should contain these products', 'email-subscribers' ),
1380
- __( 'Search products...', 'email-subscribers' ),
1381
  /* translators: 1. Processed orders count. 2. Total orders count. 3. Matched orders count. */
1382
  __( 'Currently %1$s of %2$s orders checked. Found %3$s matching orders.', 'email-subscribers' ),
1383
  __( 'We can\'t find any matching orders in your store.', 'email-subscribers' ),
@@ -1445,6 +1470,9 @@ __( 'Thanks for your feedback at {{ shop.title }}!', 'email-subscribers' ),
1445
  __( 'Wishlist: Notify customers when their wishlist item goes on sale', 'email-subscribers' ),
1446
  __( 'Trigger an email to customers to notify them about on going sale on their wishlist products.', 'email-subscribers' ),
1447
  __( 'Your wishlist item is now on sale!!!', 'email-subscribers' ),
 
 
 
1448
  __( 'LearnDash', 'email-subscribers' ),
1449
  /* translators: %s: Cart abandoned timeout */
1450
  __( 'Carts are considered abandoned if they are inactive for %d minutes.', 'email-subscribers' ),
@@ -1453,6 +1481,16 @@ __( 'User enrolled', 'email-subscribers' ),
1453
  __( 'Fires whenever someone enrolls in a course.', 'email-subscribers' ),
1454
  __( 'User removed', 'email-subscribers' ),
1455
  __( 'Fires whenever someone is removed from a course.', 'email-subscribers' ),
 
 
 
 
 
 
 
 
 
 
1456
  __( 'Fires when user role is changed.', 'email-subscribers' ),
1457
  __( 'Old user roles', 'email-subscribers' ),
1458
  __( 'Select user roles', 'email-subscribers' ),
@@ -1470,8 +1508,6 @@ __( 'Wishlist Item On Sale (%s)', 'email-subscribers' ),
1470
  __( 'Wishlists', 'email-subscribers' ),
1471
  __( 'This trigger doesn\'t fire instantly when a product goes on sale. Instead, it performs a check for new on-sale products in every 15 minutes.
1472
  Please note this doesn\'t work for guests because their wishlist data only exists in their session data.', 'email-subscribers' ),
1473
- __( 'User roles', 'email-subscribers' ),
1474
- __( 'Select user roles for which this trigger should run. If left empty, trigger will run for all user roles.', 'email-subscribers' ),
1475
  __( 'Displays the number of the items in cart.', 'email-subscribers' ),
1476
  __( 'Display a product listing of the items in the cart.', 'email-subscribers' ),
1477
  __( 'Displays a unique link to the cart page that will also restore items to the customer\'s cart.', 'email-subscribers' ),
477
  __( 'Share Icegram', 'email-subscribers' ),
478
  __( 'Delete plugin data on uninstall', 'email-subscribers' ),
479
  __( 'Be careful with this! When enabled, it will remove all lists, campaigns and other data if you uninstall the plugin.', 'email-subscribers' ),
480
+ __( '<br><span class="ml-6">Cron last hit time : <b>', 'email-subscribers' ),
481
+ __( '<span class="es-send-success es-icon"></span> We will take care of it. You don\'t need to visit this URL manually.', 'email-subscribers' ),
482
  /* translators: %s: Link to Icegram documentation */
483
  __( 'You need to visit this URL to send email notifications. Know <a href=\'%s\' target=\'_blank\'>how to run this in background</a>', 'email-subscribers' ),
484
  __( 'How to configure Email Sending', 'email-subscribers' ),
1046
  __( 'Want to add more form fields?', 'email-subscribers' ),
1047
  __( ' The test email did not reach our test server. Did you get any test emails on your email? This could be a temporary problem, but it can also mean that emails are getting stuck on your server, or getting rejected by recipients.', 'email-subscribers' ),
1048
  __( 'Other', 'email-subscribers' ),
1049
+ __( 'does not contain', 'email-subscribers' ),
1050
+ __( 'starts with', 'email-subscribers' ),
1051
+ __( 'is blank', 'email-subscribers' ),
1052
+ __( 'is not blank', 'email-subscribers' ),
1053
+ __( 'matches regex', 'email-subscribers' ),
1054
+ __( 'any contains', 'email-subscribers' ),
1055
+ __( 'any matches exactly', 'email-subscribers' ),
1056
+ __( 'any starts with', 'email-subscribers' ),
1057
+ __( 'any ends with', 'email-subscribers' ),
1058
+ __( 'is less than', 'email-subscribers' ),
1059
+ __( 'is a multiple of', 'email-subscribers' ),
1060
+ __( 'is not a multiple of', 'email-subscribers' ),
1061
+ __( 'matches all', 'email-subscribers' ),
1062
+ __( 'matches any', 'email-subscribers' ),
1063
+ __( 'matches none', 'email-subscribers' ),
1064
+ __( 'includes', 'email-subscribers' ),
1065
+ __( 'does not include', 'email-subscribers' ),
1066
  __( 'Send to', 'email-subscribers' ),
1067
  __( 'Enter emails here or use variable such as {{EMAIL}}. Multiple emails can be separated by commas.', 'email-subscribers' ),
1068
  __( 'E.g. {{EMAIL}}, admin@example.com', 'email-subscribers' ),
1083
  __( ' Edit Workflow', 'email-subscribers' ),
1084
  __( 'Add title', 'email-subscribers' ),
1085
  __( 'Trigger', 'email-subscribers' ),
1086
+ __( 'Rules', 'email-subscribers' ),
1087
  __( 'Actions', 'email-subscribers' ),
1088
  __( 'Placeholders', 'email-subscribers' ),
1089
  __( 'New Action', 'email-subscribers' ),
1092
  __( 'No actions found. Click the %1$s+ Add action%2$s to create an action.', 'email-subscribers' ),
1093
  __( '+ Add action', 'email-subscribers' ),
1094
  __( 'Workflow priority', 'email-subscribers' ),
1095
+ __( '+ Add Rule Group', 'email-subscribers' ),
1096
+ /* translators: 1: HTML Tag 2: HTML Tag */
1097
+ __( 'Rules can be used to add conditional logic to workflows. Click the %1$s+ Add Rule Group%2$s button to create a rule.', 'email-subscribers' ),
1098
+ __( 'Selected triggers has no rules.. Please select different triggers', 'email-subscribers' ),
1099
+ __( '[Select Rule]', 'email-subscribers' ),
1100
  __( 'Performs add to list action on existing orders that match trigger conditions.', 'email-subscribers' ),
1101
  __( 'Run now', 'email-subscribers' ),
1102
  __( 'Timing', 'email-subscribers' ),
1199
  __( 'Welcome to {{SITENAME}}', 'email-subscribers' ),
1200
  /* translators: %s: Table name */
1201
  __( 'Could not insert into \'%1$s\' table. \'%1$s\' may not be present in the database.', 'email-subscribers' ),
1202
+ __( 'Search products...', 'email-subscribers' ),
1203
+ __( 'Search...', 'email-subscribers' ),
1204
  __( 'Campaign sent', 'email-subscribers' ),
1205
  __( 'Fires when a campaign is sent successfully.', 'email-subscribers' ),
1206
  __( 'User Deleted', 'email-subscribers' ),
1403
  __( 'Import from WooCommerce orders', 'email-subscribers' ),
1404
  __( 'Select order statuses', 'email-subscribers' ),
1405
  __( 'Orders should contain these products', 'email-subscribers' ),
 
1406
  /* translators: 1. Processed orders count. 2. Total orders count. 3. Matched orders count. */
1407
  __( 'Currently %1$s of %2$s orders checked. Found %3$s matching orders.', 'email-subscribers' ),
1408
  __( 'We can\'t find any matching orders in your store.', 'email-subscribers' ),
1470
  __( 'Wishlist: Notify customers when their wishlist item goes on sale', 'email-subscribers' ),
1471
  __( 'Trigger an email to customers to notify them about on going sale on their wishlist products.', 'email-subscribers' ),
1472
  __( 'Your wishlist item is now on sale!!!', 'email-subscribers' ),
1473
+ __( 'Order - Items', 'email-subscribers' ),
1474
+ __( 'Subscriber - List', 'email-subscribers' ),
1475
+ __( 'User - Role', 'email-subscribers' ),
1476
  __( 'LearnDash', 'email-subscribers' ),
1477
  /* translators: %s: Cart abandoned timeout */
1478
  __( 'Carts are considered abandoned if they are inactive for %d minutes.', 'email-subscribers' ),
1481
  __( 'Fires whenever someone enrolls in a course.', 'email-subscribers' ),
1482
  __( 'User removed', 'email-subscribers' ),
1483
  __( 'Fires whenever someone is removed from a course.', 'email-subscribers' ),
1484
+ __( 'Membership Canceled', 'email-subscribers' ),
1485
+ __( 'Fires when a user\'s membership is canceled.', 'email-subscribers' ),
1486
+ __( 'Membership Expired', 'email-subscribers' ),
1487
+ __( 'Fires when a user\'s membership is expired.', 'email-subscribers' ),
1488
+ __( 'Membership Purchased', 'email-subscribers' ),
1489
+ __( 'Fires when user purchases a membership.', 'email-subscribers' ),
1490
+ __( 'Membership Approved', 'email-subscribers' ),
1491
+ __( 'Fires when user\'s membership is approved.', 'email-subscribers' ),
1492
+ __( 'Membership Deactivated', 'email-subscribers' ),
1493
+ __( 'Fires when user\'s membership is deactivated.', 'email-subscribers' ),
1494
  __( 'Fires when user role is changed.', 'email-subscribers' ),
1495
  __( 'Old user roles', 'email-subscribers' ),
1496
  __( 'Select user roles', 'email-subscribers' ),
1508
  __( 'Wishlists', 'email-subscribers' ),
1509
  __( 'This trigger doesn\'t fire instantly when a product goes on sale. Instead, it performs a check for new on-sale products in every 15 minutes.
1510
  Please note this doesn\'t work for guests because their wishlist data only exists in their session data.', 'email-subscribers' ),
 
 
1511
  __( 'Displays the number of the items in cart.', 'email-subscribers' ),
1512
  __( 'Display a product listing of the items in the cart.', 'email-subscribers' ),
1513
  __( 'Displays a unique link to the cart page that will also restore items to the customer\'s cart.', 'email-subscribers' ),
lite/languages/email-subscribers.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Email Subscribers & Newsletters plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Email Subscribers & Newsletters 5.4.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/email-subscribers\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-07-27T07:19:28+02: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: email-subscribers\n"
@@ -29,7 +29,7 @@ msgstr ""
29
 
30
  #. Author of the plugin
31
  #: lite/admin/partials/help.php:28
32
- #: lite/includes/class-email-subscribers.php:1496
33
  msgid "Icegram"
34
  msgstr ""
35
 
@@ -80,7 +80,7 @@ msgid "Please add a campaign subject before saving."
80
  msgstr ""
81
 
82
  #: lite/admin/class-email-subscribers-admin.php:178
83
- #: pro/pro-class-email-subscribers.php:628
84
  msgid "Please add email body."
85
  msgstr ""
86
 
@@ -342,7 +342,7 @@ msgstr ""
342
 
343
  #: lite/admin/class-email-subscribers-admin.php:1340
344
  #: lite/includes/class-email-subscribers-activator.php:61
345
- #: lite/includes/class-email-subscribers.php:1493
346
  #: lite/includes/classes/class-es-form-widget.php:11
347
  #: lite/includes/classes/class-es-old-widget.php:13
348
  #: lite/includes/classes/class-es-old-widget.php:15
@@ -489,7 +489,7 @@ msgstr ""
489
  #: lite/admin/class-es-form-admin.php:441
490
  #: lite/includes/classes/class-es-newsletters.php:296
491
  #: lite/includes/classes/class-es-post-notifications.php:546
492
- #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:399
493
  #: lite/includes/workflows/admin/views/meta-box-save.php:68
494
  msgid "Save"
495
  msgstr ""
@@ -675,7 +675,7 @@ msgstr ""
675
  #: lite/public/partials/class-es-shortcode.php:301
676
  #: pro/classes/class-es-pro-campaign-rules.php:35
677
  #: pro/classes/class-es-pro-embed-form.php:175
678
- #: pro/pro-class-email-subscribers.php:2298
679
  msgid "Email"
680
  msgstr ""
681
 
@@ -821,6 +821,7 @@ msgstr ""
821
  #: lite/admin/class-ig-es-campaign-rules.php:261
822
  #: lite/admin/class-ig-es-campaign-rules.php:444
823
  #: lite/admin/class-ig-es-campaign-rules.php:592
 
824
  msgid "and"
825
  msgstr ""
826
 
@@ -946,6 +947,8 @@ msgstr ""
946
  #: lite/admin/class-ig-es-campaign-rules.php:701
947
  #: lite/admin/class-ig-es-campaign-rules.php:718
948
  #: lite/admin/class-ig-es-campaign-rules.php:737
 
 
949
  msgid "is"
950
  msgstr ""
951
 
@@ -953,11 +956,14 @@ msgstr ""
953
  #: lite/admin/class-ig-es-campaign-rules.php:702
954
  #: lite/admin/class-ig-es-campaign-rules.php:719
955
  #: lite/admin/class-ig-es-campaign-rules.php:738
 
 
956
  msgid "is not"
957
  msgstr ""
958
 
959
  #: lite/admin/class-ig-es-campaign-rules.php:680
960
  #: lite/admin/class-ig-es-campaign-rules.php:720
 
961
  msgid "contains"
962
  msgstr ""
963
 
@@ -973,11 +979,13 @@ msgstr ""
973
 
974
  #: lite/admin/class-ig-es-campaign-rules.php:683
975
  #: lite/admin/class-ig-es-campaign-rules.php:723
 
976
  msgid "ends with"
977
  msgstr ""
978
 
979
  #: lite/admin/class-ig-es-campaign-rules.php:684
980
  #: lite/admin/class-ig-es-campaign-rules.php:703
 
981
  msgid "is greater than"
982
  msgstr ""
983
 
@@ -1679,16 +1687,16 @@ msgid "OK, I Got it!"
1679
  msgstr ""
1680
 
1681
  #. translators: 1: Error message 2: File name 3: Line number
1682
- #: lite/includes/class-email-subscribers.php:1286
1683
  msgid "%1$s in %2$s on line %3$s"
1684
  msgstr ""
1685
 
1686
- #: lite/includes/class-email-subscribers.php:1506
1687
  msgid "Icegram WC"
1688
  msgstr ""
1689
 
1690
  #. translators: %1$s - constant that was used
1691
- #: lite/includes/class-email-subscribers.php:1981
1692
  msgid "Value was set using constant %1$s"
1693
  msgstr ""
1694
 
@@ -1923,11 +1931,11 @@ msgstr ""
1923
  #: lite/includes/workflows/admin/views/meta-box-timing.php:82
1924
  #: lite/includes/workflows/fields/class-es-date.php:31
1925
  #: pro/classes/class-es-campaign-admin-pro.php:194
1926
- #: pro/pro-class-email-subscribers.php:893
1927
  msgid "Date"
1928
  msgstr ""
1929
 
1930
- #: lite/includes/class-es-install.php:989
1931
  #: lite/includes/upgrade/es-update-functions.php:752
1932
  msgid "Your subscription was successful! Kindly check your mailbox and confirm your subscription. If you don't see the email within a few minutes, check the spam/junk folder."
1933
  msgstr ""
@@ -2119,135 +2127,139 @@ msgstr ""
2119
  msgid "Be careful with this! When enabled, it will remove all lists, campaigns and other data if you uninstall the plugin."
2120
  msgstr ""
2121
 
2122
- #: lite/includes/classes/class-es-admin-settings.php:409
2123
- msgid " We will take care of it. You don't need to visit this URL manually."
 
 
 
 
2124
  msgstr ""
2125
 
2126
  #. translators: %s: Link to Icegram documentation
2127
- #: lite/includes/classes/class-es-admin-settings.php:412
2128
  msgid "You need to visit this URL to send email notifications. Know <a href='%s' target='_blank'>how to run this in background</a>"
2129
  msgstr ""
2130
 
2131
- #: lite/includes/classes/class-es-admin-settings.php:415
2132
  msgid "How to configure Email Sending"
2133
  msgstr ""
2134
 
2135
- #: lite/includes/classes/class-es-admin-settings.php:431
2136
  msgid "Cron URL"
2137
  msgstr ""
2138
 
2139
- #: lite/includes/classes/class-es-admin-settings.php:440
2140
  msgid "Disable Wordpress Cron"
2141
  msgstr ""
2142
 
2143
- #: lite/includes/classes/class-es-admin-settings.php:441
2144
  msgid "Enable this option if you do not want Email Subscribers to use WP Cron to send emails."
2145
  msgstr ""
2146
 
2147
- #: lite/includes/classes/class-es-admin-settings.php:446
2148
  msgid "Send emails at most every"
2149
  msgstr ""
2150
 
2151
- #: lite/includes/classes/class-es-admin-settings.php:449
2152
  msgid "Optional if a real cron service is used"
2153
  msgstr ""
2154
 
2155
- #: lite/includes/classes/class-es-admin-settings.php:459
2156
  msgid "Maximum emails to send in an hour"
2157
  msgstr ""
2158
 
2159
- #: lite/includes/classes/class-es-admin-settings.php:460
2160
  msgid "Total emails your host can send in an hour.<br>Total emails sent in current hour: <b>"
2161
  msgstr ""
2162
 
2163
- #: lite/includes/classes/class-es-admin-settings.php:469
2164
  msgid "Maximum emails to send at once"
2165
  msgstr ""
2166
 
2167
- #: lite/includes/classes/class-es-admin-settings.php:470
2168
  msgid "Maximum emails you want to send on every cron request."
2169
  msgstr ""
2170
 
2171
- #: lite/includes/classes/class-es-admin-settings.php:481
2172
  msgid "Send test email"
2173
  msgstr ""
2174
 
2175
- #: lite/includes/classes/class-es-admin-settings.php:482
2176
  msgid "Enter email address to send test email."
2177
  msgstr ""
2178
 
2179
- #: lite/includes/classes/class-es-admin-settings.php:490
2180
  msgid "Select Mailer"
2181
  msgstr ""
2182
 
2183
- #: lite/includes/classes/class-es-admin-settings.php:502
2184
- #: lite/includes/classes/class-es-admin-settings.php:848
2185
  msgid "Pepipost API key"
2186
  msgstr ""
2187
 
2188
- #: lite/includes/classes/class-es-admin-settings.php:519
2189
  msgid "Select a mailer to send mail"
2190
  msgstr ""
2191
 
2192
- #: lite/includes/classes/class-es-admin-settings.php:529
2193
  msgid "Blocked domain(s)"
2194
  msgstr ""
2195
 
2196
- #: lite/includes/classes/class-es-admin-settings.php:531
2197
  msgid "Seeing spam signups from particular domains? Enter domains names (one per line) that you want to block here."
2198
  msgstr ""
2199
 
2200
- #: lite/includes/classes/class-es-admin-settings.php:743
2201
  msgid "Save Settings"
2202
  msgstr ""
2203
 
2204
- #: lite/includes/classes/class-es-admin-settings.php:847
2205
  msgid "Signup for Pepipost"
2206
  msgstr ""
2207
 
2208
- #: lite/includes/classes/class-es-admin-settings.php:848
2209
  msgid "How to find"
2210
  msgstr ""
2211
 
2212
- #: lite/includes/classes/class-es-admin-settings.php:849
2213
  msgid "Why to choose Pepipost"
2214
  msgstr ""
2215
 
2216
- #: lite/includes/classes/class-es-admin-settings.php:873
2217
  msgid "Cron Info"
2218
  msgstr ""
2219
 
2220
- #: lite/includes/classes/class-es-admin-settings.php:940
2221
  msgid "Event"
2222
  msgstr ""
2223
 
2224
- #: lite/includes/classes/class-es-admin-settings.php:941
2225
  msgid "Interval"
2226
  msgstr ""
2227
 
2228
- #: lite/includes/classes/class-es-admin-settings.php:942
2229
  msgid "Next Execution"
2230
  msgstr ""
2231
 
2232
  #. translators: %s: Next scheduled time
2233
- #: lite/includes/classes/class-es-admin-settings.php:988
2234
  msgid "In %s"
2235
  msgstr ""
2236
 
2237
- #: lite/includes/classes/class-es-admin-settings.php:1023
2238
  msgid "Plugin usage tracking"
2239
  msgstr ""
2240
 
2241
- #: lite/includes/classes/class-es-admin-settings.php:1026
2242
  msgid "Help us to improve Email Subscribers by opting in to share non-sensitive plugin usage data."
2243
  msgstr ""
2244
 
2245
- #: lite/includes/classes/class-es-admin-settings.php:1057
2246
  msgid "Now you can control all your notifications through workflows."
2247
  msgstr ""
2248
 
2249
  #. translators: 1. Anchor start tag 2. Anchor end tag
2250
- #: lite/includes/classes/class-es-admin-settings.php:1060
2251
  msgid "Click %1$shere%2$s to go to workflows."
2252
  msgstr ""
2253
 
@@ -2306,7 +2318,7 @@ msgstr ""
2306
 
2307
  #: lite/includes/classes/class-es-campaign-report.php:240
2308
  #: pro/classes/class-es-pro-reports-data.php:261
2309
- #: pro/pro-class-email-subscribers.php:1349
2310
  msgid "Clicked"
2311
  msgstr ""
2312
 
@@ -2717,41 +2729,41 @@ msgstr ""
2717
  msgid "30 minutes"
2718
  msgstr ""
2719
 
2720
- #: lite/includes/classes/class-es-cron.php:642
2721
  msgid "Emails sent successfully!"
2722
  msgstr ""
2723
 
2724
- #: lite/includes/classes/class-es-cron.php:643
2725
  msgid "Emails not found."
2726
  msgstr ""
2727
 
2728
- #: lite/includes/classes/class-es-cron.php:644
2729
  msgid "No notifications found to send."
2730
  msgstr ""
2731
 
2732
- #: lite/includes/classes/class-es-cron.php:645
2733
- #: lite/includes/classes/class-es-cron.php:646
2734
- #: lite/includes/classes/class-es-cron.php:647
2735
  msgid "Invalid GUID."
2736
  msgstr ""
2737
 
2738
- #: lite/includes/classes/class-es-cron.php:648
2739
  msgid "Not allowed to process request."
2740
  msgstr ""
2741
 
2742
- #: lite/includes/classes/class-es-cron.php:649
2743
  msgid "GUID is empty."
2744
  msgstr ""
2745
 
2746
- #: lite/includes/classes/class-es-cron.php:650
2747
  msgid "Please try after sometime."
2748
  msgstr ""
2749
 
2750
- #: lite/includes/classes/class-es-cron.php:651
2751
  msgid "You have hit your hourly email sending limit. Please try after sometime."
2752
  msgstr ""
2753
 
2754
- #: lite/includes/classes/class-es-cron.php:652
2755
  msgid "Cron lock enabled. Please try after sometime."
2756
  msgstr ""
2757
 
@@ -2799,7 +2811,7 @@ msgstr ""
2799
  #: lite/includes/classes/class-es-import-subscribers.php:682
2800
  #: lite/includes/classes/class-es-import-subscribers.php:1094
2801
  #: lite/includes/classes/class-es-import-subscribers.php:1349
2802
- #: pro/pro-class-email-subscribers.php:2299
2803
  msgid "First Name"
2804
  msgstr ""
2805
 
@@ -2808,7 +2820,7 @@ msgstr ""
2808
  #: lite/includes/classes/class-es-import-subscribers.php:683
2809
  #: lite/includes/classes/class-es-import-subscribers.php:1099
2810
  #: lite/includes/classes/class-es-import-subscribers.php:1350
2811
- #: pro/pro-class-email-subscribers.php:2300
2812
  msgid "Last Name"
2813
  msgstr ""
2814
 
@@ -3694,7 +3706,7 @@ msgstr ""
3694
 
3695
  #. translators: 1: Page 2: Duplicate action 3: Campaign id 4: Wp nonce
3696
  #: lite/includes/classes/class-es-templates-table.php:209
3697
- #: pro/pro-class-email-subscribers.php:1622
3698
  msgid "Duplicate"
3699
  msgstr ""
3700
 
@@ -3971,12 +3983,12 @@ msgid "Access Control"
3971
  msgstr ""
3972
 
3973
  #: lite/includes/pro-features.php:298
3974
- #: pro/pro-class-email-subscribers.php:979
3975
  msgid "Track clicks"
3976
  msgstr ""
3977
 
3978
  #: lite/includes/pro-features.php:299
3979
- #: pro/pro-class-email-subscribers.php:980
3980
  msgid "Do you want to track when people click links in your emails? (We recommend keeping it enabled)"
3981
  msgstr ""
3982
 
@@ -4009,7 +4021,7 @@ msgid "For example : Adds a checkbox to subscribe when people post a comment."
4009
  msgstr ""
4010
 
4011
  #: lite/includes/pro-features.php:331
4012
- #: pro/pro-class-email-subscribers.php:2817
4013
  #: starter/starter-class-email-subscribers.php:604
4014
  msgid "(toggle to enable this)"
4015
  msgstr ""
@@ -4029,7 +4041,7 @@ msgid "Opt-in consent text"
4029
  msgstr ""
4030
 
4031
  #: lite/includes/pro-features.php:372
4032
- #: pro/pro-class-email-subscribers.php:1003
4033
  msgid "Weekly summary"
4034
  msgstr ""
4035
 
@@ -4078,7 +4090,7 @@ msgid "Prevent bot signups even further. Set default captcha option for new subs
4078
  msgstr ""
4079
 
4080
  #: lite/includes/pro-features.php:457
4081
- #: pro/pro-class-email-subscribers.php:988
4082
  msgid "Track IP address"
4083
  msgstr ""
4084
 
@@ -4350,26 +4362,26 @@ msgstr ""
4350
 
4351
  #: lite/includes/pro-features.php:1176
4352
  #: pro/classes/class-es-campaign-admin-pro.php:169
4353
- #: pro/pro-class-email-subscribers.php:874
4354
  msgid "Send options"
4355
  msgstr ""
4356
 
4357
  #: lite/includes/pro-features.php:1179
4358
  #: pro/classes/class-es-campaign-admin-pro.php:180
4359
- #: pro/pro-class-email-subscribers.php:879
4360
  msgid "Schedule for later"
4361
  msgstr ""
4362
 
4363
  #: lite/includes/pro-features.php:1196
4364
  #: lite/includes/workflows/fields/class-es-time.php:64
4365
  #: pro/classes/class-es-campaign-admin-pro.php:208
4366
- #: pro/pro-class-email-subscribers.php:907
4367
  msgid "Time"
4368
  msgstr ""
4369
 
4370
  #: lite/includes/pro-features.php:1206
4371
  #: pro/classes/class-es-campaign-admin-pro.php:223
4372
- #: pro/pro-class-email-subscribers.php:922
4373
  msgid "Local Time: "
4374
  msgstr ""
4375
 
@@ -4483,12 +4495,12 @@ msgid "Mobile"
4483
  msgstr ""
4484
 
4485
  #: lite/includes/pro-features.php:1779
4486
- #: pro/pro-class-email-subscribers.php:1844
4487
  msgid "Add Attachments"
4488
  msgstr ""
4489
 
4490
  #: lite/includes/pro-features.php:1810
4491
- #: pro/pro-class-email-subscribers.php:1971
4492
  msgid "Import existing WordPress users"
4493
  msgstr ""
4494
 
@@ -4572,11 +4584,80 @@ msgstr ""
4572
 
4573
  #: lite/includes/workflows/abstracts/class-es-workflow-action.php:164
4574
  #: lite/includes/workflows/abstracts/class-es-workflow-action.php:179
 
4575
  #: lite/includes/workflows/abstracts/class-es-workflow-trigger.php:384
4576
  #: pro/classes/class-ig-es-unsubscribe-feedback.php:101
4577
  msgid "Other"
4578
  msgstr ""
4579
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4580
  #: lite/includes/workflows/actions/abstracts/class-ig-es-action-send-email-abstract.php:40
4581
  msgid "Send to"
4582
  msgstr ""
@@ -4596,7 +4677,6 @@ msgstr ""
4596
  #: lite/includes/workflows/actions/class-es-action-add-to-list.php:45
4597
  #: pro/workflows/actions/class-es-action-move-to-list.php:44
4598
  #: pro/workflows/actions/class-es-action-remove-from-list.php:49
4599
- #: pro/workflows/triggers/extras/class-es-pro-subscriber-trigger.php:38
4600
  msgid "Select List"
4601
  msgstr ""
4602
 
@@ -4662,10 +4742,14 @@ msgid "Trigger"
4662
  msgstr ""
4663
 
4664
  #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:398
 
 
 
 
4665
  msgid "Actions"
4666
  msgstr ""
4667
 
4668
- #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:400
4669
  msgid "Placeholders"
4670
  msgstr ""
4671
 
@@ -4690,6 +4774,23 @@ msgstr ""
4690
  msgid "Workflow priority"
4691
  msgstr ""
4692
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4693
  #: lite/includes/workflows/admin/views/meta-box-save.php:58
4694
  msgid "Performs add to list action on existing orders that match trigger conditions."
4695
  msgstr ""
@@ -4887,11 +4988,11 @@ msgctxt "full name"
4887
  msgid "%1$s %2$s"
4888
  msgstr ""
4889
 
4890
- #: lite/includes/workflows/class-es-workflow.php:1024
4891
  msgid "Missing action_name key in array."
4892
  msgstr ""
4893
 
4894
- #: lite/includes/workflows/class-es-workflow.php:1030
4895
  msgid "Could not retrieve the action."
4896
  msgstr ""
4897
 
@@ -5032,7 +5133,7 @@ msgid "Send welcome email when someone subscribes"
5032
  msgstr ""
5033
 
5034
  #: lite/includes/workflows/db/class-es-db-workflows.php:608
5035
- #: pro/pro-class-email-subscribers.php:2698
5036
  msgid "Send confirmation email"
5037
  msgstr ""
5038
 
@@ -5097,6 +5198,15 @@ msgstr ""
5097
  msgid "Could not insert into '%1$s' table. '%1$s' may not be present in the database."
5098
  msgstr ""
5099
 
 
 
 
 
 
 
 
 
 
5100
  #: lite/includes/workflows/triggers/class-es-trigger-campaign-sent.php:30
5101
  msgid "Campaign sent"
5102
  msgstr ""
@@ -5208,7 +5318,7 @@ msgstr ""
5208
 
5209
  #: lite/public/partials/cron-message.php:43
5210
  #: pro/classes/class-es-campaign-admin-pro.php:174
5211
- #: pro/pro-class-email-subscribers.php:933
5212
  msgid "Send Now"
5213
  msgstr ""
5214
 
@@ -5303,7 +5413,7 @@ msgstr ""
5303
 
5304
  #: pro/classes/class-es-pro-custom-fields-table.php:40
5305
  #: pro/classes/class-es-pro-custom-fields-table.php:92
5306
- #: pro/pro-class-email-subscribers.php:467
5307
  msgid "Custom Fields"
5308
  msgstr ""
5309
 
@@ -5546,7 +5656,7 @@ msgstr ""
5546
  msgid "Total Contacts"
5547
  msgstr ""
5548
 
5549
- #: pro/classes/class-es-subscription-summary-automation.php:99
5550
  msgid "Weekly Report from Email Subscribers"
5551
  msgstr ""
5552
 
@@ -5728,268 +5838,264 @@ msgstr ""
5728
  msgid "Started at"
5729
  msgstr ""
5730
 
5731
- #: pro/pro-class-email-subscribers.php:242
5732
  msgid "Your cart has been restored."
5733
  msgstr ""
5734
 
5735
- #: pro/pro-class-email-subscribers.php:245
5736
  msgid "Your cart could not be restored, it may have expired."
5737
  msgstr ""
5738
 
5739
- #: pro/pro-class-email-subscribers.php:460
5740
  #: pro/pro-class-post-digest.php:33
5741
  msgid "Sequence"
5742
  msgstr ""
5743
 
5744
- #: pro/pro-class-email-subscribers.php:626
5745
  msgid "Please enter an email address."
5746
  msgstr ""
5747
 
5748
- #: pro/pro-class-email-subscribers.php:627
5749
  msgid "Please enter the subject."
5750
  msgstr ""
5751
 
5752
- #: pro/pro-class-email-subscribers.php:629
5753
  msgid "Add Attachment"
5754
  msgstr ""
5755
 
5756
  #. translators: %s: Attachmen max file size.
5757
- #: pro/pro-class-email-subscribers.php:631
5758
  msgid "Please attach a file having size lower than %s."
5759
  msgstr ""
5760
 
5761
- #: pro/pro-class-email-subscribers.php:632
5762
  msgid "Are you sure you want to delete this?"
5763
  msgstr ""
5764
 
5765
- #: pro/pro-class-email-subscribers.php:633
5766
- #: pro/pro-class-email-subscribers.php:2181
5767
  msgid "Checking your orders..."
5768
  msgstr ""
5769
 
5770
- #: pro/pro-class-email-subscribers.php:635
5771
  #: pro/pro-class-sequences.php:674
5772
  msgid "Send immediately"
5773
  msgstr ""
5774
 
5775
- #: pro/pro-class-email-subscribers.php:636
5776
  msgid "Send after"
5777
  msgstr ""
5778
 
5779
- #: pro/pro-class-email-subscribers.php:637
5780
  #: pro/pro-class-sequences.php:587
5781
  msgid "hour(s)"
5782
  msgstr ""
5783
 
5784
- #: pro/pro-class-email-subscribers.php:638
5785
  #: pro/pro-class-sequences.php:588
5786
  msgid "day(s)"
5787
  msgstr ""
5788
 
5789
- #: pro/pro-class-email-subscribers.php:639
5790
  #: pro/pro-class-sequences.php:589
5791
  msgid "week(s)"
5792
  msgstr ""
5793
 
5794
- #: pro/pro-class-email-subscribers.php:769
5795
  msgid "Clean My List"
5796
  msgstr ""
5797
 
5798
- #: pro/pro-class-email-subscribers.php:770
5799
  msgid "List cleanup is in progress..."
5800
  msgstr ""
5801
 
5802
- #: pro/pro-class-email-subscribers.php:771
5803
  msgid "List cleanup completed successfully."
5804
  msgstr ""
5805
 
5806
- #: pro/pro-class-email-subscribers.php:789
5807
  msgid "Email status"
5808
  msgstr ""
5809
 
5810
- #: pro/pro-class-email-subscribers.php:790
5811
  msgid "Last opened at"
5812
  msgstr ""
5813
 
5814
- #: pro/pro-class-email-subscribers.php:944
5815
  msgid "Select page"
5816
  msgstr ""
5817
 
5818
- #: pro/pro-class-email-subscribers.php:957
5819
  msgid "Subscriber will be redirected to selected page (by default, homepage) once they click on unsubscribe link from the email."
5820
  msgstr ""
5821
 
5822
- #: pro/pro-class-email-subscribers.php:970
5823
  msgid "Subscriber will be redirected to selected page (by default, homepage) once they click on email confirmation link from the double opt-in (confirmation) email."
5824
  msgstr ""
5825
 
5826
- #: pro/pro-class-email-subscribers.php:1008
5827
  msgid "Enable?"
5828
  msgstr ""
5829
 
5830
- #: pro/pro-class-email-subscribers.php:1015
5831
  msgid "When our automated weekly email should be sent out?"
5832
  msgstr ""
5833
 
5834
- #: pro/pro-class-email-subscribers.php:1024
5835
  msgid "In which time we need to send our weekly summary?"
5836
  msgstr ""
5837
 
5838
- #: pro/pro-class-email-subscribers.php:1050
5839
  msgid "Access Key ID"
5840
  msgstr ""
5841
 
5842
- #: pro/pro-class-email-subscribers.php:1063
5843
  msgid "Secret Access Key"
5844
  msgstr ""
5845
 
5846
- #: pro/pro-class-email-subscribers.php:1077
5847
  msgid "Closest Region"
5848
  msgstr ""
5849
 
5850
- #: pro/pro-class-email-subscribers.php:1079
5851
  msgid "To decrease network latency between your site and Amazon SES and speed up email sending, select the Amazon SES API region which is closest to where your website is hosted."
5852
  msgstr ""
5853
 
5854
- #: pro/pro-class-email-subscribers.php:1106
5855
  msgid "Private API Key"
5856
  msgstr ""
5857
 
5858
- #: pro/pro-class-email-subscribers.php:1120
5859
  msgid "Domain Name"
5860
  msgstr ""
5861
 
5862
- #: pro/pro-class-email-subscribers.php:1131
5863
- #: pro/pro-class-email-subscribers.php:1206
5864
  msgid "United States"
5865
  msgstr ""
5866
 
5867
- #: pro/pro-class-email-subscribers.php:1132
5868
- #: pro/pro-class-email-subscribers.php:1207
5869
  msgid "Europe"
5870
  msgstr ""
5871
 
5872
- #: pro/pro-class-email-subscribers.php:1138
5873
- #: pro/pro-class-email-subscribers.php:1213
5874
  msgid "Region"
5875
  msgstr ""
5876
 
5877
- #: pro/pro-class-email-subscribers.php:1142
5878
  msgid "mailgun.com"
5879
  msgstr ""
5880
 
5881
- #: pro/pro-class-email-subscribers.php:1168
5882
- #: pro/pro-class-email-subscribers.php:1195
5883
  msgid "API Key"
5884
  msgstr ""
5885
 
5886
- #: pro/pro-class-email-subscribers.php:1215
5887
  msgid "Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region."
5888
  msgstr ""
5889
 
5890
- #: pro/pro-class-email-subscribers.php:1240
5891
  msgid "API token"
5892
  msgstr ""
5893
 
5894
- #: pro/pro-class-email-subscribers.php:1268
5895
  msgid "API key"
5896
  msgstr ""
5897
 
5898
- #: pro/pro-class-email-subscribers.php:1297
5899
  msgid "Public key"
5900
  msgstr ""
5901
 
5902
- #: pro/pro-class-email-subscribers.php:1311
5903
  msgid "Private key"
5904
  msgstr ""
5905
 
5906
- #: pro/pro-class-email-subscribers.php:1644
5907
  msgid "You are not allowed to duplicate campaign."
5908
  msgstr ""
5909
 
5910
- #: pro/pro-class-email-subscribers.php:1659
5911
  msgid "Campaign duplicated !"
5912
  msgstr ""
5913
 
5914
- #: pro/pro-class-email-subscribers.php:1990
5915
  msgid "Import WordPress users with following roles"
5916
  msgstr ""
5917
 
5918
- #: pro/pro-class-email-subscribers.php:2048
5919
- #: pro/pro-class-email-subscribers.php:2188
5920
  msgid "Proceed "
5921
  msgstr ""
5922
 
5923
- #: pro/pro-class-email-subscribers.php:2090
5924
  msgid "Import from WooCommerce orders"
5925
  msgstr ""
5926
 
5927
- #: pro/pro-class-email-subscribers.php:2115
5928
  msgid "Select order statuses"
5929
  msgstr ""
5930
 
5931
- #: pro/pro-class-email-subscribers.php:2169
5932
  msgid "Orders should contain these products"
5933
  msgstr ""
5934
 
5935
- #: pro/pro-class-email-subscribers.php:2175
5936
- msgid "Search products..."
5937
- msgstr ""
5938
-
5939
  #. translators: 1. Processed orders count. 2. Total orders count. 3. Matched orders count.
5940
- #: pro/pro-class-email-subscribers.php:2407
5941
  msgid "Currently %1$s of %2$s orders checked. Found %3$s matching orders."
5942
  msgstr ""
5943
 
5944
- #: pro/pro-class-email-subscribers.php:2418
5945
  msgid "We can't find any matching orders in your store."
5946
  msgstr ""
5947
 
5948
- #: pro/pro-class-email-subscribers.php:2431
5949
  msgid "Total Opened"
5950
  msgstr ""
5951
 
5952
- #: pro/pro-class-email-subscribers.php:2484
5953
  msgid "How to configure Mailgun to send emails in the Email Subscribers plugin?"
5954
  msgstr ""
5955
 
5956
- #: pro/pro-class-email-subscribers.php:2516
5957
  msgid "How to configure SendGrid to send emails in the Email Subscribers plugin?"
5958
  msgstr ""
5959
 
5960
- #: pro/pro-class-email-subscribers.php:2548
5961
  msgid "How to configure Sparkpost to send emails in the Email Subscribers plugin?"
5962
  msgstr ""
5963
 
5964
- #: pro/pro-class-email-subscribers.php:2580
5965
  msgid "How to configure Amazon SES to send emails in the Email Subscribers plugin?"
5966
  msgstr ""
5967
 
5968
- #: pro/pro-class-email-subscribers.php:2612
5969
  msgid "How to configure Postmark to send emails in the Email Subscribers plugin?"
5970
  msgstr ""
5971
 
5972
- #: pro/pro-class-email-subscribers.php:2644
5973
  msgid "How to configure Sendinblue to send emails in the Email Subscribers plugin?"
5974
  msgstr ""
5975
 
5976
- #: pro/pro-class-email-subscribers.php:2676
5977
  msgid "How to configure Mailjet to send emails in the Email Subscribers plugin?"
5978
  msgstr ""
5979
 
5980
- #: pro/pro-class-email-subscribers.php:2713
5981
  msgid "Confirmation emails queued successfully and will be sent shortly."
5982
  msgstr ""
5983
 
5984
- #: pro/pro-class-email-subscribers.php:2721
5985
  msgid "No contacts found. May be they are already queued or there isn't any unconfirmed contact in your selection."
5986
  msgstr ""
5987
 
5988
- #: pro/pro-class-email-subscribers.php:2724
5989
  msgid "Failed to queue confirmation emails. Please try again later."
5990
  msgstr ""
5991
 
5992
- #: pro/pro-class-email-subscribers.php:2816
5993
  msgid "LearnDash optin consent"
5994
  msgstr ""
5995
 
@@ -6202,6 +6308,18 @@ msgstr ""
6202
  msgid "Your wishlist item is now on sale!!!"
6203
  msgstr ""
6204
 
 
 
 
 
 
 
 
 
 
 
 
 
6205
  #: pro/workflows/triggers/abstracts/es-abstract-learndash-user.php:25
6206
  msgid "LearnDash"
6207
  msgstr ""
@@ -6231,6 +6349,46 @@ msgstr ""
6231
  msgid "Fires whenever someone is removed from a course."
6232
  msgstr ""
6233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6234
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:32
6235
  msgid "Fires when user role is changed."
6236
  msgstr ""
@@ -6241,7 +6399,6 @@ msgstr ""
6241
 
6242
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:54
6243
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:64
6244
- #: pro/workflows/triggers/extras/class-es-pro-trigger-user-registered.php:61
6245
  msgid "Select user roles"
6246
  msgstr ""
6247
 
@@ -6300,14 +6457,6 @@ msgid ""
6300
  "\t\t\t Please note this doesn't work for guests because their wishlist data only exists in their session data."
6301
  msgstr ""
6302
 
6303
- #: pro/workflows/triggers/extras/class-es-pro-trigger-user-registered.php:60
6304
- msgid "User roles"
6305
- msgstr ""
6306
-
6307
- #: pro/workflows/triggers/extras/class-es-pro-trigger-user-registered.php:62
6308
- msgid "Select user roles for which this trigger should run. If left empty, trigger will run for all user roles."
6309
- msgstr ""
6310
-
6311
  #: pro/workflows/variables/cart-item-count.php:17
6312
  msgid "Displays the number of the items in cart."
6313
  msgstr ""
2
  # This file is distributed under the same license as the Email Subscribers & Newsletters plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Email Subscribers & Newsletters 5.4.6\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/email-subscribers\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-03T07:18:21+02: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: email-subscribers\n"
29
 
30
  #. Author of the plugin
31
  #: lite/admin/partials/help.php:28
32
+ #: lite/includes/class-email-subscribers.php:1506
33
  msgid "Icegram"
34
  msgstr ""
35
 
80
  msgstr ""
81
 
82
  #: lite/admin/class-email-subscribers-admin.php:178
83
+ #: pro/pro-class-email-subscribers.php:636
84
  msgid "Please add email body."
85
  msgstr ""
86
 
342
 
343
  #: lite/admin/class-email-subscribers-admin.php:1340
344
  #: lite/includes/class-email-subscribers-activator.php:61
345
+ #: lite/includes/class-email-subscribers.php:1503
346
  #: lite/includes/classes/class-es-form-widget.php:11
347
  #: lite/includes/classes/class-es-old-widget.php:13
348
  #: lite/includes/classes/class-es-old-widget.php:15
489
  #: lite/admin/class-es-form-admin.php:441
490
  #: lite/includes/classes/class-es-newsletters.php:296
491
  #: lite/includes/classes/class-es-post-notifications.php:546
492
+ #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:400
493
  #: lite/includes/workflows/admin/views/meta-box-save.php:68
494
  msgid "Save"
495
  msgstr ""
675
  #: lite/public/partials/class-es-shortcode.php:301
676
  #: pro/classes/class-es-pro-campaign-rules.php:35
677
  #: pro/classes/class-es-pro-embed-form.php:175
678
+ #: pro/pro-class-email-subscribers.php:2355
679
  msgid "Email"
680
  msgstr ""
681
 
821
  #: lite/admin/class-ig-es-campaign-rules.php:261
822
  #: lite/admin/class-ig-es-campaign-rules.php:444
823
  #: lite/admin/class-ig-es-campaign-rules.php:592
824
+ #: lite/includes/workflows/admin/views/meta-box-rules.php:94
825
  msgid "and"
826
  msgstr ""
827
 
947
  #: lite/admin/class-ig-es-campaign-rules.php:701
948
  #: lite/admin/class-ig-es-campaign-rules.php:718
949
  #: lite/admin/class-ig-es-campaign-rules.php:737
950
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:187
951
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:202
952
  msgid "is"
953
  msgstr ""
954
 
956
  #: lite/admin/class-ig-es-campaign-rules.php:702
957
  #: lite/admin/class-ig-es-campaign-rules.php:719
958
  #: lite/admin/class-ig-es-campaign-rules.php:738
959
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:188
960
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:203
961
  msgid "is not"
962
  msgstr ""
963
 
964
  #: lite/admin/class-ig-es-campaign-rules.php:680
965
  #: lite/admin/class-ig-es-campaign-rules.php:720
966
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:200
967
  msgid "contains"
968
  msgstr ""
969
 
979
 
980
  #: lite/admin/class-ig-es-campaign-rules.php:683
981
  #: lite/admin/class-ig-es-campaign-rules.php:723
982
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:205
983
  msgid "ends with"
984
  msgstr ""
985
 
986
  #: lite/admin/class-ig-es-campaign-rules.php:684
987
  #: lite/admin/class-ig-es-campaign-rules.php:703
988
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:235
989
  msgid "is greater than"
990
  msgstr ""
991
 
1687
  msgstr ""
1688
 
1689
  #. translators: 1: Error message 2: File name 3: Line number
1690
+ #: lite/includes/class-email-subscribers.php:1296
1691
  msgid "%1$s in %2$s on line %3$s"
1692
  msgstr ""
1693
 
1694
+ #: lite/includes/class-email-subscribers.php:1516
1695
  msgid "Icegram WC"
1696
  msgstr ""
1697
 
1698
  #. translators: %1$s - constant that was used
1699
+ #: lite/includes/class-email-subscribers.php:1991
1700
  msgid "Value was set using constant %1$s"
1701
  msgstr ""
1702
 
1931
  #: lite/includes/workflows/admin/views/meta-box-timing.php:82
1932
  #: lite/includes/workflows/fields/class-es-date.php:31
1933
  #: pro/classes/class-es-campaign-admin-pro.php:194
1934
+ #: pro/pro-class-email-subscribers.php:901
1935
  msgid "Date"
1936
  msgstr ""
1937
 
1938
+ #: lite/includes/class-es-install.php:993
1939
  #: lite/includes/upgrade/es-update-functions.php:752
1940
  msgid "Your subscription was successful! Kindly check your mailbox and confirm your subscription. If you don't see the email within a few minutes, check the spam/junk folder."
1941
  msgstr ""
2127
  msgid "Be careful with this! When enabled, it will remove all lists, campaigns and other data if you uninstall the plugin."
2128
  msgstr ""
2129
 
2130
+ #: lite/includes/classes/class-es-admin-settings.php:413
2131
+ msgid "<br><span class=\"ml-6\">Cron last hit time : <b>"
2132
+ msgstr ""
2133
+
2134
+ #: lite/includes/classes/class-es-admin-settings.php:420
2135
+ msgid "<span class=\"es-send-success es-icon\"></span> We will take care of it. You don't need to visit this URL manually."
2136
  msgstr ""
2137
 
2138
  #. translators: %s: Link to Icegram documentation
2139
+ #: lite/includes/classes/class-es-admin-settings.php:423
2140
  msgid "You need to visit this URL to send email notifications. Know <a href='%s' target='_blank'>how to run this in background</a>"
2141
  msgstr ""
2142
 
2143
+ #: lite/includes/classes/class-es-admin-settings.php:426
2144
  msgid "How to configure Email Sending"
2145
  msgstr ""
2146
 
2147
+ #: lite/includes/classes/class-es-admin-settings.php:442
2148
  msgid "Cron URL"
2149
  msgstr ""
2150
 
2151
+ #: lite/includes/classes/class-es-admin-settings.php:451
2152
  msgid "Disable Wordpress Cron"
2153
  msgstr ""
2154
 
2155
+ #: lite/includes/classes/class-es-admin-settings.php:452
2156
  msgid "Enable this option if you do not want Email Subscribers to use WP Cron to send emails."
2157
  msgstr ""
2158
 
2159
+ #: lite/includes/classes/class-es-admin-settings.php:457
2160
  msgid "Send emails at most every"
2161
  msgstr ""
2162
 
2163
+ #: lite/includes/classes/class-es-admin-settings.php:460
2164
  msgid "Optional if a real cron service is used"
2165
  msgstr ""
2166
 
2167
+ #: lite/includes/classes/class-es-admin-settings.php:470
2168
  msgid "Maximum emails to send in an hour"
2169
  msgstr ""
2170
 
2171
+ #: lite/includes/classes/class-es-admin-settings.php:471
2172
  msgid "Total emails your host can send in an hour.<br>Total emails sent in current hour: <b>"
2173
  msgstr ""
2174
 
2175
+ #: lite/includes/classes/class-es-admin-settings.php:480
2176
  msgid "Maximum emails to send at once"
2177
  msgstr ""
2178
 
2179
+ #: lite/includes/classes/class-es-admin-settings.php:481
2180
  msgid "Maximum emails you want to send on every cron request."
2181
  msgstr ""
2182
 
2183
+ #: lite/includes/classes/class-es-admin-settings.php:492
2184
  msgid "Send test email"
2185
  msgstr ""
2186
 
2187
+ #: lite/includes/classes/class-es-admin-settings.php:493
2188
  msgid "Enter email address to send test email."
2189
  msgstr ""
2190
 
2191
+ #: lite/includes/classes/class-es-admin-settings.php:501
2192
  msgid "Select Mailer"
2193
  msgstr ""
2194
 
2195
+ #: lite/includes/classes/class-es-admin-settings.php:513
2196
+ #: lite/includes/classes/class-es-admin-settings.php:859
2197
  msgid "Pepipost API key"
2198
  msgstr ""
2199
 
2200
+ #: lite/includes/classes/class-es-admin-settings.php:530
2201
  msgid "Select a mailer to send mail"
2202
  msgstr ""
2203
 
2204
+ #: lite/includes/classes/class-es-admin-settings.php:540
2205
  msgid "Blocked domain(s)"
2206
  msgstr ""
2207
 
2208
+ #: lite/includes/classes/class-es-admin-settings.php:542
2209
  msgid "Seeing spam signups from particular domains? Enter domains names (one per line) that you want to block here."
2210
  msgstr ""
2211
 
2212
+ #: lite/includes/classes/class-es-admin-settings.php:754
2213
  msgid "Save Settings"
2214
  msgstr ""
2215
 
2216
+ #: lite/includes/classes/class-es-admin-settings.php:858
2217
  msgid "Signup for Pepipost"
2218
  msgstr ""
2219
 
2220
+ #: lite/includes/classes/class-es-admin-settings.php:859
2221
  msgid "How to find"
2222
  msgstr ""
2223
 
2224
+ #: lite/includes/classes/class-es-admin-settings.php:860
2225
  msgid "Why to choose Pepipost"
2226
  msgstr ""
2227
 
2228
+ #: lite/includes/classes/class-es-admin-settings.php:884
2229
  msgid "Cron Info"
2230
  msgstr ""
2231
 
2232
+ #: lite/includes/classes/class-es-admin-settings.php:951
2233
  msgid "Event"
2234
  msgstr ""
2235
 
2236
+ #: lite/includes/classes/class-es-admin-settings.php:952
2237
  msgid "Interval"
2238
  msgstr ""
2239
 
2240
+ #: lite/includes/classes/class-es-admin-settings.php:953
2241
  msgid "Next Execution"
2242
  msgstr ""
2243
 
2244
  #. translators: %s: Next scheduled time
2245
+ #: lite/includes/classes/class-es-admin-settings.php:999
2246
  msgid "In %s"
2247
  msgstr ""
2248
 
2249
+ #: lite/includes/classes/class-es-admin-settings.php:1034
2250
  msgid "Plugin usage tracking"
2251
  msgstr ""
2252
 
2253
+ #: lite/includes/classes/class-es-admin-settings.php:1037
2254
  msgid "Help us to improve Email Subscribers by opting in to share non-sensitive plugin usage data."
2255
  msgstr ""
2256
 
2257
+ #: lite/includes/classes/class-es-admin-settings.php:1068
2258
  msgid "Now you can control all your notifications through workflows."
2259
  msgstr ""
2260
 
2261
  #. translators: 1. Anchor start tag 2. Anchor end tag
2262
+ #: lite/includes/classes/class-es-admin-settings.php:1071
2263
  msgid "Click %1$shere%2$s to go to workflows."
2264
  msgstr ""
2265
 
2318
 
2319
  #: lite/includes/classes/class-es-campaign-report.php:240
2320
  #: pro/classes/class-es-pro-reports-data.php:261
2321
+ #: pro/pro-class-email-subscribers.php:1357
2322
  msgid "Clicked"
2323
  msgstr ""
2324
 
2729
  msgid "30 minutes"
2730
  msgstr ""
2731
 
2732
+ #: lite/includes/classes/class-es-cron.php:650
2733
  msgid "Emails sent successfully!"
2734
  msgstr ""
2735
 
2736
+ #: lite/includes/classes/class-es-cron.php:651
2737
  msgid "Emails not found."
2738
  msgstr ""
2739
 
2740
+ #: lite/includes/classes/class-es-cron.php:652
2741
  msgid "No notifications found to send."
2742
  msgstr ""
2743
 
2744
+ #: lite/includes/classes/class-es-cron.php:653
2745
+ #: lite/includes/classes/class-es-cron.php:654
2746
+ #: lite/includes/classes/class-es-cron.php:655
2747
  msgid "Invalid GUID."
2748
  msgstr ""
2749
 
2750
+ #: lite/includes/classes/class-es-cron.php:656
2751
  msgid "Not allowed to process request."
2752
  msgstr ""
2753
 
2754
+ #: lite/includes/classes/class-es-cron.php:657
2755
  msgid "GUID is empty."
2756
  msgstr ""
2757
 
2758
+ #: lite/includes/classes/class-es-cron.php:658
2759
  msgid "Please try after sometime."
2760
  msgstr ""
2761
 
2762
+ #: lite/includes/classes/class-es-cron.php:659
2763
  msgid "You have hit your hourly email sending limit. Please try after sometime."
2764
  msgstr ""
2765
 
2766
+ #: lite/includes/classes/class-es-cron.php:660
2767
  msgid "Cron lock enabled. Please try after sometime."
2768
  msgstr ""
2769
 
2811
  #: lite/includes/classes/class-es-import-subscribers.php:682
2812
  #: lite/includes/classes/class-es-import-subscribers.php:1094
2813
  #: lite/includes/classes/class-es-import-subscribers.php:1349
2814
+ #: pro/pro-class-email-subscribers.php:2356
2815
  msgid "First Name"
2816
  msgstr ""
2817
 
2820
  #: lite/includes/classes/class-es-import-subscribers.php:683
2821
  #: lite/includes/classes/class-es-import-subscribers.php:1099
2822
  #: lite/includes/classes/class-es-import-subscribers.php:1350
2823
+ #: pro/pro-class-email-subscribers.php:2357
2824
  msgid "Last Name"
2825
  msgstr ""
2826
 
3706
 
3707
  #. translators: 1: Page 2: Duplicate action 3: Campaign id 4: Wp nonce
3708
  #: lite/includes/classes/class-es-templates-table.php:209
3709
+ #: pro/pro-class-email-subscribers.php:1679
3710
  msgid "Duplicate"
3711
  msgstr ""
3712
 
3983
  msgstr ""
3984
 
3985
  #: lite/includes/pro-features.php:298
3986
+ #: pro/pro-class-email-subscribers.php:987
3987
  msgid "Track clicks"
3988
  msgstr ""
3989
 
3990
  #: lite/includes/pro-features.php:299
3991
+ #: pro/pro-class-email-subscribers.php:988
3992
  msgid "Do you want to track when people click links in your emails? (We recommend keeping it enabled)"
3993
  msgstr ""
3994
 
4021
  msgstr ""
4022
 
4023
  #: lite/includes/pro-features.php:331
4024
+ #: pro/pro-class-email-subscribers.php:2874
4025
  #: starter/starter-class-email-subscribers.php:604
4026
  msgid "(toggle to enable this)"
4027
  msgstr ""
4041
  msgstr ""
4042
 
4043
  #: lite/includes/pro-features.php:372
4044
+ #: pro/pro-class-email-subscribers.php:1011
4045
  msgid "Weekly summary"
4046
  msgstr ""
4047
 
4090
  msgstr ""
4091
 
4092
  #: lite/includes/pro-features.php:457
4093
+ #: pro/pro-class-email-subscribers.php:996
4094
  msgid "Track IP address"
4095
  msgstr ""
4096
 
4362
 
4363
  #: lite/includes/pro-features.php:1176
4364
  #: pro/classes/class-es-campaign-admin-pro.php:169
4365
+ #: pro/pro-class-email-subscribers.php:882
4366
  msgid "Send options"
4367
  msgstr ""
4368
 
4369
  #: lite/includes/pro-features.php:1179
4370
  #: pro/classes/class-es-campaign-admin-pro.php:180
4371
+ #: pro/pro-class-email-subscribers.php:887
4372
  msgid "Schedule for later"
4373
  msgstr ""
4374
 
4375
  #: lite/includes/pro-features.php:1196
4376
  #: lite/includes/workflows/fields/class-es-time.php:64
4377
  #: pro/classes/class-es-campaign-admin-pro.php:208
4378
+ #: pro/pro-class-email-subscribers.php:915
4379
  msgid "Time"
4380
  msgstr ""
4381
 
4382
  #: lite/includes/pro-features.php:1206
4383
  #: pro/classes/class-es-campaign-admin-pro.php:223
4384
+ #: pro/pro-class-email-subscribers.php:930
4385
  msgid "Local Time: "
4386
  msgstr ""
4387
 
4495
  msgstr ""
4496
 
4497
  #: lite/includes/pro-features.php:1779
4498
+ #: pro/pro-class-email-subscribers.php:1901
4499
  msgid "Add Attachments"
4500
  msgstr ""
4501
 
4502
  #: lite/includes/pro-features.php:1810
4503
+ #: pro/pro-class-email-subscribers.php:2028
4504
  msgid "Import existing WordPress users"
4505
  msgstr ""
4506
 
4584
 
4585
  #: lite/includes/workflows/abstracts/class-es-workflow-action.php:164
4586
  #: lite/includes/workflows/abstracts/class-es-workflow-action.php:179
4587
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:176
4588
  #: lite/includes/workflows/abstracts/class-es-workflow-trigger.php:384
4589
  #: pro/classes/class-ig-es-unsubscribe-feedback.php:101
4590
  msgid "Other"
4591
  msgstr ""
4592
 
4593
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:201
4594
+ msgid "does not contain"
4595
+ msgstr ""
4596
+
4597
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:204
4598
+ msgid "starts with"
4599
+ msgstr ""
4600
+
4601
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:206
4602
+ msgid "is blank"
4603
+ msgstr ""
4604
+
4605
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:207
4606
+ msgid "is not blank"
4607
+ msgstr ""
4608
+
4609
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:208
4610
+ msgid "matches regex"
4611
+ msgstr ""
4612
+
4613
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:220
4614
+ msgid "any contains"
4615
+ msgstr ""
4616
+
4617
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:221
4618
+ msgid "any matches exactly"
4619
+ msgstr ""
4620
+
4621
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:222
4622
+ msgid "any starts with"
4623
+ msgstr ""
4624
+
4625
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:223
4626
+ msgid "any ends with"
4627
+ msgstr ""
4628
+
4629
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:236
4630
+ msgid "is less than"
4631
+ msgstr ""
4632
+
4633
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:248
4634
+ msgid "is a multiple of"
4635
+ msgstr ""
4636
+
4637
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:249
4638
+ msgid "is not a multiple of"
4639
+ msgstr ""
4640
+
4641
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:260
4642
+ msgid "matches all"
4643
+ msgstr ""
4644
+
4645
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:261
4646
+ msgid "matches any"
4647
+ msgstr ""
4648
+
4649
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:262
4650
+ msgid "matches none"
4651
+ msgstr ""
4652
+
4653
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:273
4654
+ msgid "includes"
4655
+ msgstr ""
4656
+
4657
+ #: lite/includes/workflows/abstracts/class-es-workflow-rule.php:274
4658
+ msgid "does not include"
4659
+ msgstr ""
4660
+
4661
  #: lite/includes/workflows/actions/abstracts/class-ig-es-action-send-email-abstract.php:40
4662
  msgid "Send to"
4663
  msgstr ""
4677
  #: lite/includes/workflows/actions/class-es-action-add-to-list.php:45
4678
  #: pro/workflows/actions/class-es-action-move-to-list.php:44
4679
  #: pro/workflows/actions/class-es-action-remove-from-list.php:49
 
4680
  msgid "Select List"
4681
  msgstr ""
4682
 
4742
  msgstr ""
4743
 
4744
  #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:398
4745
+ msgid "Rules"
4746
+ msgstr ""
4747
+
4748
+ #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:399
4749
  msgid "Actions"
4750
  msgstr ""
4751
 
4752
+ #: lite/includes/workflows/admin/class-es-workflow-admin-edit.php:401
4753
  msgid "Placeholders"
4754
  msgstr ""
4755
 
4774
  msgid "Workflow priority"
4775
  msgstr ""
4776
 
4777
+ #: lite/includes/workflows/admin/views/meta-box-rules.php:56
4778
+ msgid "+ Add Rule Group"
4779
+ msgstr ""
4780
+
4781
+ #. translators: 1: HTML Tag 2: HTML Tag
4782
+ #: lite/includes/workflows/admin/views/meta-box-rules.php:64
4783
+ msgid "Rules can be used to add conditional logic to workflows. Click the %1$s+ Add Rule Group%2$s button to create a rule."
4784
+ msgstr ""
4785
+
4786
+ #: lite/includes/workflows/admin/views/meta-box-rules.php:68
4787
+ msgid "Selected triggers has no rules.. Please select different triggers"
4788
+ msgstr ""
4789
+
4790
+ #: lite/includes/workflows/admin/views/meta-box-rules.php:80
4791
+ msgid "[Select Rule]"
4792
+ msgstr ""
4793
+
4794
  #: lite/includes/workflows/admin/views/meta-box-save.php:58
4795
  msgid "Performs add to list action on existing orders that match trigger conditions."
4796
  msgstr ""
4988
  msgid "%1$s %2$s"
4989
  msgstr ""
4990
 
4991
+ #: lite/includes/workflows/class-es-workflow.php:1118
4992
  msgid "Missing action_name key in array."
4993
  msgstr ""
4994
 
4995
+ #: lite/includes/workflows/class-es-workflow.php:1124
4996
  msgid "Could not retrieve the action."
4997
  msgstr ""
4998
 
5133
  msgstr ""
5134
 
5135
  #: lite/includes/workflows/db/class-es-db-workflows.php:608
5136
+ #: pro/pro-class-email-subscribers.php:2755
5137
  msgid "Send confirmation email"
5138
  msgstr ""
5139
 
5198
  msgid "Could not insert into '%1$s' table. '%1$s' may not be present in the database."
5199
  msgstr ""
5200
 
5201
+ #: lite/includes/workflows/rules/abstracts/class-es-rule-product-select-abstract.php:29
5202
+ #: pro/pro-class-email-subscribers.php:2232
5203
+ msgid "Search products..."
5204
+ msgstr ""
5205
+
5206
+ #: lite/includes/workflows/rules/abstracts/class-es-rule-searchable-select-abstract.php:50
5207
+ msgid "Search..."
5208
+ msgstr ""
5209
+
5210
  #: lite/includes/workflows/triggers/class-es-trigger-campaign-sent.php:30
5211
  msgid "Campaign sent"
5212
  msgstr ""
5318
 
5319
  #: lite/public/partials/cron-message.php:43
5320
  #: pro/classes/class-es-campaign-admin-pro.php:174
5321
+ #: pro/pro-class-email-subscribers.php:941
5322
  msgid "Send Now"
5323
  msgstr ""
5324
 
5413
 
5414
  #: pro/classes/class-es-pro-custom-fields-table.php:40
5415
  #: pro/classes/class-es-pro-custom-fields-table.php:92
5416
+ #: pro/pro-class-email-subscribers.php:475
5417
  msgid "Custom Fields"
5418
  msgstr ""
5419
 
5656
  msgid "Total Contacts"
5657
  msgstr ""
5658
 
5659
+ #: pro/classes/class-es-subscription-summary-automation.php:100
5660
  msgid "Weekly Report from Email Subscribers"
5661
  msgstr ""
5662
 
5838
  msgid "Started at"
5839
  msgstr ""
5840
 
5841
+ #: pro/pro-class-email-subscribers.php:245
5842
  msgid "Your cart has been restored."
5843
  msgstr ""
5844
 
5845
+ #: pro/pro-class-email-subscribers.php:248
5846
  msgid "Your cart could not be restored, it may have expired."
5847
  msgstr ""
5848
 
5849
+ #: pro/pro-class-email-subscribers.php:468
5850
  #: pro/pro-class-post-digest.php:33
5851
  msgid "Sequence"
5852
  msgstr ""
5853
 
5854
+ #: pro/pro-class-email-subscribers.php:634
5855
  msgid "Please enter an email address."
5856
  msgstr ""
5857
 
5858
+ #: pro/pro-class-email-subscribers.php:635
5859
  msgid "Please enter the subject."
5860
  msgstr ""
5861
 
5862
+ #: pro/pro-class-email-subscribers.php:637
5863
  msgid "Add Attachment"
5864
  msgstr ""
5865
 
5866
  #. translators: %s: Attachmen max file size.
5867
+ #: pro/pro-class-email-subscribers.php:639
5868
  msgid "Please attach a file having size lower than %s."
5869
  msgstr ""
5870
 
5871
+ #: pro/pro-class-email-subscribers.php:640
5872
  msgid "Are you sure you want to delete this?"
5873
  msgstr ""
5874
 
5875
+ #: pro/pro-class-email-subscribers.php:641
5876
+ #: pro/pro-class-email-subscribers.php:2238
5877
  msgid "Checking your orders..."
5878
  msgstr ""
5879
 
5880
+ #: pro/pro-class-email-subscribers.php:643
5881
  #: pro/pro-class-sequences.php:674
5882
  msgid "Send immediately"
5883
  msgstr ""
5884
 
5885
+ #: pro/pro-class-email-subscribers.php:644
5886
  msgid "Send after"
5887
  msgstr ""
5888
 
5889
+ #: pro/pro-class-email-subscribers.php:645
5890
  #: pro/pro-class-sequences.php:587
5891
  msgid "hour(s)"
5892
  msgstr ""
5893
 
5894
+ #: pro/pro-class-email-subscribers.php:646
5895
  #: pro/pro-class-sequences.php:588
5896
  msgid "day(s)"
5897
  msgstr ""
5898
 
5899
+ #: pro/pro-class-email-subscribers.php:647
5900
  #: pro/pro-class-sequences.php:589
5901
  msgid "week(s)"
5902
  msgstr ""
5903
 
5904
+ #: pro/pro-class-email-subscribers.php:777
5905
  msgid "Clean My List"
5906
  msgstr ""
5907
 
5908
+ #: pro/pro-class-email-subscribers.php:778
5909
  msgid "List cleanup is in progress..."
5910
  msgstr ""
5911
 
5912
+ #: pro/pro-class-email-subscribers.php:779
5913
  msgid "List cleanup completed successfully."
5914
  msgstr ""
5915
 
5916
+ #: pro/pro-class-email-subscribers.php:797
5917
  msgid "Email status"
5918
  msgstr ""
5919
 
5920
+ #: pro/pro-class-email-subscribers.php:798
5921
  msgid "Last opened at"
5922
  msgstr ""
5923
 
5924
+ #: pro/pro-class-email-subscribers.php:952
5925
  msgid "Select page"
5926
  msgstr ""
5927
 
5928
+ #: pro/pro-class-email-subscribers.php:965
5929
  msgid "Subscriber will be redirected to selected page (by default, homepage) once they click on unsubscribe link from the email."
5930
  msgstr ""
5931
 
5932
+ #: pro/pro-class-email-subscribers.php:978
5933
  msgid "Subscriber will be redirected to selected page (by default, homepage) once they click on email confirmation link from the double opt-in (confirmation) email."
5934
  msgstr ""
5935
 
5936
+ #: pro/pro-class-email-subscribers.php:1016
5937
  msgid "Enable?"
5938
  msgstr ""
5939
 
5940
+ #: pro/pro-class-email-subscribers.php:1023
5941
  msgid "When our automated weekly email should be sent out?"
5942
  msgstr ""
5943
 
5944
+ #: pro/pro-class-email-subscribers.php:1032
5945
  msgid "In which time we need to send our weekly summary?"
5946
  msgstr ""
5947
 
5948
+ #: pro/pro-class-email-subscribers.php:1058
5949
  msgid "Access Key ID"
5950
  msgstr ""
5951
 
5952
+ #: pro/pro-class-email-subscribers.php:1071
5953
  msgid "Secret Access Key"
5954
  msgstr ""
5955
 
5956
+ #: pro/pro-class-email-subscribers.php:1085
5957
  msgid "Closest Region"
5958
  msgstr ""
5959
 
5960
+ #: pro/pro-class-email-subscribers.php:1087
5961
  msgid "To decrease network latency between your site and Amazon SES and speed up email sending, select the Amazon SES API region which is closest to where your website is hosted."
5962
  msgstr ""
5963
 
5964
+ #: pro/pro-class-email-subscribers.php:1114
5965
  msgid "Private API Key"
5966
  msgstr ""
5967
 
5968
+ #: pro/pro-class-email-subscribers.php:1128
5969
  msgid "Domain Name"
5970
  msgstr ""
5971
 
5972
+ #: pro/pro-class-email-subscribers.php:1139
5973
+ #: pro/pro-class-email-subscribers.php:1214
5974
  msgid "United States"
5975
  msgstr ""
5976
 
5977
+ #: pro/pro-class-email-subscribers.php:1140
5978
+ #: pro/pro-class-email-subscribers.php:1215
5979
  msgid "Europe"
5980
  msgstr ""
5981
 
5982
+ #: pro/pro-class-email-subscribers.php:1146
5983
+ #: pro/pro-class-email-subscribers.php:1221
5984
  msgid "Region"
5985
  msgstr ""
5986
 
5987
+ #: pro/pro-class-email-subscribers.php:1150
5988
  msgid "mailgun.com"
5989
  msgstr ""
5990
 
5991
+ #: pro/pro-class-email-subscribers.php:1176
5992
+ #: pro/pro-class-email-subscribers.php:1203
5993
  msgid "API Key"
5994
  msgstr ""
5995
 
5996
+ #: pro/pro-class-email-subscribers.php:1223
5997
  msgid "Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region."
5998
  msgstr ""
5999
 
6000
+ #: pro/pro-class-email-subscribers.php:1248
6001
  msgid "API token"
6002
  msgstr ""
6003
 
6004
+ #: pro/pro-class-email-subscribers.php:1276
6005
  msgid "API key"
6006
  msgstr ""
6007
 
6008
+ #: pro/pro-class-email-subscribers.php:1305
6009
  msgid "Public key"
6010
  msgstr ""
6011
 
6012
+ #: pro/pro-class-email-subscribers.php:1319
6013
  msgid "Private key"
6014
  msgstr ""
6015
 
6016
+ #: pro/pro-class-email-subscribers.php:1701
6017
  msgid "You are not allowed to duplicate campaign."
6018
  msgstr ""
6019
 
6020
+ #: pro/pro-class-email-subscribers.php:1716
6021
  msgid "Campaign duplicated !"
6022
  msgstr ""
6023
 
6024
+ #: pro/pro-class-email-subscribers.php:2047
6025
  msgid "Import WordPress users with following roles"
6026
  msgstr ""
6027
 
6028
+ #: pro/pro-class-email-subscribers.php:2105
6029
+ #: pro/pro-class-email-subscribers.php:2245
6030
  msgid "Proceed "
6031
  msgstr ""
6032
 
6033
+ #: pro/pro-class-email-subscribers.php:2147
6034
  msgid "Import from WooCommerce orders"
6035
  msgstr ""
6036
 
6037
+ #: pro/pro-class-email-subscribers.php:2172
6038
  msgid "Select order statuses"
6039
  msgstr ""
6040
 
6041
+ #: pro/pro-class-email-subscribers.php:2226
6042
  msgid "Orders should contain these products"
6043
  msgstr ""
6044
 
 
 
 
 
6045
  #. translators: 1. Processed orders count. 2. Total orders count. 3. Matched orders count.
6046
+ #: pro/pro-class-email-subscribers.php:2464
6047
  msgid "Currently %1$s of %2$s orders checked. Found %3$s matching orders."
6048
  msgstr ""
6049
 
6050
+ #: pro/pro-class-email-subscribers.php:2475
6051
  msgid "We can't find any matching orders in your store."
6052
  msgstr ""
6053
 
6054
+ #: pro/pro-class-email-subscribers.php:2488
6055
  msgid "Total Opened"
6056
  msgstr ""
6057
 
6058
+ #: pro/pro-class-email-subscribers.php:2541
6059
  msgid "How to configure Mailgun to send emails in the Email Subscribers plugin?"
6060
  msgstr ""
6061
 
6062
+ #: pro/pro-class-email-subscribers.php:2573
6063
  msgid "How to configure SendGrid to send emails in the Email Subscribers plugin?"
6064
  msgstr ""
6065
 
6066
+ #: pro/pro-class-email-subscribers.php:2605
6067
  msgid "How to configure Sparkpost to send emails in the Email Subscribers plugin?"
6068
  msgstr ""
6069
 
6070
+ #: pro/pro-class-email-subscribers.php:2637
6071
  msgid "How to configure Amazon SES to send emails in the Email Subscribers plugin?"
6072
  msgstr ""
6073
 
6074
+ #: pro/pro-class-email-subscribers.php:2669
6075
  msgid "How to configure Postmark to send emails in the Email Subscribers plugin?"
6076
  msgstr ""
6077
 
6078
+ #: pro/pro-class-email-subscribers.php:2701
6079
  msgid "How to configure Sendinblue to send emails in the Email Subscribers plugin?"
6080
  msgstr ""
6081
 
6082
+ #: pro/pro-class-email-subscribers.php:2733
6083
  msgid "How to configure Mailjet to send emails in the Email Subscribers plugin?"
6084
  msgstr ""
6085
 
6086
+ #: pro/pro-class-email-subscribers.php:2770
6087
  msgid "Confirmation emails queued successfully and will be sent shortly."
6088
  msgstr ""
6089
 
6090
+ #: pro/pro-class-email-subscribers.php:2778
6091
  msgid "No contacts found. May be they are already queued or there isn't any unconfirmed contact in your selection."
6092
  msgstr ""
6093
 
6094
+ #: pro/pro-class-email-subscribers.php:2781
6095
  msgid "Failed to queue confirmation emails. Please try again later."
6096
  msgstr ""
6097
 
6098
+ #: pro/pro-class-email-subscribers.php:2873
6099
  msgid "LearnDash optin consent"
6100
  msgstr ""
6101
 
6308
  msgid "Your wishlist item is now on sale!!!"
6309
  msgstr ""
6310
 
6311
+ #: pro/workflows/rules/class-es-rule-order-items.php:22
6312
+ msgid "Order - Items"
6313
+ msgstr ""
6314
+
6315
+ #: pro/workflows/rules/class-es-rule-subscriber-list.php:23
6316
+ msgid "Subscriber - List"
6317
+ msgstr ""
6318
+
6319
+ #: pro/workflows/rules/class-es-rule-user-roles.php:22
6320
+ msgid "User - Role"
6321
+ msgstr ""
6322
+
6323
  #: pro/workflows/triggers/abstracts/es-abstract-learndash-user.php:25
6324
  msgid "LearnDash"
6325
  msgstr ""
6349
  msgid "Fires whenever someone is removed from a course."
6350
  msgstr ""
6351
 
6352
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-canceled.php:30
6353
+ msgid "Membership Canceled"
6354
+ msgstr ""
6355
+
6356
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-canceled.php:31
6357
+ msgid "Fires when a user's membership is canceled."
6358
+ msgstr ""
6359
+
6360
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-expired.php:30
6361
+ msgid "Membership Expired"
6362
+ msgstr ""
6363
+
6364
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-expired.php:31
6365
+ msgid "Fires when a user's membership is expired."
6366
+ msgstr ""
6367
+
6368
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-purchased.php:30
6369
+ msgid "Membership Purchased"
6370
+ msgstr ""
6371
+
6372
+ #: pro/workflows/triggers/class-es-trigger-pmp-membership-purchased.php:31
6373
+ msgid "Fires when user purchases a membership."
6374
+ msgstr ""
6375
+
6376
+ #: pro/workflows/triggers/class-es-trigger-um-membership-approved.php:30
6377
+ msgid "Membership Approved"
6378
+ msgstr ""
6379
+
6380
+ #: pro/workflows/triggers/class-es-trigger-um-membership-approved.php:31
6381
+ msgid "Fires when user's membership is approved."
6382
+ msgstr ""
6383
+
6384
+ #: pro/workflows/triggers/class-es-trigger-um-membership-deactivated.php:30
6385
+ msgid "Membership Deactivated"
6386
+ msgstr ""
6387
+
6388
+ #: pro/workflows/triggers/class-es-trigger-um-membership-deactivated.php:31
6389
+ msgid "Fires when user's membership is deactivated."
6390
+ msgstr ""
6391
+
6392
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:32
6393
  msgid "Fires when user role is changed."
6394
  msgstr ""
6399
 
6400
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:54
6401
  #: pro/workflows/triggers/class-es-trigger-user-role-changed.php:64
 
6402
  msgid "Select user roles"
6403
  msgstr ""
6404
 
6457
  "\t\t\t Please note this doesn't work for guests because their wishlist data only exists in their session data."
6458
  msgstr ""
6459
 
 
 
 
 
 
 
 
 
6460
  #: pro/workflows/variables/cart-item-count.php:17
6461
  msgid "Displays the number of the items in cart."
6462
  msgstr ""
lite/public/class-email-subscribers-public.php CHANGED
@@ -237,8 +237,12 @@ class Email_Subscribers_Public {
237
  $unsubscribe_lists = ES()->lists_contacts_db->get_list_ids_by_contact( $db_id, 'subscribed' );
238
  }
239
 
240
- //update list status
241
- ES()->contacts_db->edit_list_contact_status( array( $db_id ), $unsubscribe_lists, 'unsubscribed' );
 
 
 
 
242
  //check if all list have same status
243
  $list_ids = ES()->lists_contacts_db->get_list_ids_by_contact( $db_id, 'subscribed' );
244
  if ( count( $list_ids ) == 0 ) {
237
  $unsubscribe_lists = ES()->lists_contacts_db->get_list_ids_by_contact( $db_id, 'subscribed' );
238
  }
239
 
240
+ // Confirm if there are lists to unsubscribe before we unsubscribe the contact.
241
+ if ( ! empty( $unsubscribe_lists ) ) {
242
+ //update list status
243
+ ES()->contacts_db->edit_list_contact_status( array( $db_id ), $unsubscribe_lists, 'unsubscribed' );
244
+ }
245
+
246
  //check if all list have same status
247
  $list_ids = ES()->lists_contacts_db->get_list_ids_by_contact( $db_id, 'subscribed' );
248
  if ( count( $list_ids ) == 0 ) {
readme.txt CHANGED
@@ -6,7 +6,7 @@ Tags: email marketing, subscription, autoresponder, post notification, welcome e
6
  Requires at least: 3.9
7
  Tested up to: 6.0
8
  Requires PHP: 5.6
9
- Stable tag: 5.4.5
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
@@ -310,13 +310,20 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
310
 
311
  == Upgrade Notice ==
312
 
313
- = 5.4.5 =
314
 
315
- * New: New workflow trigger for LearnDash LMS [PRO]
316
- * Update: Improved send test email feature in campaign preview
 
317
 
318
  == Changelog ==
319
 
 
 
 
 
 
 
320
  **5.4.5 (27.07.2022)**
321
 
322
  * New: New workflow trigger for LearnDash LMS [PRO]
6
  Requires at least: 3.9
7
  Tested up to: 6.0
8
  Requires PHP: 5.6
9
+ Stable tag: 5.4.6
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
310
 
311
  == Upgrade Notice ==
312
 
313
+ = 5.4.6 =
314
 
315
+ * New: New workflow trigger for Paid Membership Pro [PRO]
316
+ * New: New workflow trigger for Ultimate Membe [PRO]
317
+ * Update: Added product rule for WooCommerce order workflow [PRO]
318
 
319
  == Changelog ==
320
 
321
+ **5.4.6 (03.08.2022)**
322
+
323
+ * New: New workflow trigger for Paid Membership Pro [PRO]
324
+ * New: New workflow trigger for Ultimate Membe [PRO]
325
+ * Update: Added product rule for WooCommerce order workflow [PRO]
326
+
327
  **5.4.5 (27.07.2022)**
328
 
329
  * New: New workflow trigger for LearnDash LMS [PRO]