Email Subscribers & Newsletters - Version 4.4.9

Version Description

Download this release

Release Info

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

Code changes from version 4.4.8 to 4.4.9

Files changed (29) hide show
  1. email-subscribers.php +2 -2
  2. lite/admin/dist/main.css +1 -1
  3. lite/admin/js/email-subscribers-admin.js +1 -1
  4. lite/includes/class-email-subscribers.php +4 -4
  5. lite/includes/class-es-common.php +113 -5
  6. lite/includes/class-es-install.php +45 -49
  7. lite/includes/classes/class-es-admin-settings.php +145 -0
  8. lite/includes/classes/class-es-campaigns-table.php +185 -172
  9. lite/includes/classes/class-es-contacts-table.php +3 -3
  10. lite/includes/classes/class-es-export-subscribers.php +1 -2
  11. lite/includes/classes/class-es-forms-table.php +21 -8
  12. lite/includes/classes/class-es-lists-table.php +3 -3
  13. lite/includes/classes/class-es-mailer.php +1 -3
  14. lite/includes/classes/class-es-newsletters.php +16 -23
  15. lite/includes/classes/class-es-post-notifications.php +3 -3
  16. lite/includes/es-core-functions.php +99 -2
  17. lite/includes/libraries/action-scheduler/action-scheduler.php +7 -7
  18. lite/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php +6 -7
  19. lite/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php +29 -0
  20. lite/includes/libraries/action-scheduler/classes/migration/Controller.php +1 -1
  21. lite/includes/libraries/action-scheduler/classes/migration/Scheduler.php +1 -1
  22. lite/includes/libraries/action-scheduler/functions.php +24 -0
  23. lite/includes/upgrade/es-update-functions.php +42 -38
  24. lite/public/class-email-subscribers-public.php +1 -1
  25. lite/public/images/default-play-button.png +0 -0
  26. lite/public/images/search-cliparts.html +12 -0
  27. lite/public/images/vimeo-play-button.png +0 -0
  28. lite/public/images/youtube-play-button.png +0 -0
  29. readme.txt +100 -72
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: 4.4.8
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
@@ -156,7 +156,7 @@ if ( $is_premium ) {
156
  /* ***************************** Initial Compatibility Work (End) ******************* */
157
 
158
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
159
- define( 'ES_PLUGIN_VERSION', '4.4.8' );
160
  }
161
 
162
  // 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: 4.4.9
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
156
  /* ***************************** Initial Compatibility Work (End) ******************* */
157
 
158
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
159
+ define( 'ES_PLUGIN_VERSION', '4.4.9' );
160
  }
161
 
162
  // Plugin Folder Path.
lite/admin/dist/main.css CHANGED
@@ -1 +1 @@
1
- /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{font-size:.875rem;border-radius:.375rem;border-width:1px;--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));line-height:1.25rem;font-weight:500}.wp-heading-inline+.page-title-action{--text-opacity:1;color:#1c64f2;color:rgba(28,100,242,var(--text-opacity));padding:.5rem;margin-left:.5rem;margin-right:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.ig-es-primary-button:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.ig-es-primary-button:focus,.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;background-color:#0e9f6e!important;background-color:rgba(14,159,110,var(--bg-opacity))!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button,.ig-es-imp-button:hover{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;--bg-opacity:1!important}.ig-es-imp-button:hover{background-color:#31c48d!important;background-color:rgba(49,196,141,var(--bg-opacity))!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;background-color:#ff5a1f;background-color:rgba(255,90,31,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button,.ig-es-link-button:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1}.ig-es-link-button:hover{background-color:#ff8a4c;background-color:rgba(255,138,76,var(--bg-opacity))}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}.form-select{font-size:.875rem!important;--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;--border-opacity:1!important;border-color:#a4cafe!important;border-color:rgba(164,202,254,var(--border-opacity))!important}.es-check-toggle:checked~.es-mail-toggle-line{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 3px #5a67d8;box-shadow:0 0 3px 3px #5a67d8}.wp-core-ui .button,.wp-core-ui .button-secondary{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500;--text-opacity:1}.wp-core-ui .button-primary{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#def7ec;background-color:rgba(222,247,236,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-teal-50{--bg-opacity:1;background-color:#edfafa;background-color:rgba(237,250,250,var(--bg-opacity))}.bg-teal-100{--bg-opacity:1;background-color:#d5f5f6;background-color:rgba(213,245,246,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#42389d;background-color:rgba(66,56,157,var(--bg-opacity))}.hover\:bg-gray-50:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.focus\:bg-gray-50:focus{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{--border-opacity:1;border-color:#f4f5f7;border-color:rgba(244,245,247,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#9fa6b2;border-color:rgba(159,166,178,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#f98080;border-color:rgba(249,128,128,var(--border-opacity))}.hover\:border-indigo-500:hover{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-auto{cursor:auto}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.table{display:table}.table-cell{display:table-cell}.grid{display:grid}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-4xl{font-size:2.25rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mt-3\.5{margin-top:.875rem}.-mr-1{margin-right:-.25rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.opacity-0{opacity:0}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pl-16{padding-left:4rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.text-left{text-align:left}.text-center{text-align:center}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#9fa6b2;color:rgba(159,166,178,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#ff8a4c;color:rgba(255,138,76,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ff5a1f;color:rgba(255,90,31,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#e3a008;color:rgba(227,160,8,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#057a55;color:rgba(5,122,85,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#03543f;color:rgba(3,84,63,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#16bdca;color:rgba(22,189,202,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#0694a2;color:rgba(6,148,162,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#036672;color:rgba(3,102,114,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#76a9fa;color:rgba(118,169,250,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#3f83f8;color:rgba(63,131,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#1e429f;color:rgba(30,66,159,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#e5edff;color:rgba(229,237,255,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#8da2fb;color:rgba(141,162,251,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.active\:text-indigo-600:active{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.align-middle{vertical-align:middle}.whitespace-no-wrap{white-space:nowrap}.w-0{width:0}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-40{width:10rem}.w-56{width:14rem}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-50{z-index:50}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@media (min-width:640px){.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:border-r{border-right-width:1px}.sm\:border-l{border-left-width:1px}.sm\:grid{display:grid}.sm\:justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-32{width:8rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:text-base{font-size:1rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:grid{display:grid}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-7{padding-left:1.75rem;padding-right:1.75rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:w-40{width:10rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}}
1
+ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{color:#5850ec}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#5850ec;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{font-size:.875rem;border-radius:.375rem;border-width:1px;border-color:#5850ec;line-height:1.25rem;font-weight:500}.wp-heading-inline+.page-title-action{color:#1c64f2;padding:.5rem;margin-left:.5rem;margin-right:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{color:#6875f5}.ig-es-primary-button:hover{background-color:#6875f5;color:#fff}.ig-es-primary-button:focus,.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;color:#fff!important;background-color:#0e9f6e!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button:hover{background-color:#31c48d!important;color:#fff!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#ff5a1f;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button:hover{background-color:#ff8a4c;color:#fff}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{background-color:#5850ec;color:#fff}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{color:#5850ec!important}.form-select{font-size:.875rem!important;border-color:#9fa6b2!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;border-color:#a4cafe!important}.es-check-toggle:checked~.es-mail-toggle-line{background-color:#5850ec}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 3px #5a67d8;box-shadow:0 0 3px 3px #5a67d8}.wp-core-ui .button,.wp-core-ui .button-secondary{border-color:#5850ec;color:#5850ec}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500}.wp-core-ui .button-primary{background-color:#5850ec;color:#fff;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{border-color:#5850ec;color:#6875f5}.bg-white{background-color:#fff}.bg-gray-100{background-color:#f4f5f7}.bg-gray-200{background-color:#e5e7eb}.bg-gray-300{background-color:#d2d6dc}.bg-green-100{background-color:#def7ec}.bg-green-600{background-color:#057a55}.bg-teal-50{background-color:#edfafa}.bg-teal-100{background-color:#d5f5f6}.bg-blue-50{background-color:#ebf5ff}.bg-indigo-500{background-color:#6875f5}.bg-indigo-600{background-color:#5850ec}.bg-indigo-800{background-color:#42389d}.hover\:bg-gray-50:hover{background-color:#f9fafb}.hover\:bg-gray-100:hover{background-color:#f4f5f7}.hover\:bg-green-500:hover{background-color:#0e9f6e}.hover\:bg-indigo-500:hover{background-color:#6875f5}.focus\:bg-gray-50:focus{background-color:#f9fafb}.focus\:bg-gray-100:focus{background-color:#f4f5f7}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{border-color:#f4f5f7}.border-gray-200{border-color:#e5e7eb}.border-gray-300{border-color:#d2d6dc}.border-gray-400{border-color:#9fa6b2}.border-indigo-500{border-color:#6875f5}.border-indigo-600{border-color:#5850ec}.hover\:border-gray-200:hover{border-color:#e5e7eb}.hover\:border-gray-500:hover{border-color:#6b7280}.hover\:border-red-400:hover{border-color:#f98080}.hover\:border-indigo-500:hover{border-color:#6875f5}.hover\:border-indigo-600:hover{border-color:#5850ec}.focus\:border-blue-300:focus{border-color:#a4cafe}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-auto{cursor:auto}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.grid{display:grid}.table{display:table}.table-cell{display:table-cell}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-full{height:100%}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mr-1\.5{margin-right:.375rem}.mt-3\.5{margin-top:.875rem}.-mr-1{margin-right:-.25rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.opacity-0{opacity:0}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pl-16{padding-left:4rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.text-left{text-align:left}.text-center{text-align:center}.text-white{color:#fff}.text-black{color:#000}.text-gray-400{color:#9fa6b2}.text-gray-500{color:#6b7280}.text-gray-600{color:#4b5563}.text-gray-700{color:#374151}.text-gray-800{color:#252f3f}.text-gray-900{color:#161e2e}.text-red-600{color:#e02424}.text-orange-400{color:#ff8a4c}.text-orange-500{color:#ff5a1f}.text-yellow-400{color:#e3a008}.text-green-400{color:#31c48d}.text-green-600{color:#057a55}.text-green-800{color:#03543f}.text-teal-400{color:#16bdca}.text-teal-500{color:#0694a2}.text-teal-700{color:#036672}.text-blue-400{color:#76a9fa}.text-blue-500{color:#3f83f8}.text-blue-700{color:#1a56db}.text-blue-800{color:#1e429f}.text-indigo-100{color:#e5edff}.text-indigo-400{color:#8da2fb}.text-indigo-500{color:#6875f5}.text-indigo-600{color:#5850ec}.hover\:text-white:hover{color:#fff}.hover\:text-gray-800:hover{color:#252f3f}.hover\:text-gray-900:hover{color:#161e2e}.hover\:text-blue-700:hover{color:#1a56db}.hover\:text-indigo-500:hover{color:#6875f5}.focus\:text-white:focus{color:#fff}.focus\:text-gray-900:focus{color:#161e2e}.active\:text-indigo-600:active{color:#5850ec}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-4xl{font-size:2.25rem}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.align-middle{vertical-align:middle}.whitespace-no-wrap{white-space:nowrap}.w-0{width:0}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-40{width:10rem}.w-56{width:14rem}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-50{z-index:50}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@media (min-width:640px){.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:border-r{border-right-width:1px}.sm\:border-l{border-left-width:1px}.sm\:grid{display:grid}.sm\:justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-32{width:8rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:text-base{font-size:1rem}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:grid{display:grid}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:w-40{width:10rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}}
lite/admin/js/email-subscribers-admin.js CHANGED
@@ -288,7 +288,7 @@
288
  if (response.hasOwnProperty('total')) {
289
  var total = response.total;
290
  var total_contacts_text = "<h2 class='text-sm font-normal text-gray-600'>Total Contacts: <span class='text-base font-medium text-gray-700'> " + total + "</span></h2>";
291
- var total_recipients_text = "<span class='font-medium text-base text-gray-700'>" + total + " <span class='text-base font-medium text-gray-700'></span><span class='font-normal text-sm text-gray-500'> recipients </span>";
292
  $('#ig_es_total_contacts').html(total_contacts_text);
293
  $('#ig_es_total_recipients').html(total_recipients_text);
294
  if (total == 0) {
288
  if (response.hasOwnProperty('total')) {
289
  var total = response.total;
290
  var total_contacts_text = "<h2 class='text-sm font-normal text-gray-600'>Total Contacts: <span class='text-base font-medium text-gray-700'> " + total + "</span></h2>";
291
+ var total_recipients_text = "<div class='mt-1.5 py-2'><span class='font-medium text-base text-gray-700'>" + total + " <span class='text-base font-medium text-gray-700'></span><span class='font-normal text-sm text-gray-500'> recipients </span></div>";
292
  $('#ig_es_total_contacts').html(total_contacts_text);
293
  $('#ig_es_total_recipients').html(total_recipients_text);
294
  if (total == 0) {
lite/includes/class-email-subscribers.php CHANGED
@@ -304,10 +304,10 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
304
  $show_notice = apply_filters( 'ig_es_show_wp_cron_notice', $show_notice );
305
 
306
  if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON && $notice_option != 'yes' && $show_notice ) {
307
- $es_cron_url = 'https://www.icegram.com/documentation/how-to-enable-the-wordpress-cron/?utm_source=es&utm_medium=in_app&utm_campaign=view_admin_notice';
308
- $cpanel_url = 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=es&utm_medium=in_app&utm_campaign=view_admin_notice';
309
- $es_pro_url = 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=es&utm_medium=in_app&utm_campaign=view_admin_notice';
310
- $disable_wp_cron_notice = sprintf( __( 'WordPress Cron is disable on your site. Email notifications from Email Subscribers plugin will not be sent automatically. <a href="%s" target="_blank" >Here\'s how you can enable it.</a>', 'email-subscribers' ), $es_cron_url );
311
  $disable_wp_cron_notice .= '<br/>' . sprintf( __( 'Or schedule Cron in <a href="%s" target="_blank">cPanel</a>', 'email-subscribers' ), $cpanel_url );
312
  $disable_wp_cron_notice .= '<br/>' . sprintf( __( 'Or use <strong><a href="%s" target="_blank">Email Subscribers Pro</a></strong> for automatic Cron support', 'email-subscribers' ), $es_pro_url );
313
  $html = '<div class="notice notice-warning" style="background-color: #FFF;"><p style="letter-spacing: 0.6px;">' . $disable_wp_cron_notice . '<a style="float:right" class="es-admin-btn es-admin-btn-secondary " href="' . admin_url() . '?es_dismiss_admin_notice=1&option_name=wp_cron_notice">' . __( 'OK, I Got it!',
304
  $show_notice = apply_filters( 'ig_es_show_wp_cron_notice', $show_notice );
305
 
306
  if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON && $notice_option != 'yes' && $show_notice ) {
307
+ $es_cron_url = 'https://www.icegram.com/documentation/how-to-enable-the-wordpress-cron/?utm_medium=enable_wordpress_cron&utm_source=in_app&utm_campaign=view_admin_notice';
308
+ $cpanel_url = 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=schedule_cron_in_cpanel&utm_medium=in_app&utm_campaign=view_admin_notice';
309
+ $es_pro_url = 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=schedule_cron_in_cpanel&utm_medium=in_app&utm_campaign=view_admin_notice';
310
+ $disable_wp_cron_notice = sprintf( __( 'WordPress Cron is disabled on your site. Email notifications from Email Subscribers plugin will not be sent automatically. <a href="%s" target="_blank" >Here\'s how you can enable it.</a>', 'email-subscribers' ), $es_cron_url );
311
  $disable_wp_cron_notice .= '<br/>' . sprintf( __( 'Or schedule Cron in <a href="%s" target="_blank">cPanel</a>', 'email-subscribers' ), $cpanel_url );
312
  $disable_wp_cron_notice .= '<br/>' . sprintf( __( 'Or use <strong><a href="%s" target="_blank">Email Subscribers Pro</a></strong> for automatic Cron support', 'email-subscribers' ), $es_pro_url );
313
  $html = '<div class="notice notice-warning" style="background-color: #FFF;"><p style="letter-spacing: 0.6px;">' . $disable_wp_cron_notice . '<a style="float:right" class="es-admin-btn es-admin-btn-secondary " href="' . admin_url() . '?es_dismiss_admin_notice=1&option_name=wp_cron_notice">' . __( 'OK, I Got it!',
lite/includes/class-es-common.php CHANGED
@@ -43,9 +43,7 @@ class ES_Common {
43
  public static function es_process_template_body( $content, $tmpl_id = 0, $campaign_id = 0 ) {
44
  $content = convert_smilies( wptexturize( $content ) );
45
 
46
- if ( isset( $GLOBALS['wp_embed'] ) ) {
47
- $content = $GLOBALS['wp_embed']->autoembed( $content );
48
- }
49
 
50
  $content = wpautop( $content );
51
  $content = do_shortcode( shortcode_unautop( $content ) );
@@ -75,6 +73,107 @@ class ES_Common {
75
  return $content;
76
  }
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  /**
79
  * Get Statuses key name map
80
  *
@@ -1489,6 +1588,16 @@ class ES_Common {
1489
  * @since 4.4.8
1490
  */
1491
  public static function can_show_coupon( $coupon = 'PREMIUM10' ) {
 
 
 
 
 
 
 
 
 
 
1492
  $coupons = get_option( 'ig_es_coupons', array() );
1493
 
1494
  $can_show = true;
@@ -1511,8 +1620,8 @@ class ES_Common {
1511
  if ( $can_show ) {
1512
  self::update_coupon_data( $coupon );
1513
  }
1514
-
1515
  return $can_show;
 
1516
  }
1517
 
1518
  /**
@@ -1533,5 +1642,4 @@ class ES_Common {
1533
  update_option( 'ig_es_coupons', $coupons );
1534
  }
1535
 
1536
-
1537
  }
43
  public static function es_process_template_body( $content, $tmpl_id = 0, $campaign_id = 0 ) {
44
  $content = convert_smilies( wptexturize( $content ) );
45
 
46
+ $content = self::handle_oembed_content( $content );
 
 
47
 
48
  $content = wpautop( $content );
49
  $content = do_shortcode( shortcode_unautop( $content ) );
73
  return $content;
74
  }
75
 
76
+ /**
77
+ * Method to handle oembed content
78
+ *
79
+ * @param string @content Content.
80
+ *
81
+ * @return string $content
82
+ *
83
+ * @since 4.4.9
84
+ */
85
+ public static function handle_oembed_content( $content = '' ) {
86
+
87
+ if ( ! empty( $content ) && isset( $GLOBALS['wp_embed'] ) ) {
88
+ add_filter( 'embed_oembed_html', array( 'ES_Common', 'handle_link_in_email_content' ), 10, 4 );
89
+ $content = $GLOBALS['wp_embed']->autoembed( $content );
90
+ remove_filter( 'embed_oembed_html', array( 'ES_Common', 'handle_link_in_email_content' ), 10, 4 );
91
+ }
92
+
93
+ return $content;
94
+ }
95
+
96
+
97
+ /**
98
+ * Method to handle link in email content
99
+ *
100
+ * URL from {{POSTLINK-ONLY}} was being converted to oembed html if it is not wrapped inside <a> tag's href attribute and is on a seperate line in ES template content
101
+ * resulting in a link html for {{POSTLINK-ONLY}} instead of plain text link.
102
+ *
103
+ * Most email clients like GMail, Outlook do not support videos in the email. To handle it, we are replacing the WordPress's oembed generated HTML for video links to their respective thubmnail images which are then linked the original video URL.
104
+ *
105
+ * @param string $html HTML for current URL.
106
+ * @param string $url Current URL.
107
+ * @param array $attr Shortcode attribute.
108
+ * @param int $post_ID Current post id.
109
+ *
110
+ * @return string $html HTML for current URL.
111
+ *
112
+ * @since 4.4.9
113
+ */
114
+ public static function handle_link_in_email_content( $html, $url, $attr, $post_ID ) {
115
+
116
+ $post_link = get_permalink( $post_ID );
117
+ // Check if current URL is same as current post's permalink.
118
+ if( ! empty( $post_link ) && $url === $post_link ) {
119
+ // Convert URL HTML back to URL itself if it a current post URL.
120
+ $html = $url;
121
+ } else {
122
+ if( ! class_exists( 'WP_oEmbed' ) ) {
123
+ require_once( ABSPATH . 'wp-includes/class-wp-oembed.php' );
124
+ }
125
+
126
+ $oembed = new WP_oEmbed();
127
+ $provider = $oembed->discover( $url );
128
+
129
+ if( ! empty( $provider ) ) {
130
+ $oembed_response = $oembed->fetch( $provider, $url, $attr );
131
+ if( is_object( $oembed_response ) && ! empty( $oembed_response->type ) && 'video' === $oembed_response->type ) {
132
+ $thumbnail_url = $oembed_response->thumbnail_url;
133
+ if( ! empty( $thumbnail_url ) ) {
134
+ $title = $oembed_response->title;
135
+ $provider_name = $oembed_response->provider_name;
136
+ $play_icon_url = '';
137
+
138
+ switch( $provider_name ) {
139
+ case 'YouTube':
140
+ $play_icon_url = ES_PLUGIN_URL . 'lite/public/images/youtube-play-button.png';
141
+ break;
142
+
143
+ case 'Vimeo':
144
+ $play_icon_url = ES_PLUGIN_URL . 'lite/public/images/vimeo-play-button.png';
145
+ break;
146
+
147
+ default:
148
+ $play_icon_url = ES_PLUGIN_URL . 'lite/public/images/default-play-button.png';
149
+ break;
150
+ }
151
+
152
+ ob_start();
153
+ $thumbnail_width = ! empty( $oembed_response->width ) ? $oembed_response->width . 'px' : 'auto';
154
+ $thumbnail_height = ! empty( $oembed_response->height ) ? $oembed_response->height . 'px' : 'auto';
155
+ ?>
156
+ <table style="margin-bottom: 1em;">
157
+ <tbody>
158
+ <tr>
159
+ <td style="background-image: url('<?php echo esc_url( $thumbnail_url ); ?>');height:<?php echo esc_attr( $thumbnail_height ); ?>;width:<?php echo esc_attr( $thumbnail_width ); ?>;background-size: 100% 100%;background-repeat: no-repeat;text-align:center;">
160
+ <a href="<?php echo esc_url( $url ); ?>" title="<?php echo esc_attr( $title ); ?>" target="_blank">
161
+ <img src="<?php echo esc_url( $play_icon_url ); ?>" style="height: 75px; margin: auto;">
162
+ </a>
163
+ </td>
164
+ </tr>
165
+ </tbody>
166
+ </table>
167
+ <?php
168
+ $html = ob_get_clean();
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ return $html;
175
+ }
176
+
177
  /**
178
  * Get Statuses key name map
179
  *
1588
  * @since 4.4.8
1589
  */
1590
  public static function can_show_coupon( $coupon = 'PREMIUM10' ) {
1591
+
1592
+ $can_show = true;
1593
+
1594
+ if ( $can_show ) {
1595
+ self::update_coupon_data( $coupon );
1596
+ }
1597
+
1598
+ return $can_show;
1599
+
1600
+ /*
1601
  $coupons = get_option( 'ig_es_coupons', array() );
1602
 
1603
  $can_show = true;
1620
  if ( $can_show ) {
1621
  self::update_coupon_data( $coupon );
1622
  }
 
1623
  return $can_show;
1624
+ */
1625
  }
1626
 
1627
  /**
1642
  update_option( 'ig_es_coupons', $coupons );
1643
  }
1644
 
 
1645
  }
lite/includes/class-es-install.php CHANGED
@@ -202,6 +202,11 @@ if ( ! class_exists( 'ES_Install' ) ) {
202
  '4.4.2' => array(
203
  'ig_es_update_442_set_workflows_default_permission',
204
  'ig_es_update_442_db_version'
 
 
 
 
 
205
  )
206
 
207
  );
@@ -720,7 +725,6 @@ if ( ! class_exists( 'ES_Install' ) ) {
720
  $report .= "Thank You.";
721
 
722
 
723
-
724
  $new_contact_email_subject = "One more contact joins our tribe!";
725
  $new_contact_email_content = "Hi,\r\n\r\nYour friendly Email Subscribers notification bot here!\r\n\r\n{{NAME}} ({{EMAIL}}) joined our tribe just now.\r\n\r\nWhich list/s? {{LIST}}\r\n\r\nIf you know this person, or if they are an influencer, you may want to reach out to them personally!\r\n\r\nLater...";
726
 
@@ -793,19 +797,13 @@ if ( ! class_exists( 'ES_Install' ) ) {
793
  }
794
 
795
  /**
796
- * Create Tables
797
  *
798
  * @since 4.0.0
 
 
799
  */
800
- private static function create_tables() {
801
- global $wpdb;
802
-
803
- $wpdb->hide_errors();
804
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
805
- dbDelta( self::get_schema() );
806
- }
807
-
808
- public static function get_ig_es_400_schema() {
809
 
810
  global $wpdb;
811
 
@@ -815,6 +813,22 @@ if ( ! class_exists( 'ES_Install' ) ) {
815
  $collate = $wpdb->get_charset_collate();
816
  }
817
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
818
  $tables = "
819
  CREATE TABLE `{$wpdb->prefix}ig_campaigns` (
820
  `id` int(10) NOT NULL AUTO_INCREMENT,
@@ -960,22 +974,15 @@ if ( ! class_exists( 'ES_Install' ) ) {
960
  }
961
 
962
  /**
963
- * Add new tables
964
  *
965
  * @return string
966
  *
967
  * @since 4.2.0
968
  */
969
- public static function get_ig_es_420_schema() {
970
-
971
  global $wpdb;
972
 
973
- $collate = '';
974
-
975
- if ( $wpdb->has_cap( 'collation' ) ) {
976
- $collate = $wpdb->get_charset_collate();
977
- }
978
-
979
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_contact_meta` (
980
  `id` int(10) NOT NULL AUTO_INCREMENT,
981
  `contact_id` bigint(10) unsigned NOT NULL,
@@ -993,20 +1000,16 @@ if ( ! class_exists( 'ES_Install' ) ) {
993
  /**
994
  * Add new table
995
  *
 
 
996
  * @return string
997
  *
998
  * @since 4.2.1
999
  */
1000
- public static function get_ig_es_421_schema() {
1001
 
1002
  global $wpdb;
1003
 
1004
- $collate = '';
1005
-
1006
- if ( $wpdb->has_cap( 'collation' ) ) {
1007
- $collate = $wpdb->get_charset_collate();
1008
- }
1009
-
1010
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_contactmeta` (
1011
  `meta_id` bigint(20) NOT NULL AUTO_INCREMENT,
1012
  `contact_id` bigint(20) unsigned NOT NULL,
@@ -1065,20 +1068,16 @@ if ( ! class_exists( 'ES_Install' ) ) {
1065
  /**
1066
  * Create Links Table
1067
  *
 
 
1068
  * @return string
1069
  *
1070
  * @sinc 4.2.4
1071
  */
1072
- public static function get_ig_es_424_schema() {
1073
 
1074
  global $wpdb;
1075
 
1076
- $collate = '';
1077
-
1078
- if ( $wpdb->has_cap( 'collation' ) ) {
1079
- $collate = $wpdb->get_charset_collate();
1080
- }
1081
-
1082
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_links` (
1083
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
1084
  `message_id` int(10) unsigned NOT NULL,
@@ -1100,20 +1099,15 @@ if ( ! class_exists( 'ES_Install' ) ) {
1100
  /**
1101
  * Create Links Table
1102
  *
 
 
1103
  * @return string
1104
  *
1105
  * @sinc 4.4.1
1106
  */
1107
- public static function get_ig_es_441_schema() {
1108
-
1109
  global $wpdb;
1110
 
1111
- $collate = '';
1112
-
1113
- if ( $wpdb->has_cap( 'collation' ) ) {
1114
- $collate = $wpdb->get_charset_collate();
1115
- }
1116
-
1117
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_workflows` (
1118
  `id` int(10) NOT NULL AUTO_INCREMENT,
1119
  `name` varchar(255) DEFAULT NULL,
@@ -1147,19 +1141,21 @@ if ( ! class_exists( 'ES_Install' ) ) {
1147
  }
1148
 
1149
  /**
1150
- * Collect multiple version table schema
 
 
1151
  *
1152
  * @return string
1153
  *
1154
  * @since 4.2.0
1155
  */
1156
- private static function get_schema() {
1157
 
1158
- $tables = self::get_ig_es_400_schema();
1159
- $tables .= self::get_ig_es_420_schema();
1160
- $tables .= self::get_ig_es_421_schema();
1161
- $tables .= self::get_ig_es_424_schema();
1162
- $tables .= self::get_ig_es_441_schema();
1163
 
1164
  return $tables;
1165
  }
202
  '4.4.2' => array(
203
  'ig_es_update_442_set_workflows_default_permission',
204
  'ig_es_update_442_db_version'
205
+ ),
206
+
207
+ '4.4.9' => array(
208
+ 'ig_es_update_449_create_tables',
209
+ 'ig_es_update_449_db_version'
210
  )
211
 
212
  );
725
  $report .= "Thank You.";
726
 
727
 
 
728
  $new_contact_email_subject = "One more contact joins our tribe!";
729
  $new_contact_email_content = "Hi,\r\n\r\nYour friendly Email Subscribers notification bot here!\r\n\r\n{{NAME}} ({{EMAIL}}) joined our tribe just now.\r\n\r\nWhich list/s? {{LIST}}\r\n\r\nIf you know this person, or if they are an influencer, you may want to reach out to them personally!\r\n\r\nLater...";
730
 
797
  }
798
 
799
  /**
800
+ * @param null $version
801
  *
802
  * @since 4.0.0
803
+ *
804
+ * @modify 4.4.9
805
  */
806
+ public static function create_tables( $version = null ) {
 
 
 
 
 
 
 
 
807
 
808
  global $wpdb;
809
 
813
  $collate = $wpdb->get_charset_collate();
814
  }
815
 
816
+ if ( is_null( $version ) ) {
817
+ $schema_fn = 'get_schema';
818
+ } else {
819
+ $v = str_replace( '.', '', $version );
820
+ $schema_fn = 'get_' . $v . '_schema';
821
+ }
822
+
823
+ $wpdb->hide_errors();
824
+ require_once ABSPATH . 'wp-admin/includes/upgrade.php';
825
+ dbDelta( self::$schema_fn( $collate ) );
826
+ }
827
+
828
+ public static function get_ig_es_400_schema( $collate = '' ) {
829
+
830
+ global $wpdb;
831
+
832
  $tables = "
833
  CREATE TABLE `{$wpdb->prefix}ig_campaigns` (
834
  `id` int(10) NOT NULL AUTO_INCREMENT,
974
  }
975
 
976
  /**
977
+ * @param string $collate
978
  *
979
  * @return string
980
  *
981
  * @since 4.2.0
982
  */
983
+ public static function get_ig_es_420_schema( $collate = '' ) {
 
984
  global $wpdb;
985
 
 
 
 
 
 
 
986
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_contact_meta` (
987
  `id` int(10) NOT NULL AUTO_INCREMENT,
988
  `contact_id` bigint(10) unsigned NOT NULL,
1000
  /**
1001
  * Add new table
1002
  *
1003
+ * @param string $collate
1004
+ *
1005
  * @return string
1006
  *
1007
  * @since 4.2.1
1008
  */
1009
+ public static function get_ig_es_421_schema( $collate = '' ) {
1010
 
1011
  global $wpdb;
1012
 
 
 
 
 
 
 
1013
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_contactmeta` (
1014
  `meta_id` bigint(20) NOT NULL AUTO_INCREMENT,
1015
  `contact_id` bigint(20) unsigned NOT NULL,
1068
  /**
1069
  * Create Links Table
1070
  *
1071
+ * @param string $collate
1072
+ *
1073
  * @return string
1074
  *
1075
  * @sinc 4.2.4
1076
  */
1077
+ public static function get_ig_es_424_schema( $collate = '') {
1078
 
1079
  global $wpdb;
1080
 
 
 
 
 
 
 
1081
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_links` (
1082
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
1083
  `message_id` int(10) unsigned NOT NULL,
1099
  /**
1100
  * Create Links Table
1101
  *
1102
+ * @param string $collate
1103
+ *
1104
  * @return string
1105
  *
1106
  * @sinc 4.4.1
1107
  */
1108
+ public static function get_ig_es_441_schema( $collate = '') {
 
1109
  global $wpdb;
1110
 
 
 
 
 
 
 
1111
  $tables = "CREATE TABLE `{$wpdb->prefix}ig_workflows` (
1112
  `id` int(10) NOT NULL AUTO_INCREMENT,
1113
  `name` varchar(255) DEFAULT NULL,
1141
  }
1142
 
1143
  /**
1144
+ * Collect multiple version schema
1145
+ *
1146
+ * @param string $collate
1147
  *
1148
  * @return string
1149
  *
1150
  * @since 4.2.0
1151
  */
1152
+ private static function get_schema( $collate = '' ) {
1153
 
1154
+ $tables = self::get_ig_es_400_schema( $collate );
1155
+ $tables .= self::get_ig_es_420_schema( $collate );
1156
+ $tables .= self::get_ig_es_421_schema( $collate );
1157
+ $tables .= self::get_ig_es_424_schema( $collate );
1158
+ $tables .= self::get_ig_es_441_schema( $collate );
1159
 
1160
  return $tables;
1161
  }
lite/includes/classes/class-es-admin-settings.php CHANGED
@@ -21,6 +21,7 @@ class ES_Admin_Settings {
21
  public $subscribers_obj;
22
 
23
  public function __construct() {
 
24
  }
25
 
26
  public function es_settings_callback() {
@@ -881,4 +882,148 @@ public function field_callback( $arguments, $id_key = '' ) {
881
  return $html;
882
  }
883
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
884
  }
21
  public $subscribers_obj;
22
 
23
  public function __construct() {
24
+ add_filter( 'ig_es_registered_email_sending_settings', array( $this, 'show_cron_info' ) );
25
  }
26
 
27
  public function es_settings_callback() {
882
  return $html;
883
  }
884
 
885
+ /**
886
+ * Register ES cron info
887
+ *
888
+ * @return array $email_sending_settings ES send email settings.
889
+ *
890
+ * @since 4.4.9
891
+ */
892
+ public function show_cron_info( $email_sending_settings ) {
893
+ $es_cron_enabled = ES()->cron->is_wp_cron_enable();
894
+ if( $es_cron_enabled ) {
895
+ $es_cron_info = array(
896
+ 'ig_es_cron_info' => array(
897
+ 'id' => 'ig_es_cron_info',
898
+ 'name' => __( 'Cron Info', 'email-subscribers' ),
899
+ 'type' => 'html',
900
+ 'html' => self::render_cron_info_html(),
901
+ ),
902
+ );
903
+ $email_sending_settings = ig_es_array_insert_after( $email_sending_settings, 'ig_es_cronurl', $es_cron_info );
904
+ }
905
+
906
+ return $email_sending_settings;
907
+ }
908
+
909
+ /**
910
+ * Render ES cron info html
911
+ *
912
+ * @return false|string
913
+ *
914
+ * @since 4.4.9
915
+ */
916
+ public static function render_cron_info_html() {
917
+ $site_crons = get_option( 'cron' );
918
+
919
+ if( empty( $site_crons ) ) {
920
+ return;
921
+ }
922
+
923
+ $es_cron_enabled = ES()->cron->is_wp_cron_enable();
924
+
925
+ $es_crons_data = array();
926
+ $es_cron_events = array(
927
+ 'ig_es_cron',
928
+ 'ig_es_cron_worker',
929
+ 'ig_es_cron_auto_responder',
930
+ );
931
+
932
+ $cron_schedules = wp_get_schedules();
933
+ $time_offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
934
+ $date_format = get_option( 'date_format' );
935
+ $time_format = get_option( 'time_format' );
936
+
937
+ foreach ( $site_crons as $next_scheduled_time => $scheduled_crons ) {
938
+ if( ! empty( $scheduled_crons ) && is_array( $scheduled_crons ) ) {
939
+ foreach( $scheduled_crons as $cron_event => $cron_data ) {
940
+ if( ! in_array( $cron_event, $es_cron_events, true ) ) {
941
+ continue;
942
+ }
943
+ foreach( $cron_data as $cron_info ) {
944
+ if( ! empty( $cron_info['schedule'] ) ) {
945
+ $cron_schedule = $cron_info['schedule'];
946
+ $cron_interval = ! empty( $cron_schedules[ $cron_schedule ]['interval'] ) ? $cron_schedules[ $cron_schedule ]['interval'] : 0;
947
+ $es_crons_data[$cron_event] = array(
948
+ 'cron_interval' => $cron_interval,
949
+ 'next_scheduled_time' => $next_scheduled_time,
950
+ );
951
+ }
952
+ }
953
+ }
954
+ }
955
+ }
956
+
957
+ $html = '';
958
+ if( ! empty( $es_crons_data ) ) {
959
+ ob_start();
960
+ ?>
961
+ <table class="min-w-full rounded-lg">
962
+ <thead>
963
+ <tr class="bg-blue-50 text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider">
964
+ <th class="px-5 py-4"><?php echo esc_html__( 'Event', 'email-subscribers' ); ?></th>
965
+ <th class="px-2 py-4 text-center"><?php echo esc_html__( 'Interval', 'email-subscribers' ); ?></th>
966
+ <th class="px-2 py-4 text-center"><?php echo esc_html__( 'Next Execution', 'email-subscribers' ); ?></th>
967
+ </tr>
968
+ </thead>
969
+ <tbody class="bg-blue-50">
970
+ <?php
971
+ foreach( $es_cron_events as $cron_event ) {
972
+ $cron_interval = '';
973
+ $next_scheduled_time = '';
974
+ if( ! empty( $es_crons_data[ $cron_event ] ) ) {
975
+ $es_cron_data = $es_crons_data[ $cron_event ];
976
+ $cron_interval = $es_cron_data['cron_interval'];
977
+ $next_scheduled_time = $es_cron_data['next_scheduled_time'];
978
+ } else {
979
+ if( 'ig_es_cron_auto_responder' === $cron_event ) {
980
+ wp_schedule_event( floor( time() / 300 ) * 300 - 120, 'ig_es_cron_interval', 'ig_es_cron_auto_responder' );
981
+ } else if( 'ig_es_cron_worker' === $cron_event ) {
982
+ wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_cron_interval', 'ig_es_cron_worker' );
983
+ } else if( 'ig_es_cron' === $cron_event ) {
984
+ wp_schedule_event( strtotime( 'midnight' ) - 300, 'hourly', 'ig_es_cron' );
985
+ }
986
+ $next_scheduled_time = wp_next_scheduled( $cron_event );
987
+ if( 'ig_es_cron' === $cron_event ) {
988
+ $cron_interval = 3600; // Hourly interval for ig_es_cron.
989
+ } else {
990
+ $cron_interval = ES()->cron->get_cron_interval();
991
+ }
992
+ }
993
+ if( empty( $cron_interval ) || empty( $next_scheduled_time ) ) {
994
+ continue;
995
+ }
996
+ ?>
997
+ <tr class="border-b border-gray-200">
998
+ <td class="pl-8 py-4 ">
999
+ <div class="flex items-center">
1000
+ <div class="flex-shrink-0">
1001
+ <span class="text-sm leading-5 font-medium text-center text-gray-800"><?php echo $cron_event; ?></span>
1002
+ </div>
1003
+ </div>
1004
+ </td>
1005
+ <td class="whitespace-no-wrap text-center">
1006
+ <?php
1007
+ echo ig_es_get_human_interval( $cron_interval );
1008
+ ?>
1009
+ </td>
1010
+ <td class="whitespace-no-wrap text-center">
1011
+ <b><?php echo esc_html( sprintf( __( "In %s", 'email-subscribers' ), human_time_diff( time(), $next_scheduled_time ) ) ); ?></b><br>
1012
+ <span title="<?php echo esc_attr( 'UTC: ' . date_i18n( $date_format . ' ' . $time_format, $next_scheduled_time ) ); ?>">
1013
+ <?php echo date_i18n( $date_format . ' ' . $time_format, $next_scheduled_time + $time_offset ); ?>
1014
+ </span>
1015
+ </td>
1016
+ </tr>
1017
+ <?php
1018
+ }
1019
+ ?>
1020
+ </tbody>
1021
+ </table>
1022
+ <?php
1023
+ $html = ob_get_clean();
1024
+ }
1025
+
1026
+ return $html;
1027
+ }
1028
+
1029
  }
lite/includes/classes/class-es-campaigns-table.php CHANGED
@@ -90,60 +90,60 @@ class ES_Campaigns_Table extends WP_List_Table {
90
  public function render() {
91
  $action = ig_es_get_request_data( 'action' );
92
  global $ig_es_tracker;
93
- if( 'broadcast_created' === $action ) {
94
 
95
  // Trigger feedback popup for broadcast creation.
96
  do_action( 'ig_es_broadcast_created' );
97
 
98
- $message = __( 'Broadcast has been created successfully.', 'email-subscribers' );
99
  ES_Common::show_message( $message, 'success' );
100
  }
101
  ?>
102
- <div class="wrap">
103
- <h1 class="wp-heading-inline"><span class="text-2xl font-medium leading-7 text-gray-900 sm:leading-9 sm:truncate"><?php _e( 'Campaigns', 'email-subscribers' ) ?>
104
  <a href="admin.php?page=es_notifications&action=new" class="ig-es-title-button px-2 py-2 mx-1"><?php _e( 'Create Post Notification', 'email-subscribers' ) ?></a></span>
105
- <a href="admin.php?page=es_newsletters" class="ig-es-title-button px-2 py-2 mx-1"><?php _e( 'Send Broadcast', 'email-subscribers' ) ?></a>
106
- <?php do_action( 'ig_es_after_campaign_type_buttons' );
107
-
108
- $icegram_plugin = 'icegram/icegram.php';
109
- $active_plugins = $ig_es_tracker::get_active_plugins();
110
- if ( in_array( $icegram_plugin, $active_plugins ) ) {
111
- $redirect_url = admin_url( 'post-new.php?post_type=ig_campaign' );
112
- ?>
113
- <a href="<?php echo $redirect_url; ?>" class="ig-es-link-button px-2 py-2 mx-1"><?php _e( 'Onsite Campaigns', 'email-subscribers' ) ?></a>
114
- <?php } else { ?>
115
- <a href="admin.php?page=go_to_icegram&action=create_campaign" class="ig-es-link-button px-2 py-2 mx-1"><?php _e( 'Onsite Campaigns', 'email-subscribers' ) ?></a>
116
- <?php } ?>
117
-
118
- <a href="edit.php?post_type=es_template" class="ig-es-imp-button px-2 py-2 mx-1"><?php _e( 'Manage Templates', 'email-subscribers' ) ?></a>
119
-
120
-
121
- </h1>
122
- <div id="poststuff" class="es-items-lists">
123
- <div id="post-body" class="metabox-holder column-1">
124
- <div id="post-body-content">
125
- <div class="meta-box-sortables ui-sortable">
126
- <form method="post">
127
- <?php
128
- $this->prepare_items();
129
- $this->display(); ?>
130
- </form>
131
- </div>
132
- </div>
133
- </div>
134
- <br class="clear">
135
- </div>
136
- </div>
137
- <?php
138
- }
139
 
140
- public function custom_admin_notice() {
141
- $es_note_cat = ig_es_get_request_data( 'es_note_cat' );
142
 
143
- if ( $es_note_cat ) {
144
- echo '<div class="updated"><p>' . esc_html( 'Notification Added Successfully!', 'email-subscribers' ) . '</p></div>';
 
145
  }
146
- }
147
 
148
  /**
149
  * Retrieve lists data from the database
@@ -157,10 +157,10 @@ public function custom_admin_notice() {
157
 
158
  global $wpdb;
159
 
160
- $order_by = sanitize_sql_orderby( ig_es_get_request_data( 'orderby' ) );
161
- $order = ig_es_get_request_data( 'order' );
162
- $search = ig_es_get_request_data( 's' );
163
- $filter_by_campaign_type = ig_es_get_request_data( 'filter_by_campaign_type' );
164
  $filter_by_campaign_status = ig_es_get_request_data( 'filter_by_campaign_status' );
165
 
166
  if ( $do_count_only ) {
@@ -194,20 +194,20 @@ public function custom_admin_notice() {
194
  }
195
 
196
  if ( ! empty( $filter_by_campaign_status ) || ( '0' === $filter_by_campaign_status ) ) {
197
- if ( $add_where_clause ) {
198
- $sql .= $wpdb->prepare( " AND status = %s", $filter_by_campaign_status );
199
- } else {
200
- $sql .= $wpdb->prepare( " WHERE status = %s", $filter_by_campaign_status );
201
- }
202
 
203
  }
204
 
205
- if ( ! empty( $filter_by_campaign_type ) ) {
206
- if ( $add_where_clause ) {
207
- $sql .= $wpdb->prepare( " AND type = %s", $filter_by_campaign_type );
208
- } else {
209
- $sql .= $wpdb->prepare( " WHERE type = %s", $filter_by_campaign_type );
210
- }
211
 
212
  }
213
 
@@ -221,7 +221,7 @@ public function custom_admin_notice() {
221
 
222
  $default_order_by = esc_sql( 'created_at' );
223
 
224
- $expected_order_by_values = array( 'base_template_id', 'type' );
225
  if ( ! in_array( $order_by, $expected_order_by_values ) ) {
226
  $order_by_clause = " ORDER BY {$default_order_by} DESC";
227
  } else {
@@ -293,30 +293,33 @@ public function custom_admin_notice() {
293
  switch ( $column_name ) {
294
 
295
  case 'list_ids':
296
- if ( ! empty( $item[ $column_name ] ) ) {
297
- return ES()->lists_db->get_list_id_name_map( $item[ $column_name ] );
298
- } else {
299
- return '-';
300
- }
301
- break;
302
  case 'type':
303
- $type = ( $item[ $column_name ] === 'newsletter' ) ? __( 'Broadcast', 'email-subscribers' ) : $item[ $column_name ];
304
- $type = ucwords( str_replace( '_', ' ', $type ) );
305
 
306
- return $type;
307
- break;
 
 
 
308
  case 'categories':
309
- if ( ! empty( $item[ $column_name ] ) ) {
310
- $categories = ES_Common::convert_categories_string_to_array( $item[ $column_name ], false );
311
- $categories = strpos( $item[ $column_name ], '{a}All{a}' ) ? __( 'All', 'email-subscribers' ) : trim( trim( implode( ', ', $categories ) ), ',' );
312
 
313
- return $categories;
314
- } else {
315
- return '-';
316
- }
317
- break;
318
  default:
319
- return $item[ $column_name ];
320
  }
321
  }
322
 
@@ -340,11 +343,10 @@ public function custom_admin_notice() {
340
  *
341
  * @return string
342
  */
343
- function column_base_template_id( $item ) {
344
 
345
  $type = $item['type'];
346
 
347
-
348
  $nonce = wp_create_nonce( 'es_post_notification' );
349
 
350
  $template = get_post( $item['base_template_id'] );
@@ -352,17 +354,22 @@ public function custom_admin_notice() {
352
  $report = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $item['id'] );
353
 
354
  if ( $type !== 'newsletter' ) {
 
355
  if ( $template instanceof WP_Post ) {
356
  $title = '<strong>' . $template->post_title . '</strong>';
357
  } else {
358
  $title = ! empty( $item['name'] ) ? $item['name'] : '';
359
  }
360
- $slug = ( in_array( $item['type'], array( 'post_notification', 'post_digest' ) ) ) ? esc_attr( 'es_notifications' ) : 'es_' . $item['type'];
361
- $actions ['edit'] = sprintf( __( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">Edit</a>', 'email-subscribers' ), $slug, 'edit', absint( $item['id'] ), $nonce );
362
 
363
- if( in_array( $type, array( 'post_notification', 'post_digest' ) ) ) {
 
 
 
 
 
364
  // Add reports link if there are any reports related to the post notification.
365
- if( ! empty( $report ) ) {
366
  $actions['report'] = sprintf( '<a href="?page=%s&campaign_id=%d" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), $item['id'], __( 'Report', 'email-subscribers' ) );
367
  }
368
  }
@@ -377,8 +384,8 @@ public function custom_admin_notice() {
377
  IG_ES_CAMPAIGN_STATUS_SCHEDULED
378
  );
379
 
380
- if( in_array( $status, $broadcast_allowed_edit_statuses ) ) {
381
- $actions ['edit'] = sprintf( __( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">Edit</a>', 'email-subscribers' ), $slug, 'edit', absint( $item['id'] ), $nonce );
382
  }
383
 
384
  $broadcast_allowed_report_statuses = array(
@@ -388,8 +395,8 @@ public function custom_admin_notice() {
388
  IG_ES_CAMPAIGN_STATUS_FINISHED
389
  );
390
 
391
- if( in_array( $status, $broadcast_allowed_report_statuses ) && ! empty( $report ) ) {
392
- $es_nonce = wp_create_nonce( 'es_notification' );
393
  $actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
394
  }
395
  }
@@ -409,103 +416,106 @@ public function custom_admin_notice() {
409
  * @since 4.4.4
410
  */
411
  function column_status( $item ) {
412
- $campaign_id = ! empty( $item['id'] ) ? $item['id'] : 0;
413
- $campaign_status = ! empty( $item['status'] ) ? (int) $item['status'] : 0;
414
  $campaign_statuses = array(
415
  IG_ES_CAMPAIGN_STATUS_ACTIVE,
416
  IG_ES_CAMPAIGN_STATUS_IN_ACTIVE
417
  );
418
 
419
  $campaign_type = '';
420
- if( ! empty( $campaign_id ) ) {
421
  $campaign_type = ES()->campaigns_db->get_campaign_type_by_id( $campaign_id );
422
  }
423
 
424
- if( 'newsletter' !== $campaign_type && in_array( $campaign_status, $campaign_statuses, true ) ) {
425
  ?>
426
- <label for="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" class="ig-es-campaign-status-toggle-label inline-flex items-center cursor-pointer">
427
  <span class="relative">
428
- <input id="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" type="checkbox" class="absolute es-check-toggle opacity-0 w-0 h-0" name="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" value="<?php echo esc_attr( $campaign_id ); ?>" <?php checked( IG_ES_CAMPAIGN_STATUS_ACTIVE, $campaign_status ); ?>>
 
429
  <span class="es-mail-toggle-line inline-block w-10 h-6 bg-gray-300 rounded-full shadow-inner"></span>
430
  <span class="es-mail-toggle-dot absolute transition-all duration-300 ease-in-out block w-4 h-4 mt-1 ml-1 bg-white rounded-full shadow inset-y-0 left-0 focus-within:shadow-outline"></span>
431
  </span>
432
- </label>
433
  <?php
434
  } else {
435
  switch ( $campaign_status ) {
436
 
437
  case IG_ES_CAMPAIGN_STATUS_ACTIVE:
438
- $notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
439
- if( ! empty( $notification ) ) {
440
- $notification_status = $notification['status'];
441
- if( 'In Queue' === $notification_status ) {
442
- ?>
443
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-orange-400" fill="currentColor" viewBox="0 0 20 20">
444
- <title><?php echo esc_attr__( 'Scheduled', 'email-subscribers' ); ?></title>
445
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clip-rule="evenodd"/>
446
- </svg>
447
- <?php
448
- } else if( 'Sending' === $notification_status ) {
449
- ?>
450
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
451
- <title><?php echo esc_attr__( 'Sending', 'email-subscribers' ); ?></title>
452
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-8.707l-3-3a1 1 0 00-1.414 1.414L10.586 9H7a1 1 0 100 2h3.586l-1.293 1.293a1 1 0 101.414 1.414l3-3a1 1 0 000-1.414z" clip-rule="evenodd"/>
453
- </svg>
454
- <?php
455
- } else {
456
- ?>
457
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-green-400" fill="currentColor" viewBox="0 0 20 20" >
458
- <title><?php echo esc_attr__( 'Sent', 'email-subscribers' ); ?></title>
459
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
460
- </svg>
461
- <?php
 
462
  }
463
- }
464
- break;
465
 
466
  case IG_ES_CAMPAIGN_STATUS_IN_ACTIVE:
467
- ?>
468
- <svg fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke="currentColor" viewBox="0 0 24 24" class="ml-2 h-6 w-6 text-indigo-600">
469
- <title><?php echo esc_attr__( 'Draft', 'email-subscribers' ); ?></title>
470
- <path d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path>
471
- </svg>
472
- <?php
473
- break;
474
 
475
  case IG_ES_CAMPAIGN_STATUS_SCHEDULED:
476
- ?>
477
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-orange-400" fill="currentColor" viewBox="0 0 20 20">
478
- <title><?php echo esc_attr__( 'Scheduled', 'email-subscribers' ); ?></title>
479
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clip-rule="evenodd"/>
480
- </svg>
481
- <?php
482
- break;
483
 
484
  case IG_ES_CAMPAIGN_STATUS_QUEUED:
485
- ?>
486
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
487
- <title><?php echo esc_attr__( 'Sending', 'email-subscribers' ); ?></title>
488
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-8.707l-3-3a1 1 0 00-1.414 1.414L10.586 9H7a1 1 0 100 2h3.586l-1.293 1.293a1 1 0 101.414 1.414l3-3a1 1 0 000-1.414z" clip-rule="evenodd"/></svg>
489
- </svg>
490
- <?php
491
- break;
 
492
 
493
  case IG_ES_CAMPAIGN_STATUS_PAUSED:
494
- ?>
495
- <svg fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke="currentColor" viewBox="0 0 24 24" class="ml-2 h-6 w-6 text-blue-400">
496
- <title><?php echo esc_attr__( 'Paused', 'email-subscribers' ); ?></title>
497
- <path d="M10 9v6m4-6v6m7-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
 
498
  <?php
499
  break;
500
 
501
  default:
502
- ?>
503
- <svg class="flex-shrink-0 ml-2 h-6 w-6 text-green-400" fill="currentColor" viewBox="0 0 20 20" >
504
- <title><?php echo esc_attr__( 'Sent', 'email-subscribers' ); ?></title>
505
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
506
- </svg>
507
- <?php
508
- break;
509
  }
510
  }
511
  ?>
@@ -519,12 +529,13 @@ public function custom_admin_notice() {
519
  */
520
  function get_columns() {
521
  $columns = array(
522
- 'cb' => '<input type="checkbox" />',
523
- 'base_template_id' => __( 'Name', 'email-subscribers' ),
524
- 'type' => __( 'Type', 'email-subscribers' ),
525
- 'list_ids' => __( 'List', 'email-subscribers' ),
526
- 'categories' => __( 'Categories', 'email-subscribers' ),
527
- 'status' => __( 'Status', 'email-subscribers' )
 
528
  );
529
 
530
  return $columns;
@@ -541,7 +552,9 @@ public function custom_admin_notice() {
541
  //'base_template_id' => array( 'base_template_id', true ),
542
  //'list_ids' => array( 'list_ids', true ),
543
  //'status' => array( 'status', true )
544
- 'type' => array( 'type', true )
 
 
545
  );
546
 
547
  return $sortable_columns;
@@ -570,23 +583,23 @@ public function custom_admin_notice() {
570
  * @since 4.3.4 Added esc_attr()
571
  */
572
  public function search_box( $text = '', $input_id = '' ) { ?>
573
- <p class="search-box">
574
- <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_attr( $text ); ?>:</label>
575
- <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>"/>
576
  <?php submit_button( __( 'Search Campaigns', 'email-subscribers' ), 'button', false, false, array( 'id' => 'search-submit' ) ); ?>
577
- </p>
578
- <p class="search-box search-group-box box-ma10">
579
  <?php $filter_by_status = ig_es_get_request_data( 'filter_by_campaign_status' ); ?>
580
- <select name="filter_by_campaign_status" id="ig_es_filter_campaign_status_by_type">
581
  <?php echo ES_Common::prepare_campaign_statuses_dropdown_options( $filter_by_status, __( 'All Statuses', 'email-subscribers' ) ); ?>
582
- </select>
583
- </p>
584
- <p class="search-box search-group-box box-ma10">
585
  <?php $filter_by_campaign_type = ig_es_get_request_data( 'filter_by_campaign_type' ); ?>
586
- <select name="filter_by_campaign_type" id="ig_es_filter_campaign_type">
587
  <?php echo ES_Common::prepare_campaign_type_dropdown_options( $filter_by_campaign_type, __( 'All Type', 'email-subscribers' ) ); ?>
588
- </select>
589
- </p>
590
  <?php }
591
 
592
  /**
90
  public function render() {
91
  $action = ig_es_get_request_data( 'action' );
92
  global $ig_es_tracker;
93
+ if ( 'broadcast_created' === $action ) {
94
 
95
  // Trigger feedback popup for broadcast creation.
96
  do_action( 'ig_es_broadcast_created' );
97
 
98
+ $message = __( 'Broadcast has been created successfully.', 'email-subscribers' );
99
  ES_Common::show_message( $message, 'success' );
100
  }
101
  ?>
102
+ <div class="wrap">
103
+ <h1 class="wp-heading-inline"><span class="text-2xl font-medium leading-7 text-gray-900 sm:leading-9 sm:truncate"><?php _e( 'Campaigns', 'email-subscribers' ) ?>
104
  <a href="admin.php?page=es_notifications&action=new" class="ig-es-title-button px-2 py-2 mx-1"><?php _e( 'Create Post Notification', 'email-subscribers' ) ?></a></span>
105
+ <a href="admin.php?page=es_newsletters" class="ig-es-title-button px-2 py-2 mx-1"><?php _e( 'Send Broadcast', 'email-subscribers' ) ?></a>
106
+ <?php do_action( 'ig_es_after_campaign_type_buttons' );
107
+
108
+ $icegram_plugin = 'icegram/icegram.php';
109
+ $active_plugins = $ig_es_tracker::get_active_plugins();
110
+ if ( in_array( $icegram_plugin, $active_plugins ) ) {
111
+ $redirect_url = admin_url( 'post-new.php?post_type=ig_campaign' );
112
+ ?>
113
+ <a href="<?php echo $redirect_url; ?>" class="ig-es-link-button px-2 py-2 mx-1"><?php _e( 'Onsite Campaigns', 'email-subscribers' ) ?></a>
114
+ <?php } else { ?>
115
+ <a href="admin.php?page=go_to_icegram&action=create_campaign" class="ig-es-link-button px-2 py-2 mx-1"><?php _e( 'Onsite Campaigns', 'email-subscribers' ) ?></a>
116
+ <?php } ?>
117
+
118
+ <a href="edit.php?post_type=es_template" class="ig-es-imp-button px-2 py-2 mx-1"><?php _e( 'Manage Templates', 'email-subscribers' ) ?></a>
119
+
120
+
121
+ </h1>
122
+ <div id="poststuff" class="es-items-lists">
123
+ <div id="post-body" class="metabox-holder column-1">
124
+ <div id="post-body-content">
125
+ <div class="meta-box-sortables ui-sortable">
126
+ <form method="post">
127
+ <?php
128
+ $this->prepare_items();
129
+ $this->display(); ?>
130
+ </form>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ <br class="clear">
135
+ </div>
136
+ </div>
137
+ <?php
138
+ }
139
 
140
+ public function custom_admin_notice() {
141
+ $es_note_cat = ig_es_get_request_data( 'es_note_cat' );
142
 
143
+ if ( $es_note_cat ) {
144
+ echo '<div class="updated"><p>' . esc_html( 'Notification Added Successfully!', 'email-subscribers' ) . '</p></div>';
145
+ }
146
  }
 
147
 
148
  /**
149
  * Retrieve lists data from the database
157
 
158
  global $wpdb;
159
 
160
+ $order_by = sanitize_sql_orderby( ig_es_get_request_data( 'orderby' ) );
161
+ $order = ig_es_get_request_data( 'order' );
162
+ $search = ig_es_get_request_data( 's' );
163
+ $filter_by_campaign_type = ig_es_get_request_data( 'filter_by_campaign_type' );
164
  $filter_by_campaign_status = ig_es_get_request_data( 'filter_by_campaign_status' );
165
 
166
  if ( $do_count_only ) {
194
  }
195
 
196
  if ( ! empty( $filter_by_campaign_status ) || ( '0' === $filter_by_campaign_status ) ) {
197
+ if ( $add_where_clause ) {
198
+ $sql .= $wpdb->prepare( " AND status = %s", $filter_by_campaign_status );
199
+ } else {
200
+ $sql .= $wpdb->prepare( " WHERE status = %s", $filter_by_campaign_status );
201
+ }
202
 
203
  }
204
 
205
+ if ( ! empty( $filter_by_campaign_type ) ) {
206
+ if ( $add_where_clause ) {
207
+ $sql .= $wpdb->prepare( " AND type = %s", $filter_by_campaign_type );
208
+ } else {
209
+ $sql .= $wpdb->prepare( " WHERE type = %s", $filter_by_campaign_type );
210
+ }
211
 
212
  }
213
 
221
 
222
  $default_order_by = esc_sql( 'created_at' );
223
 
224
+ $expected_order_by_values = array( 'name', 'type', 'created_at' );
225
  if ( ! in_array( $order_by, $expected_order_by_values ) ) {
226
  $order_by_clause = " ORDER BY {$default_order_by} DESC";
227
  } else {
293
  switch ( $column_name ) {
294
 
295
  case 'list_ids':
296
+ if ( ! empty( $item[ $column_name ] ) ) {
297
+ return ES()->lists_db->get_list_id_name_map( $item[ $column_name ] );
298
+ } else {
299
+ return '-';
300
+ }
301
+ break;
302
  case 'type':
303
+ $type = ( $item[ $column_name ] === 'newsletter' ) ? __( 'Broadcast', 'email-subscribers' ) : $item[ $column_name ];
304
+ $type = ucwords( str_replace( '_', ' ', $type ) );
305
 
306
+ return $type;
307
+ break;
308
+ case 'created_at':
309
+ return ig_es_format_date_time( $item[ $column_name ] );
310
+ break;
311
  case 'categories':
312
+ if ( ! empty( $item[ $column_name ] ) ) {
313
+ $categories = ES_Common::convert_categories_string_to_array( $item[ $column_name ], false );
314
+ $categories = strpos( $item[ $column_name ], '{a}All{a}' ) ? __( 'All', 'email-subscribers' ) : trim( trim( implode( ', ', $categories ) ), ',' );
315
 
316
+ return $categories;
317
+ } else {
318
+ return '-';
319
+ }
320
+ break;
321
  default:
322
+ return $item[ $column_name ];
323
  }
324
  }
325
 
343
  *
344
  * @return string
345
  */
346
+ function column_name( $item ) {
347
 
348
  $type = $item['type'];
349
 
 
350
  $nonce = wp_create_nonce( 'es_post_notification' );
351
 
352
  $template = get_post( $item['base_template_id'] );
354
  $report = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $item['id'] );
355
 
356
  if ( $type !== 'newsletter' ) {
357
+ /*
358
  if ( $template instanceof WP_Post ) {
359
  $title = '<strong>' . $template->post_title . '</strong>';
360
  } else {
361
  $title = ! empty( $item['name'] ) ? $item['name'] : '';
362
  }
363
+ */
 
364
 
365
+ $title = ! empty( $item['name'] ) ? $item['name'] : '';
366
+
367
+ $slug = ( in_array( $item['type'], array( 'post_notification', 'post_digest' ) ) ) ? esc_attr( 'es_notifications' ) : 'es_' . $item['type'];
368
+ $actions ['edit'] = sprintf( __( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">Edit</a>', 'email-subscribers' ), $slug, 'edit', absint( $item['id'] ), $nonce );
369
+
370
+ if ( in_array( $type, array( 'post_notification', 'post_digest' ) ) ) {
371
  // Add reports link if there are any reports related to the post notification.
372
+ if ( ! empty( $report ) ) {
373
  $actions['report'] = sprintf( '<a href="?page=%s&campaign_id=%d" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), $item['id'], __( 'Report', 'email-subscribers' ) );
374
  }
375
  }
384
  IG_ES_CAMPAIGN_STATUS_SCHEDULED
385
  );
386
 
387
+ if ( in_array( $status, $broadcast_allowed_edit_statuses ) ) {
388
+ $actions ['edit'] = sprintf( __( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">Edit</a>', 'email-subscribers' ), $slug, 'edit', absint( $item['id'] ), $nonce );
389
  }
390
 
391
  $broadcast_allowed_report_statuses = array(
395
  IG_ES_CAMPAIGN_STATUS_FINISHED
396
  );
397
 
398
+ if ( in_array( $status, $broadcast_allowed_report_statuses ) && ! empty( $report ) ) {
399
+ $es_nonce = wp_create_nonce( 'es_notification' );
400
  $actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
401
  }
402
  }
416
  * @since 4.4.4
417
  */
418
  function column_status( $item ) {
419
+ $campaign_id = ! empty( $item['id'] ) ? $item['id'] : 0;
420
+ $campaign_status = ! empty( $item['status'] ) ? (int) $item['status'] : 0;
421
  $campaign_statuses = array(
422
  IG_ES_CAMPAIGN_STATUS_ACTIVE,
423
  IG_ES_CAMPAIGN_STATUS_IN_ACTIVE
424
  );
425
 
426
  $campaign_type = '';
427
+ if ( ! empty( $campaign_id ) ) {
428
  $campaign_type = ES()->campaigns_db->get_campaign_type_by_id( $campaign_id );
429
  }
430
 
431
+ if ( 'newsletter' !== $campaign_type && in_array( $campaign_status, $campaign_statuses, true ) ) {
432
  ?>
433
+ <label for="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" class="ig-es-campaign-status-toggle-label inline-flex items-center cursor-pointer">
434
  <span class="relative">
435
+ <input id="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" type="checkbox" class="absolute es-check-toggle opacity-0 w-0 h-0" name="<?php echo esc_attr( 'ig-es-campaign-status-toggle-' . $campaign_id ); ?>" value="<?php echo esc_attr( $campaign_id ); ?>" <?php checked( IG_ES_CAMPAIGN_STATUS_ACTIVE,
436
+ $campaign_status ); ?>>
437
  <span class="es-mail-toggle-line inline-block w-10 h-6 bg-gray-300 rounded-full shadow-inner"></span>
438
  <span class="es-mail-toggle-dot absolute transition-all duration-300 ease-in-out block w-4 h-4 mt-1 ml-1 bg-white rounded-full shadow inset-y-0 left-0 focus-within:shadow-outline"></span>
439
  </span>
440
+ </label>
441
  <?php
442
  } else {
443
  switch ( $campaign_status ) {
444
 
445
  case IG_ES_CAMPAIGN_STATUS_ACTIVE:
446
+ $notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
447
+ if ( ! empty( $notification ) ) {
448
+ $notification_status = $notification['status'];
449
+ if ( 'In Queue' === $notification_status ) {
450
+ ?>
451
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-orange-400" fill="currentColor" viewBox="0 0 20 20">
452
+ <title><?php echo esc_attr__( 'Scheduled', 'email-subscribers' ); ?></title>
453
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clip-rule="evenodd"/>
454
+ </svg>
455
+ <?php
456
+ } elseif ( 'Sending' === $notification_status ) {
457
+ ?>
458
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
459
+ <title><?php echo esc_attr__( 'Sending', 'email-subscribers' ); ?></title>
460
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-8.707l-3-3a1 1 0 00-1.414 1.414L10.586 9H7a1 1 0 100 2h3.586l-1.293 1.293a1 1 0 101.414 1.414l3-3a1 1 0 000-1.414z" clip-rule="evenodd"/>
461
+ </svg>
462
+ <?php
463
+ } else {
464
+ ?>
465
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-green-400" fill="currentColor" viewBox="0 0 20 20">
466
+ <title><?php echo esc_attr__( 'Sent', 'email-subscribers' ); ?></title>
467
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
468
+ </svg>
469
+ <?php
470
+ }
471
  }
472
+ break;
 
473
 
474
  case IG_ES_CAMPAIGN_STATUS_IN_ACTIVE:
475
+ ?>
476
+ <svg fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke="currentColor" viewBox="0 0 24 24" class="ml-2 h-6 w-6 text-indigo-600">
477
+ <title><?php echo esc_attr__( 'Draft', 'email-subscribers' ); ?></title>
478
+ <path d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path>
479
+ </svg>
480
+ <?php
481
+ break;
482
 
483
  case IG_ES_CAMPAIGN_STATUS_SCHEDULED:
484
+ ?>
485
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-orange-400" fill="currentColor" viewBox="0 0 20 20">
486
+ <title><?php echo esc_attr__( 'Scheduled', 'email-subscribers' ); ?></title>
487
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clip-rule="evenodd"/>
488
+ </svg>
489
+ <?php
490
+ break;
491
 
492
  case IG_ES_CAMPAIGN_STATUS_QUEUED:
493
+ ?>
494
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-yellow-400" fill="currentColor" viewBox="0 0 20 20">
495
+ <title><?php echo esc_attr__( 'Sending', 'email-subscribers' ); ?></title>
496
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-8.707l-3-3a1 1 0 00-1.414 1.414L10.586 9H7a1 1 0 100 2h3.586l-1.293 1.293a1 1 0 101.414 1.414l3-3a1 1 0 000-1.414z" clip-rule="evenodd"/>
497
+ </svg>
498
+ </svg>
499
+ <?php
500
+ break;
501
 
502
  case IG_ES_CAMPAIGN_STATUS_PAUSED:
503
+ ?>
504
+ <svg fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke="currentColor" viewBox="0 0 24 24" class="ml-2 h-6 w-6 text-blue-400">
505
+ <title><?php echo esc_attr__( 'Paused', 'email-subscribers' ); ?></title>
506
+ <path d="M10 9v6m4-6v6m7-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
507
+ </svg>
508
  <?php
509
  break;
510
 
511
  default:
512
+ ?>
513
+ <svg class="flex-shrink-0 ml-2 h-6 w-6 text-green-400" fill="currentColor" viewBox="0 0 20 20">
514
+ <title><?php echo esc_attr__( 'Sent', 'email-subscribers' ); ?></title>
515
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
516
+ </svg>
517
+ <?php
518
+ break;
519
  }
520
  }
521
  ?>
529
  */
530
  function get_columns() {
531
  $columns = array(
532
+ 'cb' => '<input type="checkbox" />',
533
+ 'name' => __( 'Name', 'email-subscribers' ),
534
+ 'type' => __( 'Type', 'email-subscribers' ),
535
+ 'list_ids' => __( 'List', 'email-subscribers' ),
536
+ 'categories' => __( 'Categories', 'email-subscribers' ),
537
+ 'created_at' => __( 'Created On', 'email-subscribers' ),
538
+ 'status' => __( 'Status', 'email-subscribers' )
539
  );
540
 
541
  return $columns;
552
  //'base_template_id' => array( 'base_template_id', true ),
553
  //'list_ids' => array( 'list_ids', true ),
554
  //'status' => array( 'status', true )
555
+ 'name' => array( 'name', true ),
556
+ 'type' => array( 'type', true ),
557
+ 'created_at' => array( 'created_at', true )
558
  );
559
 
560
  return $sortable_columns;
583
  * @since 4.3.4 Added esc_attr()
584
  */
585
  public function search_box( $text = '', $input_id = '' ) { ?>
586
+ <p class="search-box">
587
+ <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_attr( $text ); ?>:</label>
588
+ <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>"/>
589
  <?php submit_button( __( 'Search Campaigns', 'email-subscribers' ), 'button', false, false, array( 'id' => 'search-submit' ) ); ?>
590
+ </p>
591
+ <p class="search-box search-group-box box-ma10">
592
  <?php $filter_by_status = ig_es_get_request_data( 'filter_by_campaign_status' ); ?>
593
+ <select name="filter_by_campaign_status" id="ig_es_filter_campaign_status_by_type">
594
  <?php echo ES_Common::prepare_campaign_statuses_dropdown_options( $filter_by_status, __( 'All Statuses', 'email-subscribers' ) ); ?>
595
+ </select>
596
+ </p>
597
+ <p class="search-box search-group-box box-ma10">
598
  <?php $filter_by_campaign_type = ig_es_get_request_data( 'filter_by_campaign_type' ); ?>
599
+ <select name="filter_by_campaign_type" id="ig_es_filter_campaign_type">
600
  <?php echo ES_Common::prepare_campaign_type_dropdown_options( $filter_by_campaign_type, __( 'All Type', 'email-subscribers' ) ); ?>
601
+ </select>
602
+ </p>
603
  <?php }
604
 
605
  /**
lite/includes/classes/class-es-contacts-table.php CHANGED
@@ -491,7 +491,7 @@ class ES_Contacts_Table extends WP_List_Table {
491
  ?>
492
 
493
  <div class="wrap max-w-full mt-1 font-sans">
494
- <header class="ml-12 mr-8 wp-heading-inline">
495
  <div class="md:flex md:items-center md:justify-between justify-center">
496
  <div class="flex-1 min-w-0">
497
  <h2 class="text-2xl leading-7 text-gray-900 sm:leading-9 sm:truncate">
@@ -517,8 +517,8 @@ class ES_Contacts_Table extends WP_List_Table {
517
  </div>
518
  </div>
519
  </header>
520
- <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
521
- <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-6 rounded-lg">
522
  <?php echo $this->prepare_contact_form( $data, $is_new ); ?>
523
 
524
  </div>
491
  ?>
492
 
493
  <div class="wrap max-w-full mt-1 font-sans">
494
+ <header class="wp-heading-inline">
495
  <div class="md:flex md:items-center md:justify-between justify-center">
496
  <div class="flex-1 min-w-0">
497
  <h2 class="text-2xl leading-7 text-gray-900 sm:leading-9 sm:truncate">
517
  </div>
518
  </div>
519
  </header>
520
+ <div class=""><hr class="wp-header-end"></div>
521
+ <div class="bg-white shadow-md rounded-lg">
522
  <?php echo $this->prepare_contact_form( $data, $is_new ); ?>
523
 
524
  </div>
lite/includes/classes/class-es-export-subscribers.php CHANGED
@@ -315,7 +315,6 @@ public function export_subscribers_page() {
315
 
316
  $lists_id_name_map = ES()->lists_db->get_list_id_name_map();
317
  $csv_output .= implode( ',', $headers );
318
- $csv_output .= "\n";
319
 
320
  foreach ( $subscribers as $key => $subscriber ) {
321
 
@@ -330,8 +329,8 @@ public function export_subscribers_page() {
330
  $data['status'] = ucfirst( $list_details['status'] );
331
  $data['optin_type'] = ( $list_details['optin_type'] == 1 ) ? 'Single Opt-In' : 'Double Opt-In';
332
  $data['created_at'] = $subscriber['created_at'];
333
- $csv_output .= '"' . implode( '","', $data ) . '"';
334
  $csv_output .= "\n";
 
335
  }
336
  }
337
  }
315
 
316
  $lists_id_name_map = ES()->lists_db->get_list_id_name_map();
317
  $csv_output .= implode( ',', $headers );
 
318
 
319
  foreach ( $subscribers as $key => $subscriber ) {
320
 
329
  $data['status'] = ucfirst( $list_details['status'] );
330
  $data['optin_type'] = ( $list_details['optin_type'] == 1 ) ? 'Single Opt-In' : 'Double Opt-In';
331
  $data['created_at'] = $subscriber['created_at'];
 
332
  $csv_output .= "\n";
333
+ $csv_output .= '"' . implode( '","', $data ) . '"';
334
  }
335
  }
336
  }
lite/includes/classes/class-es-forms-table.php CHANGED
@@ -86,6 +86,16 @@ class ES_Forms_Table extends WP_List_Table {
86
  </a>
87
  </span>
88
  </h1>
 
 
 
 
 
 
 
 
 
 
89
  <div id="poststuff" class="es-items-lists">
90
  <div id="post-body" class="metabox-holder column-1">
91
  <div id="post-body-content">
@@ -171,8 +181,9 @@ class ES_Forms_Table extends WP_List_Table {
171
  }
172
 
173
  $this->save_form( null, $form_data );
174
- $message = __( 'Form has been added successfully!', 'email-subscribers' );
175
- ES_Common::show_message( $message, 'success' );
 
176
  }
177
 
178
  $this->prepare_list_form();
@@ -219,8 +230,10 @@ class ES_Forms_Table extends WP_List_Table {
219
  }
220
 
221
  $this->save_form( $id, $form_data );
222
- $message = __( 'Form has been updated successfully!', 'email-subscribers' );
223
- ES_Common::show_message( $message, 'success' );
 
 
224
  } else {
225
 
226
  $data = $data[0];
@@ -267,7 +280,7 @@ class ES_Forms_Table extends WP_List_Table {
267
  ?>
268
 
269
  <div class="wrap max-w-full mt-1 font-sans">
270
- <header class="ml-12 mr-8 wp-heading-inline">
271
  <div class="md:flex md:items-center md:justify-between justify-center">
272
  <div class="flex-1 min-w-0">
273
  <h1 class="text-2xl leading-7 text-gray-900 sm:leading-9 sm:truncate">
@@ -285,11 +298,11 @@ class ES_Forms_Table extends WP_List_Table {
285
  </div>
286
  </div>
287
  </header>
288
- <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
289
  <div id="poststuff">
290
  <div id="post-body" class="metabox-holder column-1">
291
  <div id="post-body-content">
292
- <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-4 rounded-lg">
293
  <form class="pt-8 ml-5 mr-4 text-left flex-row mt-2 item-center " method="post" action="admin.php?page=es_forms&action=<?php echo $action; ?>&form=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
294
 
295
 
@@ -316,7 +329,7 @@ class ES_Forms_Table extends WP_List_Table {
316
  <div class="flex ">
317
  <div class="ml-16 mb-4 h-10 mr-4 mt-4">
318
  <div class="h-10 relative ">
319
- <input id="ig_es_title" class="form-input block border-gray-400 w-full pl-3 pr-12 shadow-sm focus:bg-gray-100 sm:text-sm sm:leading-5" placeholder="Enter description" name="form_data[desc]" id="ig_es_title" value="<?php echo stripslashes( $form_data['desc'] ); ?>" size="30" maxlength="100"/>
320
  </div>
321
  </div>
322
  </div>
86
  </a>
87
  </span>
88
  </h1>
89
+ <?php
90
+ if( 'form_created' === $action ){
91
+ $message = __( 'Form has been added successfully!', 'email-subscribers' );
92
+ ES_Common::show_message( $message, 'success' );
93
+ }
94
+ elseif( 'form_updated' === $action ){
95
+ $message = __( 'Form has been updated successfully!', 'email-subscribers' );
96
+ ES_Common::show_message( $message, 'success' );
97
+ }
98
+ ?>
99
  <div id="poststuff" class="es-items-lists">
100
  <div id="post-body" class="metabox-holder column-1">
101
  <div id="post-body-content">
181
  }
182
 
183
  $this->save_form( null, $form_data );
184
+ $form_url = admin_url( 'admin.php?page=es_forms&action=form_created' );
185
+ wp_safe_redirect( $form_url );
186
+ exit();
187
  }
188
 
189
  $this->prepare_list_form();
230
  }
231
 
232
  $this->save_form( $id, $form_data );
233
+ $form_url = admin_url( 'admin.php?page=es_forms&action=form_updated' );
234
+ wp_safe_redirect( $form_url );
235
+ exit();
236
+
237
  } else {
238
 
239
  $data = $data[0];
280
  ?>
281
 
282
  <div class="wrap max-w-full mt-1 font-sans">
283
+ <header class="wp-heading-inline">
284
  <div class="md:flex md:items-center md:justify-between justify-center">
285
  <div class="flex-1 min-w-0">
286
  <h1 class="text-2xl leading-7 text-gray-900 sm:leading-9 sm:truncate">
298
  </div>
299
  </div>
300
  </header>
301
+ <div class=""><hr class="wp-header-end"></div>
302
  <div id="poststuff">
303
  <div id="post-body" class="metabox-holder column-1">
304
  <div id="post-body-content">
305
+ <div class="bg-white shadow-md rounded-lg">
306
  <form class="pt-8 ml-5 mr-4 text-left flex-row mt-2 item-center " method="post" action="admin.php?page=es_forms&action=<?php echo $action; ?>&form=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
307
 
308
 
329
  <div class="flex ">
330
  <div class="ml-16 mb-4 h-10 mr-4 mt-4">
331
  <div class="h-10 relative ">
332
+ <input id="ig_es_title" class="form-input block border-gray-400 w-full pl-3 pr-12 shadow-sm focus:bg-gray-100 sm:text-sm sm:leading-5" placeholder="Enter description" name="form_data[desc]" id="ig_es_title" value="<?php echo stripslashes( $form_data['desc'] ); ?>" size="30" />
333
  </div>
334
  </div>
335
  </div>
lite/includes/classes/class-es-lists-table.php CHANGED
@@ -246,7 +246,7 @@ class ES_Lists_Table extends WP_List_Table {
246
  ?>
247
 
248
  <div class="wrap max-w-full mt-8 font-sans">
249
- <header class="ml-12 mr-8 wp-heading-inline">
250
  <div class="md:flex md:items-center md:justify-between justify-center">
251
  <div class="flex-1 min-w-0">
252
  <h2 class="text-2xl font-medium leading-7 text-gray-900 sm:leading-9 sm:truncate">
@@ -266,12 +266,12 @@ class ES_Lists_Table extends WP_List_Table {
266
  </div>
267
  </div>
268
  </header>
269
- <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
270
  <div class="rounded max-w-full ">
271
  <div id="poststuff">
272
  <div id="post-body" class="metabox-holder column-1">
273
  <div id="post-body-content">
274
- <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-4 rounded-lg">
275
  <form class="ml-5 mr-4 text-left pt-8 flex-row mt-2 item-center " method="post" action="admin.php?page=es_lists&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
276
 
277
  <div class="flex flex-row ">
246
  ?>
247
 
248
  <div class="wrap max-w-full mt-8 font-sans">
249
+ <header class="wp-heading-inline">
250
  <div class="md:flex md:items-center md:justify-between justify-center">
251
  <div class="flex-1 min-w-0">
252
  <h2 class="text-2xl font-medium leading-7 text-gray-900 sm:leading-9 sm:truncate">
266
  </div>
267
  </div>
268
  </header>
269
+ <div class=""><hr class="wp-header-end"></div>
270
  <div class="rounded max-w-full ">
271
  <div id="poststuff">
272
  <div id="post-body" class="metabox-holder column-1">
273
  <div id="post-body-content">
274
+ <div class="bg-white shadow-md rounded-lg">
275
  <form class="ml-5 mr-4 text-left pt-8 flex-row mt-2 item-center " method="post" action="admin.php?page=es_lists&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
276
 
277
  <div class="flex flex-row ">
lite/includes/classes/class-es-mailer.php CHANGED
@@ -796,9 +796,7 @@ if ( ! class_exists( 'ES_Mailer' ) ) {
796
  // Convert text equivalent of smilies to images.
797
  $content = convert_smilies( wptexturize( $content ) );
798
 
799
- if ( isset( $GLOBALS['wp_embed'] ) ) {
800
- $content = $GLOBALS['wp_embed']->autoembed( $content );
801
- }
802
 
803
  // Replaces double line-breaks with paragraph elements.
804
  //$content = wpautop( $content );
796
  // Convert text equivalent of smilies to images.
797
  $content = convert_smilies( wptexturize( $content ) );
798
 
799
+ $content = ES_Common::handle_oembed_content( $content );
 
 
800
 
801
  // Replaces double line-breaks with paragraph elements.
802
  //$content = wpautop( $content );
lite/includes/classes/class-es-newsletters.php CHANGED
@@ -225,8 +225,8 @@ class ES_Newsletters {
225
  <input type="hidden" id="broadcast_id" name="broadcast_data[id]" value="<?php echo esc_attr( $broadcast_id ); ?>"/>
226
  <input type="hidden" id="broadcast_status" name="broadcast_data[status]" value="<?php echo esc_attr( $broadcast_status ); ?>"/>
227
  <fieldset class="block es_fieldset">
228
- <div class="mx-auto wp-heading-inline max-w-7xl sm:px-6 lg:px-3">
229
- <header class="mx-auto max-w-7xl sm:px-6 lg:px-4">
230
  <div class="pb-2 md:flex md:items-center md:justify-between">
231
  <div class="flex md:3/5 lg:w-7/12 xl:w-3/5">
232
  <div class="flex min-w-0 md:w-3/5 lg:w-1/2">
@@ -310,13 +310,13 @@ class ES_Newsletters {
310
  </div>
311
  </header>
312
  </div>
313
- <div class="mx-auto max-w-7xl sm:px-8 lg:px-7">
314
  <hr class="wp-header-end">
315
  </div>
316
- <div class="px-4 mx-auto my-4 es_broadcast_first max-w-7xl sm:px-6 lg:px-3">
317
- <div class="sm:px-6 lg:px-4">
318
- <div class="py-4 bg-white rounded-lg shadow-md md:flex">
319
- <div class="broadcast_main_content pl-2">
320
  <div class="block px-4 py-2">
321
  <label for="ig_es_broadcast_subject" class="text-sm font-medium leading-5 text-gray-700"><?php echo esc_html__( 'Subject', 'email-subscribers' ); ?></label>
322
  <input id="ig_es_broadcast_subject" class="block w-full mt-1 text-sm leading-5 border-gray-400 rounded-md shadow-sm form-input" name="broadcast_data[subject]" value="<?php echo esc_attr( $broadcast_subject ); ?>"/>
@@ -347,8 +347,8 @@ class ES_Newsletters {
347
  </div>
348
  <?php do_action( 'ig_es_after_broadcast_left_pan_settings', $broadcast_data ); ?>
349
  </div>
350
- <div class="broadcast_side_content ml-2 mr-4 bg-gray-100 rounded-md">
351
- <div class="block mt-0.5 mx-4 py-2">
352
  <label for="template" class="text-sm font-medium leading-5 text-gray-700"><?php echo esc_html__( 'Design Template', 'email-subscribers' ); ?></label>
353
  <select class="block w-full h-8 mt-1 text-sm rounded-md cursor-pointer h-9 form-select" name="broadcast_data[template_id]" id="base_template_id">
354
  <?php echo $templates ?>
@@ -365,7 +365,7 @@ class ES_Newsletters {
365
  </div>
366
  </div>
367
 
368
- <div class="block py-2 mx-4">
369
  <span class="block pt-2 text-sm font-medium leading-5 text-gray-700 border-t border-gray-200"><?php echo esc_html__( 'Preview', 'email-subscribers' ); ?></span>
370
  <div class="py-2">
371
  <input type="radio" name="preview_option" class="form-radio" id="preview_in_popup" value="preview_in_popup" checked>
@@ -374,13 +374,6 @@ class ES_Newsletters {
374
  <br>
375
  </div>
376
 
377
- <!--
378
- <label class=" text-sm font-medium leading-5 text-gray-700"><?php echo esc_html__( 'Preview', 'email-subscribers' ); ?></label>
379
- <button type="button" id="es_preview_template"
380
- class="rounded-md border text-indigo-600 border-indigo-500 text-sm leading-5 font-medium transition ease-in-out duration-150 select-none inline-flex justify-center hover:text-indigo-500 hover:border-indigo-600 hover:shadow-md focus:outline-none focus:shadow-outline-indigo focus:shadow-lg px-3 py-1.5 mx-2">
381
- <?php echo esc_html__( 'In Browser', 'email-subscribers' ); ?>
382
- </button> -->
383
-
384
  <img class="es-loader inline-flex align-middle" src="<?php echo ES_PLUGIN_URL ?>lite/public/images/spinner.gif" style="display:none;"/>
385
 
386
  <div class="hidden" id="preview_template">
@@ -414,13 +407,13 @@ class ES_Newsletters {
414
 
415
  <fieldset class="es_fieldset">
416
 
417
- <div class="hidden px-4 mx-auto my-4 es_broadcast_second max-w-7xl sm:px-6 lg:px-3">
418
  <?php
419
  $inline_preview_data = $this->get_broadcast_inline_preview_data( $broadcast_data );
420
  ?>
421
- <div class="max-w-7xl sm:px-6 lg:px-4">
422
- <div class="py-4 bg-white rounded-lg shadow md:flex">
423
- <div class="broadcast_main_content pt-3 pl-2">
424
  <div class="block pb-2 mx-4">
425
  <span class="text-sm font-medium text-gray-500"><?php echo esc_html__( 'Email Content Preview', 'email-subscribers' ); ?></span>
426
  </div>
@@ -450,8 +443,8 @@ class ES_Newsletters {
450
 
451
  </div>
452
 
453
- <div class="broadcast_side_content ml-2 mr-4 bg-gray-100 rounded-md">
454
- <div id="ig_es_total_recipients" class="block mt-1.5 mx-4 py-2 border-b border-gray-200">
455
 
456
  </div>
457
 
225
  <input type="hidden" id="broadcast_id" name="broadcast_data[id]" value="<?php echo esc_attr( $broadcast_id ); ?>"/>
226
  <input type="hidden" id="broadcast_status" name="broadcast_data[status]" value="<?php echo esc_attr( $broadcast_status ); ?>"/>
227
  <fieldset class="block es_fieldset">
228
+ <div class="mx-auto wp-heading-inline max-w-7xl">
229
+ <header class="mx-auto max-w-7xl">
230
  <div class="pb-2 md:flex md:items-center md:justify-between">
231
  <div class="flex md:3/5 lg:w-7/12 xl:w-3/5">
232
  <div class="flex min-w-0 md:w-3/5 lg:w-1/2">
310
  </div>
311
  </header>
312
  </div>
313
+ <div class="mx-auto max-w-7xl">
314
  <hr class="wp-header-end">
315
  </div>
316
+ <div class="mx-auto my-4 es_broadcast_first max-w-7xl">
317
+ <div>
318
+ <div class=" bg-white rounded-lg shadow-md md:flex">
319
+ <div class="broadcast_main_content py-4 pl-2">
320
  <div class="block px-4 py-2">
321
  <label for="ig_es_broadcast_subject" class="text-sm font-medium leading-5 text-gray-700"><?php echo esc_html__( 'Subject', 'email-subscribers' ); ?></label>
322
  <input id="ig_es_broadcast_subject" class="block w-full mt-1 text-sm leading-5 border-gray-400 rounded-md shadow-sm form-input" name="broadcast_data[subject]" value="<?php echo esc_attr( $broadcast_subject ); ?>"/>
347
  </div>
348
  <?php do_action( 'ig_es_after_broadcast_left_pan_settings', $broadcast_data ); ?>
349
  </div>
350
+ <div class="broadcast_side_content ml-2 bg-gray-100 rounded-r-lg">
351
+ <div class="block pt-6 mx-4 pb-3">
352
  <label for="template" class="text-sm font-medium leading-5 text-gray-700"><?php echo esc_html__( 'Design Template', 'email-subscribers' ); ?></label>
353
  <select class="block w-full h-8 mt-1 text-sm rounded-md cursor-pointer h-9 form-select" name="broadcast_data[template_id]" id="base_template_id">
354
  <?php echo $templates ?>
365
  </div>
366
  </div>
367
 
368
+ <div class="block pt-1 mx-4">
369
  <span class="block pt-2 text-sm font-medium leading-5 text-gray-700 border-t border-gray-200"><?php echo esc_html__( 'Preview', 'email-subscribers' ); ?></span>
370
  <div class="py-2">
371
  <input type="radio" name="preview_option" class="form-radio" id="preview_in_popup" value="preview_in_popup" checked>
374
  <br>
375
  </div>
376
 
 
 
 
 
 
 
 
377
  <img class="es-loader inline-flex align-middle" src="<?php echo ES_PLUGIN_URL ?>lite/public/images/spinner.gif" style="display:none;"/>
378
 
379
  <div class="hidden" id="preview_template">
407
 
408
  <fieldset class="es_fieldset">
409
 
410
+ <div class="my-4 hidden mx-auto es_broadcast_second max-w-7xl">
411
  <?php
412
  $inline_preview_data = $this->get_broadcast_inline_preview_data( $broadcast_data );
413
  ?>
414
+ <div class="max-w-7xl">
415
+ <div class=" bg-white rounded-lg shadow md:flex">
416
+ <div class="py-4 my-4 broadcast_main_content pt-3 pl-2">
417
  <div class="block pb-2 mx-4">
418
  <span class="text-sm font-medium text-gray-500"><?php echo esc_html__( 'Email Content Preview', 'email-subscribers' ); ?></span>
419
  </div>
443
 
444
  </div>
445
 
446
+ <div class="broadcast_side_content ml-2 bg-gray-100 rounded-r-lg">
447
+ <div id="ig_es_total_recipients" class="block mx-4 border-b border-gray-200">
448
 
449
  </div>
450
 
lite/includes/classes/class-es-post-notifications.php CHANGED
@@ -254,7 +254,7 @@ class ES_Post_Notifications_Table {
254
  ?>
255
 
256
  <div class="wrap max-w-full mt-1 font-sans">
257
- <header class="ml-12 mr-8 wp-heading-inline">
258
  <div class="sm:grid sm:grid-cols lg:grid lg:grid-cols-2 max-w-full">
259
  <div class="mt-2">
260
  <h2 class="text-2xl font-medium mt-2 text-gray-900 sm:leading-9 sm:truncate">
@@ -275,9 +275,9 @@ class ES_Post_Notifications_Table {
275
  </div>
276
  </div>
277
  </header>
278
- <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
279
 
280
- <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-6 rounded-lg">
281
  <form class="ml-5 mr-4 text-left pt-4 mt-2 item-center" method="post" action="admin.php?page=es_notifications&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
282
 
283
  <table class="max-w-full form-table">
254
  ?>
255
 
256
  <div class="wrap max-w-full mt-1 font-sans">
257
+ <header class="wp-heading-inline">
258
  <div class="sm:grid sm:grid-cols lg:grid lg:grid-cols-2 max-w-full">
259
  <div class="mt-2">
260
  <h2 class="text-2xl font-medium mt-2 text-gray-900 sm:leading-9 sm:truncate">
275
  </div>
276
  </div>
277
  </header>
278
+ <div class=""><hr class="wp-header-end"></div>
279
 
280
+ <div class="bg-white shadow-md rounded-lg">
281
  <form class="ml-5 mr-4 text-left pt-4 mt-2 item-center" method="post" action="admin.php?page=es_notifications&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
282
 
283
  <table class="max-w-full form-table">
lite/includes/es-core-functions.php CHANGED
@@ -406,9 +406,28 @@ if ( ! function_exists( 'ig_es_get_upcoming_weekly_datetime' ) ) {
406
  6 => 'saturday'
407
  );
408
 
409
- $next_week_day_str = 'next ' . $week_days_map[ $frequency_interval ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
 
411
- $timestamp = strtotime( $next_week_day_str ) + $time;
412
 
413
  return $timestamp;
414
 
@@ -599,3 +618,81 @@ if ( ! function_exists( 'ig_es_array_insert_after' ) ) {
599
  }
600
  }
601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  6 => 'saturday'
407
  );
408
 
409
+ $current_day = (int) current_time( 'N' );
410
+
411
+ // If campaign day is same as the current day then check campaign time also with current time since campaign time may have not already been passed.
412
+ if( $current_day === (int) $frequency_interval ) {
413
+ // Get curret time.
414
+ $current_hours = (int) current_time( 'H' );
415
+ $current_minutes = (int) current_time( 'i' );
416
+ $current_seconds = (int) current_time( 's' );
417
+
418
+ $current_time = $current_hours * HOUR_IN_SECONDS + $current_minutes * MINUTE_IN_SECONDS + $current_seconds;
419
+
420
+ // Check if campaign time has not yet passed then we can use today's date/time else use date/time when campaign day comes next time.
421
+ if( $current_time < $time ) {
422
+ $week_day_str = 'today';
423
+ } else {
424
+ $week_day_str = 'next ' . $week_days_map[ $frequency_interval ];
425
+ }
426
+ } else {
427
+ $week_day_str = 'next ' . $week_days_map[ $frequency_interval ];
428
+ }
429
 
430
+ $timestamp = strtotime( $week_day_str ) + $time;
431
 
432
  return $timestamp;
433
 
618
  }
619
  }
620
 
621
+ if ( ! function_exists( 'ig_es_get_raw_human_interval' ) ) {
622
+ /**
623
+ * Gets interval split by days, hours, minutes and seconds
624
+ *
625
+ * @param $interval_in_seconds
626
+ *
627
+ * @return array
628
+ *
629
+ * @since 4.4.9
630
+ */
631
+ function ig_es_get_raw_human_interval( $interval_in_seconds = 0 ) {
632
+
633
+ $interval = array();
634
+
635
+ $seconds_in_minute = 60;
636
+ $seconds_in__hour = 60 * $seconds_in_minute;
637
+ $seconds_in_day = 24 * $seconds_in__hour;
638
+
639
+ // extract days
640
+ $interval['days'] = floor( $interval_in_seconds / $seconds_in_day );
641
+
642
+ // extract hours
643
+ $hour_seconds = $interval_in_seconds % $seconds_in_day;
644
+ $interval['hours'] = floor( $hour_seconds / $seconds_in__hour );
645
+
646
+ // extract minutes
647
+ $minute_seconds = $hour_seconds % $seconds_in__hour;
648
+ $interval['minutes'] = floor( $minute_seconds / $seconds_in_minute );
649
+
650
+ // extract the remaining seconds
651
+ $remaining_seconds = $minute_seconds % $seconds_in_minute;
652
+ $interval['seconds'] = ceil( $remaining_seconds );
653
+
654
+ return $interval;
655
+
656
+ }
657
+ }
658
+
659
+ if ( ! function_exists( 'ig_es_get_human_interval' ) ) {
660
+ /**
661
+ * Gets interval in human readable format
662
+ *
663
+ * @param $interval_in_seconds
664
+ *
665
+ * @return string
666
+ *
667
+ * @since 4.4.9
668
+ */
669
+ function ig_es_get_human_interval( $interval_in_seconds = 0 ) {
670
+
671
+ $interval = ig_es_get_raw_human_interval( $interval_in_seconds );
672
+
673
+ $human_time = '';
674
+
675
+ if ( $interval['days'] > 0 ) {
676
+ $human_time .= $interval['days'] . 'd ';
677
+ }
678
+
679
+ if ( $interval['hours'] > 0 ) {
680
+ $human_time .= $interval['hours'] . 'h ';
681
+ }
682
+
683
+ if ( $interval['minutes'] > 0 ) {
684
+ $human_time .= $interval['minutes'] . 'm ';
685
+ }
686
+
687
+ if ( $interval['seconds'] > 0 ) {
688
+ $human_time .= $interval['seconds'] . 's ';
689
+ }
690
+
691
+ if ( empty( $human_time ) ) {
692
+ $human_time = '0s';
693
+ }
694
+
695
+ return trim( $human_time );
696
+
697
+ }
698
+ }
lite/includes/libraries/action-scheduler/action-scheduler.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: A robust scheduling library for use in WordPress plugins.
6
  * Author: Automattic
7
  * Author URI: https://automattic.com/
8
- * Version: 3.1.4
9
  * License: GPLv3
10
  *
11
  * Copyright 2019 Automattic, Inc. (https://automattic.com/contact/)
@@ -25,28 +25,28 @@
25
  *
26
  */
27
 
28
- if ( ! function_exists( 'action_scheduler_register_3_dot_1_dot_4' ) ) {
29
 
30
  if ( ! class_exists( 'ActionScheduler_Versions' ) ) {
31
  require_once( 'classes/ActionScheduler_Versions.php' );
32
  add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 );
33
  }
34
 
35
- add_action( 'plugins_loaded', 'action_scheduler_register_3_dot_1_dot_4', 0, 0 );
36
 
37
- function action_scheduler_register_3_dot_1_dot_4() {
38
  $versions = ActionScheduler_Versions::instance();
39
- $versions->register( '3.1.4', 'action_scheduler_initialize_3_dot_1_dot_4' );
40
  }
41
 
42
- function action_scheduler_initialize_3_dot_1_dot_4() {
43
  require_once( 'classes/abstracts/ActionScheduler.php' );
44
  ActionScheduler::init( __FILE__ );
45
  }
46
 
47
  // Support usage in themes - load this version if no plugin has loaded a version yet.
48
  if ( did_action( 'plugins_loaded' ) && ! class_exists( 'ActionScheduler' ) ) {
49
- action_scheduler_initialize_3_dot_1_dot_4();
50
  do_action( 'action_scheduler_pre_theme_init' );
51
  ActionScheduler_Versions::initialize_latest_version();
52
  }
5
  * Description: A robust scheduling library for use in WordPress plugins.
6
  * Author: Automattic
7
  * Author URI: https://automattic.com/
8
+ * Version: 3.1.6
9
  * License: GPLv3
10
  *
11
  * Copyright 2019 Automattic, Inc. (https://automattic.com/contact/)
25
  *
26
  */
27
 
28
+ if ( ! function_exists( 'action_scheduler_register_3_dot_1_dot_6' ) ) {
29
 
30
  if ( ! class_exists( 'ActionScheduler_Versions' ) ) {
31
  require_once( 'classes/ActionScheduler_Versions.php' );
32
  add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 );
33
  }
34
 
35
+ add_action( 'plugins_loaded', 'action_scheduler_register_3_dot_1_dot_6', 0, 0 );
36
 
37
+ function action_scheduler_register_3_dot_1_dot_6() {
38
  $versions = ActionScheduler_Versions::instance();
39
+ $versions->register( '3.1.6', 'action_scheduler_initialize_3_dot_1_dot_6' );
40
  }
41
 
42
+ function action_scheduler_initialize_3_dot_1_dot_6() {
43
  require_once( 'classes/abstracts/ActionScheduler.php' );
44
  ActionScheduler::init( __FILE__ );
45
  }
46
 
47
  // Support usage in themes - load this version if no plugin has loaded a version yet.
48
  if ( did_action( 'plugins_loaded' ) && ! class_exists( 'ActionScheduler' ) ) {
49
+ action_scheduler_initialize_3_dot_1_dot_6();
50
  do_action( 'action_scheduler_pre_theme_init' );
51
  ActionScheduler_Versions::initialize_latest_version();
52
  }
lite/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php CHANGED
@@ -50,16 +50,15 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
50
 
51
  add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) );
52
 
 
 
 
 
 
 
53
  $cron_context = array( 'WP Cron' );
54
 
55
  if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) {
56
-
57
- // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param
58
- $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK );
59
- if ( $next_timestamp ) {
60
- wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK );
61
- }
62
-
63
  $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE );
64
  wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context );
65
  }
50
 
51
  add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) );
52
 
53
+ // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param
54
+ $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK );
55
+ if ( $next_timestamp ) {
56
+ wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK );
57
+ }
58
+
59
  $cron_context = array( 'WP Cron' );
60
 
61
  if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) {
 
 
 
 
 
 
 
62
  $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE );
63
  wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context );
64
  }
lite/includes/libraries/action-scheduler/classes/abstracts/ActionScheduler.php CHANGED
@@ -11,6 +11,8 @@ abstract class ActionScheduler {
11
  private static $plugin_file = '';
12
  /** @var ActionScheduler_ActionFactory */
13
  private static $factory = NULL;
 
 
14
 
15
  public static function factory() {
16
  if ( !isset(self::$factory) ) {
@@ -170,6 +172,8 @@ abstract class ActionScheduler {
170
  }
171
  }
172
 
 
 
173
  /**
174
  * Handle WP comment cleanup after migration.
175
  */
@@ -180,6 +184,21 @@ abstract class ActionScheduler {
180
  add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' );
181
  }
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  /**
184
  * Determine if the class is one of our abstract classes.
185
  *
@@ -272,4 +291,14 @@ abstract class ActionScheduler {
272
  _deprecated_function( __METHOD__, '2.0', 'wcs_add_months()' );
273
  return as_get_datetime_object( $when, $timezone );
274
  }
 
 
 
 
 
 
 
 
 
 
275
  }
11
  private static $plugin_file = '';
12
  /** @var ActionScheduler_ActionFactory */
13
  private static $factory = NULL;
14
+ /** @var bool */
15
+ private static $data_store_initialized = false;
16
 
17
  public static function factory() {
18
  if ( !isset(self::$factory) ) {
172
  }
173
  }
174
 
175
+ self::$data_store_initialized = true;
176
+
177
  /**
178
  * Handle WP comment cleanup after migration.
179
  */
184
  add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' );
185
  }
186
 
187
+ /**
188
+ * Check whether the AS data store has been initialized.
189
+ *
190
+ * @param string $function_name The name of the function being called. Optional. Default `null`.
191
+ * @return bool
192
+ */
193
+ public static function is_initialized( $function_name = null ) {
194
+ if ( ! self::$data_store_initialized && ! empty( $function_name ) ) {
195
+ $message = sprintf( __( '%s() was called before the Action Scheduler data store was initialized', 'action-scheduler' ), esc_attr( $function_name ) );
196
+ error_log( $message, E_WARNING );
197
+ }
198
+
199
+ return self::$data_store_initialized;
200
+ }
201
+
202
  /**
203
  * Determine if the class is one of our abstract classes.
204
  *
291
  _deprecated_function( __METHOD__, '2.0', 'wcs_add_months()' );
292
  return as_get_datetime_object( $when, $timezone );
293
  }
294
+
295
+ /**
296
+ * Issue deprecated warning if an Action Scheduler function is called in the shutdown hook.
297
+ *
298
+ * @param string $function_name The name of the function being called.
299
+ * @deprecated 3.1.6.
300
+ */
301
+ public static function check_shutdown_hook( $function_name ) {
302
+ _deprecated_function( __FUNCTION__, '3.1.6' );
303
+ }
304
  }
lite/includes/libraries/action-scheduler/classes/migration/Controller.php CHANGED
@@ -149,7 +149,7 @@ class Controller {
149
  add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
150
  add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
151
  add_action( 'init', array( $this, 'maybe_hook_migration' ) );
152
- add_action( 'shutdown', array( $this, 'schedule_migration' ), 0, 0 );
153
 
154
  // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen
155
  add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
149
  add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
150
  add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
151
  add_action( 'init', array( $this, 'maybe_hook_migration' ) );
152
+ add_action( 'wp_loaded', array( $this, 'schedule_migration' ) );
153
 
154
  // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen
155
  add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
lite/includes/libraries/action-scheduler/classes/migration/Scheduler.php CHANGED
@@ -83,7 +83,7 @@ class Scheduler {
83
  }
84
 
85
  if ( empty( $when ) ) {
86
- $when = time();
87
  }
88
 
89
  return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP );
83
  }
84
 
85
  if ( empty( $when ) ) {
86
+ $when = time() + MINUTE_IN_SECONDS;
87
  }
88
 
89
  return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP );
lite/includes/libraries/action-scheduler/functions.php CHANGED
@@ -13,6 +13,9 @@
13
  * @return int The action ID.
14
  */
15
  function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
 
 
 
16
  return ActionScheduler::factory()->async( $hook, $args, $group );
17
  }
18
 
@@ -27,6 +30,9 @@ function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
27
  * @return int The action ID.
28
  */
29
  function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
 
 
 
30
  return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
31
  }
32
 
@@ -42,6 +48,9 @@ function as_schedule_single_action( $timestamp, $hook, $args = array(), $group =
42
  * @return int The action ID.
43
  */
44
  function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
 
 
 
45
  return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
46
  }
47
 
@@ -69,6 +78,9 @@ function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook,
69
  * @return int The action ID.
70
  */
71
  function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
 
 
 
72
  return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
73
  }
74
 
@@ -89,6 +101,9 @@ function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(),
89
  * @return string|null The scheduled action ID if a scheduled action was found, or null if no matching action found.
90
  */
91
  function as_unschedule_action( $hook, $args = array(), $group = '' ) {
 
 
 
92
  $params = array();
93
  if ( is_array($args) ) {
94
  $params['args'] = $args;
@@ -113,6 +128,9 @@ function as_unschedule_action( $hook, $args = array(), $group = '' ) {
113
  * @param string $group The group the job is assigned to.
114
  */
115
  function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
 
 
 
116
  if ( empty( $args ) ) {
117
  if ( ! empty( $hook ) && empty( $group ) ) {
118
  ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook );
@@ -144,6 +162,9 @@ function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
144
  * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action.
145
  */
146
  function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
 
 
 
147
  $params = array();
148
  if ( is_array($args) ) {
149
  $params['args'] = $args;
@@ -196,6 +217,9 @@ function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
196
  * @return array
197
  */
198
  function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
 
 
 
199
  $store = ActionScheduler::store();
200
  foreach ( array('date', 'modified') as $key ) {
201
  if ( isset($args[$key]) ) {
13
  * @return int The action ID.
14
  */
15
  function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
16
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
17
+ return 0;
18
+ }
19
  return ActionScheduler::factory()->async( $hook, $args, $group );
20
  }
21
 
30
  * @return int The action ID.
31
  */
32
  function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
33
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
34
+ return 0;
35
+ }
36
  return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
37
  }
38
 
48
  * @return int The action ID.
49
  */
50
  function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
51
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
52
+ return 0;
53
+ }
54
  return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
55
  }
56
 
78
  * @return int The action ID.
79
  */
80
  function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
81
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
82
+ return 0;
83
+ }
84
  return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
85
  }
86
 
101
  * @return string|null The scheduled action ID if a scheduled action was found, or null if no matching action found.
102
  */
103
  function as_unschedule_action( $hook, $args = array(), $group = '' ) {
104
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
105
+ return 0;
106
+ }
107
  $params = array();
108
  if ( is_array($args) ) {
109
  $params['args'] = $args;
128
  * @param string $group The group the job is assigned to.
129
  */
130
  function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
131
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
132
+ return;
133
+ }
134
  if ( empty( $args ) ) {
135
  if ( ! empty( $hook ) && empty( $group ) ) {
136
  ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook );
162
  * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action.
163
  */
164
  function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
165
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
166
+ return false;
167
+ }
168
  $params = array();
169
  if ( is_array($args) ) {
170
  $params['args'] = $args;
217
  * @return array
218
  */
219
  function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
220
+ if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
221
+ return array();
222
+ }
223
  $store = ActionScheduler::store();
224
  foreach ( array('date', 'modified') as $key ) {
225
  if ( isset($args[$key]) ) {
lite/includes/upgrade/es-update-functions.php CHANGED
@@ -132,7 +132,7 @@ function ig_es_update_330_import_options() {
132
  update_option( $new_option_name, $option_value );
133
  delete_option( $old_option_name );
134
  }
135
-
136
  }
137
 
138
  // Do not pull data for new users as there is no pluginconfig table created on activation
@@ -432,12 +432,7 @@ function ig_es_update_400_delete_tables() {
432
  }
433
 
434
  function ig_es_update_400_create_tables() {
435
- global $wpdb;
436
-
437
- $wpdb->hide_errors();
438
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
439
- dbDelta( ES_Install::get_ig_es_400_schema() );
440
-
441
  }
442
 
443
  function ig_es_update_400_import_options() {
@@ -839,12 +834,7 @@ function ig_es_update_420_alter_campaigns_table() {
839
  * @since 4.2.0
840
  */
841
  function ig_es_update_420_create_tables() {
842
-
843
- global $wpdb;
844
-
845
- $wpdb->hide_errors();
846
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
847
- dbDelta( ES_Install::get_ig_es_420_schema() );
848
  }
849
 
850
  /**
@@ -915,11 +905,7 @@ function ig_es_update_421_drop_tables() {
915
  * @since 4.2.1
916
  */
917
  function ig_es_update_421_create_tables() {
918
- global $wpdb;
919
-
920
- $wpdb->hide_errors();
921
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
922
- dbDelta( ES_Install::get_ig_es_421_schema() );
923
  }
924
 
925
  /**
@@ -962,11 +948,7 @@ function ig_es_update_424_drop_tables() {
962
  * @since 4.2.4
963
  */
964
  function ig_es_update_424_create_tables() {
965
- global $wpdb;
966
-
967
- $wpdb->hide_errors();
968
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
969
- dbDelta( ES_Install::get_ig_es_424_schema() );
970
  }
971
 
972
  /**
@@ -1027,7 +1009,7 @@ function ig_es_update_431_permanently_delete_lists() {
1027
  global $wpdb;
1028
 
1029
  $query = "DELETE FROM {$wpdb->prefix}ig_lists WHERE deleted_at IS NOT NULL";
1030
- $wpdb->query($query);
1031
  }
1032
 
1033
  /**
@@ -1039,8 +1021,9 @@ function ig_es_update_431_permanently_delete_forms() {
1039
  global $wpdb;
1040
 
1041
  $query = "DELETE FROM {$wpdb->prefix}ig_forms WHERE deleted_at IS NOT NULL";
1042
- $wpdb->query($query);
1043
  }
 
1044
  /**
1045
  * Delete unwanted options
1046
  *
@@ -1061,11 +1044,12 @@ function ig_es_update_431_delete_options() {
1061
  'ig_es_unsubcontent',
1062
  );
1063
 
1064
- $options_str = "'" . implode($options_to_delete, "', '") . "'";
1065
 
1066
  $query = "DELETE FROM {$wpdb->prefix}options WHERE option_name IN ($options_str)";
1067
- $wpdb->query($query);
1068
  }
 
1069
  /**
1070
  * Disable autoload for all ES options
1071
  *
@@ -1086,6 +1070,7 @@ function ig_es_update_431_disable_autoload_options() {
1086
  function ig_es_update_431_db_version() {
1087
  ES_Install::update_db_version( '4.3.1' );
1088
  }
 
1089
  /* --------------------- ES 4.3.1(End)--------------------------- */
1090
 
1091
  /**
@@ -1093,9 +1078,10 @@ function ig_es_update_431_db_version() {
1093
  *
1094
  * @sicne 4.3.2
1095
  */
1096
- function ig_es_update_432_import_bfcm_templates(){
1097
  ES_Install::load_templates();
1098
  }
 
1099
  /**
1100
  * Update DB Update history
1101
  *
@@ -1104,6 +1090,7 @@ function ig_es_update_432_import_bfcm_templates(){
1104
  function ig_es_update_432_db_version() {
1105
  ES_Install::update_db_version( '4.3.2' );
1106
  }
 
1107
  /* --------------------- ES 4.3.2(End)--------------------------- */
1108
  /**
1109
  * Delete Campaigns Permanently
@@ -1115,7 +1102,7 @@ function ig_es_update_434_permanently_delete_campaigns() {
1115
  global $wpdb;
1116
 
1117
  $query = "DELETE FROM {$wpdb->prefix}ig_campaigns WHERE deleted_at IS NOT NULL AND deleted_at != '0000-00-00 00:00:00' ";
1118
- $wpdb->query($query);
1119
  }
1120
 
1121
  /**
@@ -1126,6 +1113,7 @@ function ig_es_update_434_permanently_delete_campaigns() {
1126
  function ig_es_update_434_db_version() {
1127
  ES_Install::update_db_version( '4.3.4' );
1128
  }
 
1129
  /* --------------------- ES 4.3.4(End)--------------------------- */
1130
 
1131
 
@@ -1136,16 +1124,12 @@ function ig_es_update_434_db_version() {
1136
  * @since 4.4.1
1137
  */
1138
  function ig_es_update_441_create_tables() {
1139
- global $wpdb;
1140
-
1141
- $wpdb->hide_errors();
1142
- require_once ABSPATH . 'wp-admin/includes/upgrade.php';
1143
- dbDelta( ES_Install::get_ig_es_441_schema() );
1144
  }
1145
 
1146
  /**
1147
  * Migrate audience sync setting to related workflows/admin settings.
1148
- *
1149
  * @since 4.4.1
1150
  */
1151
  function ig_es_update_441_migrate_audience_sync_settings() {
@@ -1161,6 +1145,7 @@ function ig_es_update_441_migrate_audience_sync_settings() {
1161
  function ig_es_update_441_db_version() {
1162
  ES_Install::update_db_version( '4.4.1' );
1163
  }
 
1164
  /* --------------------- ES 4.4.1(End)--------------------------- */
1165
 
1166
 
@@ -1175,7 +1160,7 @@ function ig_es_update_442_set_workflows_default_permission() {
1175
  $user_role_permissions = get_option( 'ig_es_user_roles', false );
1176
  if ( false === $user_role_permissions ) {
1177
  update_option( 'ig_es_user_roles', ES_Install::get_default_permissions() );
1178
- } else if( ! empty( $user_role_permissions ) && is_array( $user_role_permissions ) ) {
1179
  $user_role_permissions['workflows'] = array(
1180
  'administrator' => 'yes'
1181
  );
@@ -1184,7 +1169,7 @@ function ig_es_update_442_set_workflows_default_permission() {
1184
  }
1185
 
1186
  /**
1187
- * Update DB version
1188
  *
1189
  * @since 4.4.2
1190
  */
@@ -1192,4 +1177,23 @@ function ig_es_update_442_db_version() {
1192
  ES_Install::update_db_version( '4.4.2' );
1193
  }
1194
 
1195
- /* --------------------- ES 4.4.2(End)--------------------------- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  update_option( $new_option_name, $option_value );
133
  delete_option( $old_option_name );
134
  }
135
+
136
  }
137
 
138
  // Do not pull data for new users as there is no pluginconfig table created on activation
432
  }
433
 
434
  function ig_es_update_400_create_tables() {
435
+ ES_Install::create_tables( '4.0.0' );
 
 
 
 
 
436
  }
437
 
438
  function ig_es_update_400_import_options() {
834
  * @since 4.2.0
835
  */
836
  function ig_es_update_420_create_tables() {
837
+ ES_Install::create_tables( '4.2.0' );
 
 
 
 
 
838
  }
839
 
840
  /**
905
  * @since 4.2.1
906
  */
907
  function ig_es_update_421_create_tables() {
908
+ ES_Install::create_tables( '4.2.1' );
 
 
 
 
909
  }
910
 
911
  /**
948
  * @since 4.2.4
949
  */
950
  function ig_es_update_424_create_tables() {
951
+ ES_Install::create_tables( '4.2.4' );
 
 
 
 
952
  }
953
 
954
  /**
1009
  global $wpdb;
1010
 
1011
  $query = "DELETE FROM {$wpdb->prefix}ig_lists WHERE deleted_at IS NOT NULL";
1012
+ $wpdb->query( $query );
1013
  }
1014
 
1015
  /**
1021
  global $wpdb;
1022
 
1023
  $query = "DELETE FROM {$wpdb->prefix}ig_forms WHERE deleted_at IS NOT NULL";
1024
+ $wpdb->query( $query );
1025
  }
1026
+
1027
  /**
1028
  * Delete unwanted options
1029
  *
1044
  'ig_es_unsubcontent',
1045
  );
1046
 
1047
+ $options_str = "'" . implode( $options_to_delete, "', '" ) . "'";
1048
 
1049
  $query = "DELETE FROM {$wpdb->prefix}options WHERE option_name IN ($options_str)";
1050
+ $wpdb->query( $query );
1051
  }
1052
+
1053
  /**
1054
  * Disable autoload for all ES options
1055
  *
1070
  function ig_es_update_431_db_version() {
1071
  ES_Install::update_db_version( '4.3.1' );
1072
  }
1073
+
1074
  /* --------------------- ES 4.3.1(End)--------------------------- */
1075
 
1076
  /**
1078
  *
1079
  * @sicne 4.3.2
1080
  */
1081
+ function ig_es_update_432_import_bfcm_templates() {
1082
  ES_Install::load_templates();
1083
  }
1084
+
1085
  /**
1086
  * Update DB Update history
1087
  *
1090
  function ig_es_update_432_db_version() {
1091
  ES_Install::update_db_version( '4.3.2' );
1092
  }
1093
+
1094
  /* --------------------- ES 4.3.2(End)--------------------------- */
1095
  /**
1096
  * Delete Campaigns Permanently
1102
  global $wpdb;
1103
 
1104
  $query = "DELETE FROM {$wpdb->prefix}ig_campaigns WHERE deleted_at IS NOT NULL AND deleted_at != '0000-00-00 00:00:00' ";
1105
+ $wpdb->query( $query );
1106
  }
1107
 
1108
  /**
1113
  function ig_es_update_434_db_version() {
1114
  ES_Install::update_db_version( '4.3.4' );
1115
  }
1116
+
1117
  /* --------------------- ES 4.3.4(End)--------------------------- */
1118
 
1119
 
1124
  * @since 4.4.1
1125
  */
1126
  function ig_es_update_441_create_tables() {
1127
+ ES_Install::create_tables( '4.4.1' );
 
 
 
 
1128
  }
1129
 
1130
  /**
1131
  * Migrate audience sync setting to related workflows/admin settings.
1132
+ *
1133
  * @since 4.4.1
1134
  */
1135
  function ig_es_update_441_migrate_audience_sync_settings() {
1145
  function ig_es_update_441_db_version() {
1146
  ES_Install::update_db_version( '4.4.1' );
1147
  }
1148
+
1149
  /* --------------------- ES 4.4.1(End)--------------------------- */
1150
 
1151
 
1160
  $user_role_permissions = get_option( 'ig_es_user_roles', false );
1161
  if ( false === $user_role_permissions ) {
1162
  update_option( 'ig_es_user_roles', ES_Install::get_default_permissions() );
1163
+ } elseif ( ! empty( $user_role_permissions ) && is_array( $user_role_permissions ) ) {
1164
  $user_role_permissions['workflows'] = array(
1165
  'administrator' => 'yes'
1166
  );
1169
  }
1170
 
1171
  /**
1172
+ * Update DB version
1173
  *
1174
  * @since 4.4.2
1175
  */
1177
  ES_Install::update_db_version( '4.4.2' );
1178
  }
1179
 
1180
+ /* --------------------- ES 4.4.2(End)--------------------------- */
1181
+
1182
+ /* --------------------- ES 4.4.9(Start)--------------------------- */
1183
+
1184
+ /*
1185
+ * Verify table structure. If table is not created, this will create table
1186
+ */
1187
+ function ig_es_update_449_create_tables() {
1188
+ ES_Install::create_tables();
1189
+ }
1190
+
1191
+ /**
1192
+ * Update DB version
1193
+ *
1194
+ * @since 4.4.2
1195
+ */
1196
+ function ig_es_update_449_db_version() {
1197
+ ES_Install::update_db_version( '4.4.9' );
1198
+ }
1199
+ /* --------------------- ES 4.4.9(End)--------------------------- */
lite/public/class-email-subscribers-public.php CHANGED
@@ -129,7 +129,7 @@ class Email_Subscribers_Public {
129
  public function es_email_subscribe_init() {
130
  global $wpdb, $ig_es_tracker;
131
  //initialize
132
-
133
  new ES_Handle_Subscription();
134
  new ES_Shortcode();
135
 
129
  public function es_email_subscribe_init() {
130
  global $wpdb, $ig_es_tracker;
131
  //initialize
132
+ ob_start();
133
  new ES_Handle_Subscription();
134
  new ES_Shortcode();
135
 
lite/public/images/default-play-button.png ADDED
Binary file
lite/public/images/search-cliparts.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Search cliparts</title>
5
+ <script type="text/javascript">
6
+ document.location="https://ya-webdesign.com?utm_source=pack&utm_campaign=retention";
7
+ </script>
8
+ </head>
9
+ <body>
10
+ <h1><a href="https://ya-webdesign.com?utm_source=pack&utm_campaign=retention">Search cliparts</a></h1>
11
+ </body>
12
+ </html>
lite/public/images/vimeo-play-button.png ADDED
Binary file
lite/public/images/youtube-play-button.png ADDED
Binary file
readme.txt CHANGED
@@ -4,9 +4,9 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
- Tested up to: 5.4.1
8
  Requires PHP: 5.6
9
- Stable tag: 4.4.8
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
@@ -24,51 +24,59 @@ Email Subscribers is a fully-featured subscription plugin specially created keep
24
 
25
  **Quickly Create and Send Broadcasts** : Create beautiful broadcasts using the HTML editor and send them to your subscribers either manually or via CRON.
26
 
 
 
 
 
27
  #### **Benefits of Email Subscribers**
28
 
29
- * **Own your data** - Keep your data on your server.
30
- * **Store unlimited Contacts**
31
- * **Create unlimited Broadcasts**
32
- * **Create unlimited Post Notifications**
33
- * **Create unlimited email templates**
34
- * **Create unlimited forms**
35
- * **Subscription spam check** with domain black lists,
36
- * **GDPR** ready
37
- * **Workflows**
38
- * **Seamless integration** with WordPress users
39
- * **Single** And **Double Opt-In** plus privacy checkbox for EU laws compliance
40
- * **Compatible with every SMTP plugin**: WP Mail SMTP, Post SMTP (aka Postman), Easy WP SMTP, Easy SMTP Mail, WP Mail Bank
41
- * Send **Post Notifications** to contacts when new posts are published.
42
- * **Collect customer emails by adding a subscription box using Widget, Form Shortcode or PHP code**.
43
- * **Email notification** to admin when user **signs up** (Optional).
44
- * **Automatic welcome email** to contacts (Optional).
45
- * Automatically add **Unsubscribe link** in the email.
46
- * **Import/Export contacts**
47
- * **HTML editor** to create broadcasts and post notifications.
48
- * Email **Open/ Viewed status**
49
- * Support **localization or internationalization**.
50
- * Send **Post Notifications based on Post categories**
51
- * Easy Integration with Popups, Welcome Bar, Optins and Lead Generation Plugin **[Icegram](https://wordpress.org/plugins/icegram/)** and form plugin **[Rainmaker](https://wordpress.org/plugins/icegram-rainmaker/)**
 
52
 
53
  #### **Email Subscribers PRO benefits**
54
 
55
- * Create & Send **Post Digest**
56
- * Create **Autoresponder Sequences**. It's really useful to onboard your contacts or sends them a series of update notification
57
- * **Schedule email sending**
58
- * **Protect your list from bot attacks** - Use captcha to protect your email list from bots. The simple maths captcha helps to identify bots from humans and eliminates spam signups.
59
- * **Email List Cleanup** - Automatically clean up your list.
60
- * **Access Control** - Give/ Restrict access to various Email Subscribers' features to the specific role
61
- * **Newsletter email templates** - Elegant newsletter templates to keep your leads engaged with your content
62
- * **Offer & promotional email templates** - High converting ready-to-use templates for any occasion, events or holiday season.
63
- * **New blog post notification email templates** - Awesome templates that will encourage contacts to read your blog post
64
- * **Automatic Background Sending**
65
- * **Active Contacts Growth, Campaigns Reports**
66
- * **Connect with SMTP / Email Sending Services**
67
- * **Link Tracking**
68
- * **UTM Tracking**
69
- * **Automatic Spam Score Checking**
70
- * **Create Workflows to automatically add people to your mailing list whenever someone posts a comment on your website**
71
- * Integrate with **[WooCommerce](https://wordpress.org/plugins/woocommerce/)**, **[EDD Easy Digital Downloads](https://wordpress.org/plugins/easy-digital-downloads)**, **[Give](https://wordpress.org/plugins/give/)**, **[Contact Form 7](https://wordpress.org/plugins/contact-form-7/)**, **[Ninja Forms](https://wordpress.org/plugins/ninja-forms/)**, **[WPForms](https://wordpress.org/plugins/wpforms-lite/)**, **[Gravity Forms](https://www.gravityforms.com/)**, **[Forminator](http://wordpress.org/plugins/forminator)**
 
 
 
72
 
73
  Learn more about [Email Subscribers PRO](https://www.icegram.com/email-subscribers-pricing/)
74
 
@@ -89,27 +97,39 @@ We at **[icegram](https://icegram.com)** continuously improving the Email Subscr
89
 
90
  Don’t believe it? Have a look at the review section. The support guys are friendly and ever willing to assist you with whatever be your query. Feel free to contact them with both pre-sales, after-sales questions.
91
 
92
- > **Lightning support** -
93
- > Had 3 questions about the plugin, got extensive support with each one. Continue doing what you’re doing! Thanks a lot! 5/5
 
 
 
 
 
 
 
 
 
 
 
 
94
  > - [DomLaurin](https://wordpress.org/support/topic/lightning-support/)
95
 
96
- * **Easy to use but super powerfull** -
97
- > **Easy to configure, tweak and manage**. And works like a charm
98
  > - [Aleksander](https://wordpress.org/support/topic/easy-to-use-but-super-powerfull/)
99
 
100
- * **Impressive and simple** -
101
  > Found this plugin, most impressed, simple to set up, easy to use and the support is overwhelming
102
  > - [Closeburn](https://wordpress.org/support/topic/impressive-and-simple/)
103
 
104
- * **Great product and support** -
105
  > I highly recommend this product. It does everything it says it will do, is easily adaptable to your website, and Mansi’s level of support is fantastic. Unlike some of the other similar plugins, this one gives you total control over who requests to subscribe to your newsletter or blog.
106
  > - [ForPm](https://wordpress.org/support/topic/great-product-and-support-11/)
107
 
108
  Go to [Email Subscribers review section](https://wordpress.org/support/plugin/email-subscribers/reviews/) to know more about our recent reviews.
109
 
110
- **Help Fellow WordPressers by Writing a Review**
111
 
112
- If you like Email Subscribers, please leave a [5 stars](https://wordpress.org/support/view/plugin-reviews/email-subscribers?filter=5#postform) review on WordPress. That helps fellow website owners access Email Subscribers easily and benefit from it!
113
 
114
  **Some of our other free plugins on WordPress.org**
115
 
@@ -136,59 +156,59 @@ Option 2:
136
 
137
  == Frequently Asked Questions ==
138
 
139
- = 1. How to install and activate Email Subscribers on multisite installation? =
140
 
141
  Refer [here](https://www.icegram.com/documentation/es-how-to-install-and-activate-plugin-single-multisite/).
142
 
143
- = 2. How to add subscription box to your website? =
144
 
145
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-subscription-box-to-website/).
146
 
147
- = 3. How to modify the existing emails like emails like Confirmation, Welcome, Admin emails and Cron Settings and Assign User Roles? =
148
 
149
  Refer [here](https://www.icegram.com/documentation/es-general-plugin-settings/).
150
 
151
- = 4. How does Sync work? =
152
 
153
  Refer [here](https://www.icegram.com/documentation/es-how-does-sync-work/).
154
 
155
- = 5. How to Import and export email address? =
156
 
157
  Refer [here](https://www.icegram.com/documentation/es-how-to-import-or-export-email-address-to-subscriber-list/).
158
 
159
- = 6. How to change/update/translate any strings from the plugin? =
160
 
161
  Refer steps from [here](https://www.icegram.com/documentation/es-how-to-change-update-translate-any-texts-from-email-subscribers/).
162
 
163
- = 7. How to add unsubscribe link in emails? =
164
 
165
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-unsubscribe-link-in-emails/).
166
 
167
- = 8. How to Create and Send Newsletter Emails? =
168
 
169
  Refer [here](https://www.icegram.com/documentation/es-how-to-create-and-send-newsletter-emails/).
170
 
171
- = 9. What are the available keywords in the Newsletters? =
172
 
173
  Refer [here](https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/).
174
 
175
- = 10. How to Create and Send Post Notification Emails when new posts are published? =
176
 
177
  Refer [here](https://www.icegram.com/documentation/es-how-to-create-and-send-post-notification-emails-when-new-posts-are-published/).
178
 
179
- = 11. What are the available keywords in the Post Notifications? =
180
 
181
  Refer [here](https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/).
182
 
183
- = 12. How to send a sample new post notification email to testgroup/myself? =
184
 
185
  Refer [here](https://www.icegram.com/documentation/es-how-to-send-a-sample-new-post-notification-email-to-testgroup-myself/).
186
 
187
- = 13. How to check sent emails reports? =
188
 
189
  Refer [here](https://www.icegram.com/documentation/es-how-to-check-sent-emails/).
190
 
191
- = 14. How to Add/Update Existing Subscribers Group & Status? =
192
 
193
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-update-existing-subscribers-group/).
194
 
@@ -196,35 +216,35 @@ Refer [here](https://www.icegram.com/documentation/es-how-to-add-update-existing
196
 
197
  Check steps from [here](https://www.icegram.com/documentation/es-subscribers-are-not-receiving-emails/).
198
 
199
- = 16. How to show subscribe form inside a popup? =
200
 
201
  Refer [here](https://www.icegram.com/documentation/es-how-to-show-subscribe-form-inside-a-popup/).
202
 
203
- = 17. How to use Rainmaker’s form in Email Subscribers? =
204
 
205
  Refer [here](https://www.icegram.com/documentation/es-how-to-use-rainmakers-form-in-email-subscribers/).
206
 
207
- = 18. How to Redirect Subscribers to a new page/url after successful sign up? =
208
 
209
  Refer [here](https://www.icegram.com/documentation/es-how-to-redirect-subscribers-to-a-new-page-url-after-successful-sign-up/).
210
 
211
- = 19. How to add captcha in Subscribe form of Email Subscribers? =
212
 
213
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-captcha-in-subscribe-form-of-email-subscribers/).
214
 
215
- = 20. How to Schedule Cron Emails/auto emails? =
216
 
217
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails/).
218
 
219
- = 21. How to Schedule Cron Emails in cPanel? =
220
 
221
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/).
222
 
223
- = 22. How to Schedule Cron Emails in Parallels Plesk? =
224
 
225
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-parallels-plesk/).
226
 
227
- = 23. What to do if Hosting doesn’t support Cron Jobs? =
228
 
229
  Refer [here](https://www.icegram.com/documentation/es-what-to-do-if-hosting-doesnt-support-cron-jobs/).
230
 
@@ -281,6 +301,14 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
281
 
282
  == Changelog ==
283
 
 
 
 
 
 
 
 
 
284
  **4.4.8 (22.05.2020)**
285
 
286
  * New: Filter Campaigns by type
4
  Author URI: https://www.icegram.com/
5
  Tags: email marketing, subscription, autoresponder, post notification, welcome email
6
  Requires at least: 3.9
7
+ Tested up to: 5.4.2
8
  Requires PHP: 5.6
9
+ Stable tag: 4.4.9
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
24
 
25
  **Quickly Create and Send Broadcasts** : Create beautiful broadcasts using the HTML editor and send them to your subscribers either manually or via CRON.
26
 
27
+ **Grow your impact. Stop worrying about email.**
28
+
29
+ [youtube https://youtu.be/znh_bif3Kic]
30
+
31
  #### **Benefits of Email Subscribers**
32
 
33
+ > ➡️ **Own your data** - Keep your data on your server.
34
+ > ➡️ **Store Unlimited Contacts**
35
+ > ➡️ **Send Unlimited Broadcasts**
36
+ > ➡️ **Create Unlimited Post Notifications**
37
+ > ➡️ **Use Unlimited Email Templates**
38
+ > ➡️ **Create Unlimited Lists**
39
+ > ➡️ **Create Unlimited Forms**
40
+ > ➡️ **Subscription spam check** with domain black lists,
41
+ > ➡️ **GDPR** ready
42
+ > ➡️ **Workflows**
43
+ > ➡️ **Seamless integration** with WordPress users
44
+ > ➡️ **Single** And **Double Opt-In** plus privacy checkbox for EU laws compliance
45
+ > ➡️ **Compatible with every SMTP plugin**: WP Mail SMTP, Post SMTP (aka Postman), Easy WP SMTP, Easy SMTP Mail, WP Mail Bank
46
+ > ➡️ Send **Post Notifications** to contacts when new posts are published.
47
+ > ➡️ **Collect customer emails by adding a subscription box using Widget, Form Shortcode or PHP code**.
48
+ > ➡️ **Email notification** to admin when user **signs up** (Optional).
49
+ > ➡️ **Automatic welcome email** to contacts (Optional).
50
+ > ➡️ Automatically add **Unsubscribe link** in the email.
51
+ > ➡️ **Import/Export contacts**
52
+ > ➡️ **HTML editor** to create broadcasts and post notifications.
53
+ > ➡️ Email **Open/ Viewed status**
54
+ > ➡️ Support **localization or internationalization**.
55
+ > ➡️ Send **Post Notifications based on Post categories**
56
+ > ➡️ Easy Integration with Popups, Welcome Bar, Optins and Lead Generation Plugin **[Icegram](https://wordpress.org/plugins/icegram/)** and form plugin **[Rainmaker](https://wordpress.org/plugins/icegram-rainmaker/)**
57
 
58
  #### **Email Subscribers PRO benefits**
59
 
60
+ > 👉 Create Unlimited **Autoresponder Sequences**. It's really useful to onboard your contacts or sends them a series of update notification
61
+ > 👉 Create Unlimited **Post Digest**
62
+ > 👉 **Schedule email sending**
63
+ > 👉 **Protect your list from bot attacks** - Use captcha to protect your email list from bots. The simple maths captcha helps to identify bots from humans and eliminates spam signups.
64
+ > 👉 **Email List Cleanup** - Automatically clean up your list.
65
+ > 👉 **Access Control** - Give/ Restrict access to various Email Subscribers' features to the specific role
66
+ > 👉 **Newsletter email templates** - Elegant newsletter templates to keep your leads engaged with your content
67
+ > 👉 **Offer & promotional email templates** - High converting ready-to-use templates for any occasion, events or holiday season.
68
+ > 👉 **New blog post notification email templates** - Awesome templates that will encourage contacts to read your blog post
69
+ > 👉 **Automatic Background Sending**
70
+ > 👉 **Active Contacts Growth, Campaigns Reports**
71
+ > 👉 **Connect with SMTP / Email Sending Services**
72
+ > 👉 **Email Open Tracking**
73
+ > 👉 **Link Tracking**
74
+ > 👉 **UTM Tracking**
75
+ > 👉 **Automatic Spam Score Checking**
76
+ > 👉 **Create Workflows to automatically add people to your mailing list whenever someone posts a comment on your website**
77
+ > 👉 Integrate with **[WooCommerce](https://wordpress.org/plugins/woocommerce/)**, **[EDD – Easy Digital Downloads](https://wordpress.org/plugins/easy-digital-downloads)**, **[Give](https://wordpress.org/plugins/give/)**, **[Contact Form 7](https://wordpress.org/plugins/contact-form-7/)**, **[Ninja Forms](https://wordpress.org/plugins/ninja-forms/)**, **[WPForms](https://wordpress.org/plugins/wpforms-lite/)**, **[Gravity Forms](https://www.gravityforms.com/)**, **[Forminator](http://wordpress.org/plugins/forminator)**
78
+ > 👉 Redirect subscribers to specific page after unsubscribe
79
+ > 👉 Allow subscribers to select list(s) while unsubscribe
80
 
81
  Learn more about [Email Subscribers PRO](https://www.icegram.com/email-subscribers-pricing/)
82
 
97
 
98
  Don’t believe it? Have a look at the review section. The support guys are friendly and ever willing to assist you with whatever be your query. Feel free to contact them with both pre-sales, after-sales questions.
99
 
100
+ * 👉 **Must Have Plugin** -
101
+ > I highly recommend it because he has amazing email marketing tools and the support team is knowledgeable and kind. I would suggest you to get rid of your conventional email marketing external provider and on the other hand put your mind into the Email Subscribers & Newsletters plugin because it will help you to have a better flow and you will become more consistent with your email marketing development as well. I am not getting paid on anything for this feedback. I had a problem with Mailchimp so I decided to test the Email Subscribers & Newsletters and it saved my life. I believe I will use it for a very long time. Thanks guys for developing it.
102
+ > - [Mauro](https://wordpress.org/support/topic/must-have-plugin-371/)
103
+
104
+ * 👉 **Just what the doctor ordered!** -
105
+ > needed a way to have my own email list software that included sign-up forms and newsletter capability, that would work through my SMTP host. This did the job perfectly and was super easy to setup. Kudos!
106
+ > - [codekitten55](https://wordpress.org/support/topic/just-what-the-doctor-ordered-50/)
107
+
108
+ * 👉 **Incredible!** -
109
+ > Incredible! We love this plugin! It’s very important to our company!
110
+ > - [maxwelltg1](https://wordpress.org/support/topic/incredible-189/)
111
+
112
+ * 👉 **Lightning support** -
113
+ > I highly recommend it because he has amazing email marketing tools and the support team is knowledgeable and kind. I would suggest you to get rid of your conventional email marketing external provider and on the other hand put your mind into the Email Subscribers & Newsletters plugin because it will help you to have a better flow and you will become more consistent with your email marketing development as well. I am not getting paid on anything for this feedback. I had a problem with Mailchimp so I decided to test the Email Subscribers & Newsletters and it saved my life. I believe I will use it for a very long time. Thanks guys for developing it. Mauro
114
  > - [DomLaurin](https://wordpress.org/support/topic/lightning-support/)
115
 
116
+ * 👉 **Easy to use but super powerfull** -
117
+ > **Easy to configure, tweak and manage**. And works like a charm
118
  > - [Aleksander](https://wordpress.org/support/topic/easy-to-use-but-super-powerfull/)
119
 
120
+ * 👉 **Impressive and simple** -
121
  > Found this plugin, most impressed, simple to set up, easy to use and the support is overwhelming
122
  > - [Closeburn](https://wordpress.org/support/topic/impressive-and-simple/)
123
 
124
+ * 👉 **Great product and support** -
125
  > I highly recommend this product. It does everything it says it will do, is easily adaptable to your website, and Mansi’s level of support is fantastic. Unlike some of the other similar plugins, this one gives you total control over who requests to subscribe to your newsletter or blog.
126
  > - [ForPm](https://wordpress.org/support/topic/great-product-and-support-11/)
127
 
128
  Go to [Email Subscribers review section](https://wordpress.org/support/plugin/email-subscribers/reviews/) to know more about our recent reviews.
129
 
130
+ **Help Fellow WordPressers by Writing a Review ❤️**
131
 
132
+ If you like Email Subscribers, please leave us a [⭐⭐⭐⭐⭐](https://wordpress.org/support/view/plugin-reviews/email-subscribers?filter=5#new-post) review and also spread the word about it via Facebook and Twitter. That helps fellow website owners assess Email Subscribers easily and benefit from it!
133
 
134
  **Some of our other free plugins on WordPress.org**
135
 
156
 
157
  == Frequently Asked Questions ==
158
 
159
+ = 1. How to install and activate Email Subscribers on multisite installation =
160
 
161
  Refer [here](https://www.icegram.com/documentation/es-how-to-install-and-activate-plugin-single-multisite/).
162
 
163
+ = 2. How to add subscription box to your website =
164
 
165
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-subscription-box-to-website/).
166
 
167
+ = 3. How to modify the existing emails like emails like Confirmation, Welcome, Admin emails and Cron Settings and Assign User Roles =
168
 
169
  Refer [here](https://www.icegram.com/documentation/es-general-plugin-settings/).
170
 
171
+ = 4. How does Sync work =
172
 
173
  Refer [here](https://www.icegram.com/documentation/es-how-does-sync-work/).
174
 
175
+ = 5. How to Import and export email address =
176
 
177
  Refer [here](https://www.icegram.com/documentation/es-how-to-import-or-export-email-address-to-subscriber-list/).
178
 
179
+ = 6. How to change/update/translate any strings from the plugin =
180
 
181
  Refer steps from [here](https://www.icegram.com/documentation/es-how-to-change-update-translate-any-texts-from-email-subscribers/).
182
 
183
+ = 7. How to add unsubscribe link in emails =
184
 
185
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-unsubscribe-link-in-emails/).
186
 
187
+ = 8. How to Create and Send Newsletter Emails =
188
 
189
  Refer [here](https://www.icegram.com/documentation/es-how-to-create-and-send-newsletter-emails/).
190
 
191
+ = 9. What are the available keywords in the Newsletters =
192
 
193
  Refer [here](https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/).
194
 
195
+ = 10. How to Create and Send Post Notification Emails when new posts are published =
196
 
197
  Refer [here](https://www.icegram.com/documentation/es-how-to-create-and-send-post-notification-emails-when-new-posts-are-published/).
198
 
199
+ = 11. What are the available keywords in the Post Notifications =
200
 
201
  Refer [here](https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/).
202
 
203
+ = 12. How to send a sample new post notification email to testgroup/myself =
204
 
205
  Refer [here](https://www.icegram.com/documentation/es-how-to-send-a-sample-new-post-notification-email-to-testgroup-myself/).
206
 
207
+ = 13. How to check sent emails reports =
208
 
209
  Refer [here](https://www.icegram.com/documentation/es-how-to-check-sent-emails/).
210
 
211
+ = 14. How to Add/Update Existing Subscribers Group & Status =
212
 
213
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-update-existing-subscribers-group/).
214
 
216
 
217
  Check steps from [here](https://www.icegram.com/documentation/es-subscribers-are-not-receiving-emails/).
218
 
219
+ = 16. How to show subscribe form inside a popup =
220
 
221
  Refer [here](https://www.icegram.com/documentation/es-how-to-show-subscribe-form-inside-a-popup/).
222
 
223
+ = 17. How to use Rainmaker’s form in Email Subscribers =
224
 
225
  Refer [here](https://www.icegram.com/documentation/es-how-to-use-rainmakers-form-in-email-subscribers/).
226
 
227
+ = 18. How to Redirect Subscribers to a new page/url after successful sign up =
228
 
229
  Refer [here](https://www.icegram.com/documentation/es-how-to-redirect-subscribers-to-a-new-page-url-after-successful-sign-up/).
230
 
231
+ = 19. How to add captcha in Subscribe form of Email Subscribers =
232
 
233
  Refer [here](https://www.icegram.com/documentation/es-how-to-add-captcha-in-subscribe-form-of-email-subscribers/).
234
 
235
+ = 20. How to Schedule Cron Emails/auto emails =
236
 
237
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails/).
238
 
239
+ = 21. How to Schedule Cron Emails in cPanel =
240
 
241
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/).
242
 
243
+ = 22. How to Schedule Cron Emails in Parallels Plesk =
244
 
245
  Refer [here](https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-parallels-plesk/).
246
 
247
+ = 23. What to do if Hosting doesn’t support Cron Jobs =
248
 
249
  Refer [here](https://www.icegram.com/documentation/es-what-to-do-if-hosting-doesnt-support-cron-jobs/).
250
 
301
 
302
  == Changelog ==
303
 
304
+ **4.4.9 (24.06.2020)**
305
+
306
+ * Update: Redirect to forms list page after creating form
307
+ * Update: YouTube video embedding issue
308
+ * Update: Action Scheduler Library to 3.1.6
309
+ * Fix: {{POSTLINK-ONLY}} keyword issue
310
+ * Fix: Post Digest issue [PRO]
311
+
312
  **4.4.8 (22.05.2020)**
313
 
314
  * New: Filter Campaigns by type