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 | 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 +2 -2
- lite/admin/class-es-campaign-admin.php +1 -1
- lite/admin/css/email-subscribers-admin.css +19 -0
- lite/admin/js/email-subscribers-admin.js +374 -1
- lite/includes/class-email-subscribers.php +10 -0
- lite/includes/class-es-install.php +4 -0
- lite/includes/classes/class-es-admin-settings.php +12 -1
- lite/includes/classes/class-es-cron.php +8 -1
- lite/includes/upgrade/es-update-functions.php +71 -0
- lite/includes/workflows/abstracts/class-es-workflow-rule.php +525 -0
- lite/includes/workflows/admin/class-es-workflow-admin-edit.php +122 -3
- lite/includes/workflows/admin/views/meta-box-actions.php +1 -1
- lite/includes/workflows/admin/views/meta-box-rules.php +99 -0
- lite/includes/workflows/class-es-workflow-rules.php +103 -0
- lite/includes/workflows/class-es-workflow.php +97 -3
- lite/includes/workflows/rules/abstracts/class-es-rule-preloaded-select-abstract.php +47 -0
- lite/includes/workflows/rules/abstracts/class-es-rule-product-select-abstract.php +55 -0
- lite/includes/workflows/rules/abstracts/class-es-rule-searchable-select-abstract.php +68 -0
- lite/includes/workflows/rules/abstracts/class-es-rule-select-abstract.php +131 -0
- lite/language.php +40 -4
- lite/languages/email-subscribers.pot +310 -161
- lite/public/class-email-subscribers-public.php +6 -2
- readme.txt +11 -4
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.
|
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.
|
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>
|
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.
|
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', '
|
398 |
-
add_meta_box( '
|
|
|
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 $
|
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
|
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
|
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 |
-
__( '
|
|
|
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.
|
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-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
1683 |
msgid "%1$s in %2$s on line %3$s"
|
1684 |
msgstr ""
|
1685 |
|
1686 |
-
#: lite/includes/class-email-subscribers.php:
|
1687 |
msgid "Icegram WC"
|
1688 |
msgstr ""
|
1689 |
|
1690 |
#. translators: %1$s - constant that was used
|
1691 |
-
#: lite/includes/class-email-subscribers.php:
|
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:
|
1927 |
msgid "Date"
|
1928 |
msgstr ""
|
1929 |
|
1930 |
-
#: lite/includes/class-es-install.php:
|
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:
|
2123 |
-
msgid "
|
|
|
|
|
|
|
|
|
2124 |
msgstr ""
|
2125 |
|
2126 |
#. translators: %s: Link to Icegram documentation
|
2127 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
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:
|
2132 |
msgid "How to configure Email Sending"
|
2133 |
msgstr ""
|
2134 |
|
2135 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2136 |
msgid "Cron URL"
|
2137 |
msgstr ""
|
2138 |
|
2139 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2140 |
msgid "Disable Wordpress Cron"
|
2141 |
msgstr ""
|
2142 |
|
2143 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
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:
|
2148 |
msgid "Send emails at most every"
|
2149 |
msgstr ""
|
2150 |
|
2151 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2152 |
msgid "Optional if a real cron service is used"
|
2153 |
msgstr ""
|
2154 |
|
2155 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2156 |
msgid "Maximum emails to send in an hour"
|
2157 |
msgstr ""
|
2158 |
|
2159 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
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:
|
2164 |
msgid "Maximum emails to send at once"
|
2165 |
msgstr ""
|
2166 |
|
2167 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2168 |
msgid "Maximum emails you want to send on every cron request."
|
2169 |
msgstr ""
|
2170 |
|
2171 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2172 |
msgid "Send test email"
|
2173 |
msgstr ""
|
2174 |
|
2175 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2176 |
msgid "Enter email address to send test email."
|
2177 |
msgstr ""
|
2178 |
|
2179 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2180 |
msgid "Select Mailer"
|
2181 |
msgstr ""
|
2182 |
|
2183 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2184 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2185 |
msgid "Pepipost API key"
|
2186 |
msgstr ""
|
2187 |
|
2188 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2189 |
msgid "Select a mailer to send mail"
|
2190 |
msgstr ""
|
2191 |
|
2192 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2193 |
msgid "Blocked domain(s)"
|
2194 |
msgstr ""
|
2195 |
|
2196 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
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:
|
2201 |
msgid "Save Settings"
|
2202 |
msgstr ""
|
2203 |
|
2204 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2205 |
msgid "Signup for Pepipost"
|
2206 |
msgstr ""
|
2207 |
|
2208 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2209 |
msgid "How to find"
|
2210 |
msgstr ""
|
2211 |
|
2212 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2213 |
msgid "Why to choose Pepipost"
|
2214 |
msgstr ""
|
2215 |
|
2216 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2217 |
msgid "Cron Info"
|
2218 |
msgstr ""
|
2219 |
|
2220 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2221 |
msgid "Event"
|
2222 |
msgstr ""
|
2223 |
|
2224 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2225 |
msgid "Interval"
|
2226 |
msgstr ""
|
2227 |
|
2228 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2229 |
msgid "Next Execution"
|
2230 |
msgstr ""
|
2231 |
|
2232 |
#. translators: %s: Next scheduled time
|
2233 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2234 |
msgid "In %s"
|
2235 |
msgstr ""
|
2236 |
|
2237 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
2238 |
msgid "Plugin usage tracking"
|
2239 |
msgstr ""
|
2240 |
|
2241 |
-
#: lite/includes/classes/class-es-admin-settings.php:
|
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:
|
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:
|
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:
|
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:
|
2721 |
msgid "Emails sent successfully!"
|
2722 |
msgstr ""
|
2723 |
|
2724 |
-
#: lite/includes/classes/class-es-cron.php:
|
2725 |
msgid "Emails not found."
|
2726 |
msgstr ""
|
2727 |
|
2728 |
-
#: lite/includes/classes/class-es-cron.php:
|
2729 |
msgid "No notifications found to send."
|
2730 |
msgstr ""
|
2731 |
|
2732 |
-
#: lite/includes/classes/class-es-cron.php:
|
2733 |
-
#: lite/includes/classes/class-es-cron.php:
|
2734 |
-
#: lite/includes/classes/class-es-cron.php:
|
2735 |
msgid "Invalid GUID."
|
2736 |
msgstr ""
|
2737 |
|
2738 |
-
#: lite/includes/classes/class-es-cron.php:
|
2739 |
msgid "Not allowed to process request."
|
2740 |
msgstr ""
|
2741 |
|
2742 |
-
#: lite/includes/classes/class-es-cron.php:
|
2743 |
msgid "GUID is empty."
|
2744 |
msgstr ""
|
2745 |
|
2746 |
-
#: lite/includes/classes/class-es-cron.php:
|
2747 |
msgid "Please try after sometime."
|
2748 |
msgstr ""
|
2749 |
|
2750 |
-
#: lite/includes/classes/class-es-cron.php:
|
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:
|
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:
|
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:
|
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:
|
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:
|
3975 |
msgid "Track clicks"
|
3976 |
msgstr ""
|
3977 |
|
3978 |
#: lite/includes/pro-features.php:299
|
3979 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
4487 |
msgid "Add Attachments"
|
4488 |
msgstr ""
|
4489 |
|
4490 |
#: lite/includes/pro-features.php:1810
|
4491 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
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:
|
4891 |
msgid "Missing action_name key in array."
|
4892 |
msgstr ""
|
4893 |
|
4894 |
-
#: lite/includes/workflows/class-es-workflow.php:
|
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:
|
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:
|
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:
|
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:
|
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:
|
5732 |
msgid "Your cart has been restored."
|
5733 |
msgstr ""
|
5734 |
|
5735 |
-
#: pro/pro-class-email-subscribers.php:
|
5736 |
msgid "Your cart could not be restored, it may have expired."
|
5737 |
msgstr ""
|
5738 |
|
5739 |
-
#: pro/pro-class-email-subscribers.php:
|
5740 |
#: pro/pro-class-post-digest.php:33
|
5741 |
msgid "Sequence"
|
5742 |
msgstr ""
|
5743 |
|
5744 |
-
#: pro/pro-class-email-subscribers.php:
|
5745 |
msgid "Please enter an email address."
|
5746 |
msgstr ""
|
5747 |
|
5748 |
-
#: pro/pro-class-email-subscribers.php:
|
5749 |
msgid "Please enter the subject."
|
5750 |
msgstr ""
|
5751 |
|
5752 |
-
#: pro/pro-class-email-subscribers.php:
|
5753 |
msgid "Add Attachment"
|
5754 |
msgstr ""
|
5755 |
|
5756 |
#. translators: %s: Attachmen max file size.
|
5757 |
-
#: pro/pro-class-email-subscribers.php:
|
5758 |
msgid "Please attach a file having size lower than %s."
|
5759 |
msgstr ""
|
5760 |
|
5761 |
-
#: pro/pro-class-email-subscribers.php:
|
5762 |
msgid "Are you sure you want to delete this?"
|
5763 |
msgstr ""
|
5764 |
|
5765 |
-
#: pro/pro-class-email-subscribers.php:
|
5766 |
-
#: pro/pro-class-email-subscribers.php:
|
5767 |
msgid "Checking your orders..."
|
5768 |
msgstr ""
|
5769 |
|
5770 |
-
#: pro/pro-class-email-subscribers.php:
|
5771 |
#: pro/pro-class-sequences.php:674
|
5772 |
msgid "Send immediately"
|
5773 |
msgstr ""
|
5774 |
|
5775 |
-
#: pro/pro-class-email-subscribers.php:
|
5776 |
msgid "Send after"
|
5777 |
msgstr ""
|
5778 |
|
5779 |
-
#: pro/pro-class-email-subscribers.php:
|
5780 |
#: pro/pro-class-sequences.php:587
|
5781 |
msgid "hour(s)"
|
5782 |
msgstr ""
|
5783 |
|
5784 |
-
#: pro/pro-class-email-subscribers.php:
|
5785 |
#: pro/pro-class-sequences.php:588
|
5786 |
msgid "day(s)"
|
5787 |
msgstr ""
|
5788 |
|
5789 |
-
#: pro/pro-class-email-subscribers.php:
|
5790 |
#: pro/pro-class-sequences.php:589
|
5791 |
msgid "week(s)"
|
5792 |
msgstr ""
|
5793 |
|
5794 |
-
#: pro/pro-class-email-subscribers.php:
|
5795 |
msgid "Clean My List"
|
5796 |
msgstr ""
|
5797 |
|
5798 |
-
#: pro/pro-class-email-subscribers.php:
|
5799 |
msgid "List cleanup is in progress..."
|
5800 |
msgstr ""
|
5801 |
|
5802 |
-
#: pro/pro-class-email-subscribers.php:
|
5803 |
msgid "List cleanup completed successfully."
|
5804 |
msgstr ""
|
5805 |
|
5806 |
-
#: pro/pro-class-email-subscribers.php:
|
5807 |
msgid "Email status"
|
5808 |
msgstr ""
|
5809 |
|
5810 |
-
#: pro/pro-class-email-subscribers.php:
|
5811 |
msgid "Last opened at"
|
5812 |
msgstr ""
|
5813 |
|
5814 |
-
#: pro/pro-class-email-subscribers.php:
|
5815 |
msgid "Select page"
|
5816 |
msgstr ""
|
5817 |
|
5818 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
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:
|
5827 |
msgid "Enable?"
|
5828 |
msgstr ""
|
5829 |
|
5830 |
-
#: pro/pro-class-email-subscribers.php:
|
5831 |
msgid "When our automated weekly email should be sent out?"
|
5832 |
msgstr ""
|
5833 |
|
5834 |
-
#: pro/pro-class-email-subscribers.php:
|
5835 |
msgid "In which time we need to send our weekly summary?"
|
5836 |
msgstr ""
|
5837 |
|
5838 |
-
#: pro/pro-class-email-subscribers.php:
|
5839 |
msgid "Access Key ID"
|
5840 |
msgstr ""
|
5841 |
|
5842 |
-
#: pro/pro-class-email-subscribers.php:
|
5843 |
msgid "Secret Access Key"
|
5844 |
msgstr ""
|
5845 |
|
5846 |
-
#: pro/pro-class-email-subscribers.php:
|
5847 |
msgid "Closest Region"
|
5848 |
msgstr ""
|
5849 |
|
5850 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
5855 |
msgid "Private API Key"
|
5856 |
msgstr ""
|
5857 |
|
5858 |
-
#: pro/pro-class-email-subscribers.php:
|
5859 |
msgid "Domain Name"
|
5860 |
msgstr ""
|
5861 |
|
5862 |
-
#: pro/pro-class-email-subscribers.php:
|
5863 |
-
#: pro/pro-class-email-subscribers.php:
|
5864 |
msgid "United States"
|
5865 |
msgstr ""
|
5866 |
|
5867 |
-
#: pro/pro-class-email-subscribers.php:
|
5868 |
-
#: pro/pro-class-email-subscribers.php:
|
5869 |
msgid "Europe"
|
5870 |
msgstr ""
|
5871 |
|
5872 |
-
#: pro/pro-class-email-subscribers.php:
|
5873 |
-
#: pro/pro-class-email-subscribers.php:
|
5874 |
msgid "Region"
|
5875 |
msgstr ""
|
5876 |
|
5877 |
-
#: pro/pro-class-email-subscribers.php:
|
5878 |
msgid "mailgun.com"
|
5879 |
msgstr ""
|
5880 |
|
5881 |
-
#: pro/pro-class-email-subscribers.php:
|
5882 |
-
#: pro/pro-class-email-subscribers.php:
|
5883 |
msgid "API Key"
|
5884 |
msgstr ""
|
5885 |
|
5886 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
5891 |
msgid "API token"
|
5892 |
msgstr ""
|
5893 |
|
5894 |
-
#: pro/pro-class-email-subscribers.php:
|
5895 |
msgid "API key"
|
5896 |
msgstr ""
|
5897 |
|
5898 |
-
#: pro/pro-class-email-subscribers.php:
|
5899 |
msgid "Public key"
|
5900 |
msgstr ""
|
5901 |
|
5902 |
-
#: pro/pro-class-email-subscribers.php:
|
5903 |
msgid "Private key"
|
5904 |
msgstr ""
|
5905 |
|
5906 |
-
#: pro/pro-class-email-subscribers.php:
|
5907 |
msgid "You are not allowed to duplicate campaign."
|
5908 |
msgstr ""
|
5909 |
|
5910 |
-
#: pro/pro-class-email-subscribers.php:
|
5911 |
msgid "Campaign duplicated !"
|
5912 |
msgstr ""
|
5913 |
|
5914 |
-
#: pro/pro-class-email-subscribers.php:
|
5915 |
msgid "Import WordPress users with following roles"
|
5916 |
msgstr ""
|
5917 |
|
5918 |
-
#: pro/pro-class-email-subscribers.php:
|
5919 |
-
#: pro/pro-class-email-subscribers.php:
|
5920 |
msgid "Proceed "
|
5921 |
msgstr ""
|
5922 |
|
5923 |
-
#: pro/pro-class-email-subscribers.php:
|
5924 |
msgid "Import from WooCommerce orders"
|
5925 |
msgstr ""
|
5926 |
|
5927 |
-
#: pro/pro-class-email-subscribers.php:
|
5928 |
msgid "Select order statuses"
|
5929 |
msgstr ""
|
5930 |
|
5931 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
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:
|
5945 |
msgid "We can't find any matching orders in your store."
|
5946 |
msgstr ""
|
5947 |
|
5948 |
-
#: pro/pro-class-email-subscribers.php:
|
5949 |
msgid "Total Opened"
|
5950 |
msgstr ""
|
5951 |
|
5952 |
-
#: pro/pro-class-email-subscribers.php:
|
5953 |
msgid "How to configure Mailgun to send emails in the Email Subscribers plugin?"
|
5954 |
msgstr ""
|
5955 |
|
5956 |
-
#: pro/pro-class-email-subscribers.php:
|
5957 |
msgid "How to configure SendGrid to send emails in the Email Subscribers plugin?"
|
5958 |
msgstr ""
|
5959 |
|
5960 |
-
#: pro/pro-class-email-subscribers.php:
|
5961 |
msgid "How to configure Sparkpost to send emails in the Email Subscribers plugin?"
|
5962 |
msgstr ""
|
5963 |
|
5964 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
5969 |
msgid "How to configure Postmark to send emails in the Email Subscribers plugin?"
|
5970 |
msgstr ""
|
5971 |
|
5972 |
-
#: pro/pro-class-email-subscribers.php:
|
5973 |
msgid "How to configure Sendinblue to send emails in the Email Subscribers plugin?"
|
5974 |
msgstr ""
|
5975 |
|
5976 |
-
#: pro/pro-class-email-subscribers.php:
|
5977 |
msgid "How to configure Mailjet to send emails in the Email Subscribers plugin?"
|
5978 |
msgstr ""
|
5979 |
|
5980 |
-
#: pro/pro-class-email-subscribers.php:
|
5981 |
msgid "Confirmation emails queued successfully and will be sent shortly."
|
5982 |
msgstr ""
|
5983 |
|
5984 |
-
#: pro/pro-class-email-subscribers.php:
|
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:
|
5989 |
msgid "Failed to queue confirmation emails. Please try again later."
|
5990 |
msgstr ""
|
5991 |
|
5992 |
-
#: pro/pro-class-email-subscribers.php:
|
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 |
-
//
|
241 |
-
|
|
|
|
|
|
|
|
|
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.
|
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.
|
314 |
|
315 |
-
* New: New workflow trigger for
|
316 |
-
*
|
|
|
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]
|