Version Description
- Added 3 months option for inactive subscriber selection
- Improved the add-ons classes
- Improved admin messages for multilanguage blogs
- Updated link to documentation on main settings
- Added VK and Telegram socials
- Removed the old bounce import on subscribe maintenance panel
- Added Telegram and VK icon on social block component
Download this release
Release Info
Developer | satollo |
Plugin | Newsletter |
Version | 6.9.6 |
Comparing to | |
See all releases |
Code changes from version 6.9.5 to 6.9.6
- admin.css +5 -0
- admin.min.css +1 -1
- emails/blocks/posts/block.php +2 -0
- emails/blocks/posts/layout-big-image.php +1 -1
- emails/blocks/posts/layout-one.php +1 -1
- emails/blocks/posts/layout-two.php +1 -0
- emails/blocks/social/block.php +17 -1
- emails/edit.php +7 -8
- emails/index.php +21 -8
- emails/themes/default/images/soundcloud.png +0 -0
- emails/themes/default/images/telegram.png +0 -0
- emails/themes/default/images/vk.png +0 -0
- emails/tnp-composer/index-v2.php +3 -1
- includes/addon.php +64 -10
- includes/composer.php +39 -6
- includes/controls.php +23 -0
- includes/mailer.php +1 -2
- includes/module.php +24 -17
- includes/paginator.php +147 -0
- main/defaults-info.php +3 -1
- main/defaults.php +4 -2
- main/info.php +13 -1
- main/main.php +48 -42
- plugin.php +2 -6
- profile/index.php +1 -3
- readme.txt +26 -4
- statistics/index.php +1 -1
- subscription/options.php +1 -1
- subscription/subscription.php +19 -16
- tnp-header.php +13 -6
- unsubscription/index.php +12 -4
- users/edit.php +2 -2
- users/massive.php +7 -80
admin.css
CHANGED
@@ -2460,3 +2460,8 @@ span.tnp-email-status-sent {
|
|
2460 |
.tab-min-height {
|
2461 |
min-height: 500px;
|
2462 |
}
|
|
|
|
|
|
|
|
|
|
2460 |
.tab-min-height {
|
2461 |
min-height: 500px;
|
2462 |
}
|
2463 |
+
|
2464 |
+
.tnp-control-all-languages-notice {
|
2465 |
+
padding: 15px;
|
2466 |
+
border: 1px dashed #999;
|
2467 |
+
}
|
admin.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
#tnp-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tnp-wrap .iris-picker,#tnp-wrap .iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#tnp-wrap *:before,#tnp-wrap *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}@media all and (max-width:1100px){.col-md-12{width:100%}.col-md-11{width:100%}.col-md-10{width:100%}.col-md-9{width:100%}.col-md-8{width:100%}.col-md-7{width:100%}.col-md-6{width:100%}.col-md-5{width:100%}.col-md-4{width:100%}.col-md-3{width:100%}.col-md-2{width:100%}.col-md-1{width:100%}}.tnp-row-padded{width:90%;margin:0 auto;display:flex;justify-content:space-between}.tnp-col-3-boxed{width:30%;border:1px solid #3c414c;padding:0 0 30px 0;border-radius:10px}.tnp-margin-top{margin-top:80px}#tnp-wrap,#tnp-header,#tnp-body p,#tnp-body td,#tnp-body td p,#tnp-body input,#tnp-body select,#tnp-body textarea{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-promotion-bar{background-color:#ff5f65;color:ddd;padding:10px 0;text-align:center;font-size:16px}#tnp-promotion-bar a{color:#fff;font-weight:normal;text-decoration:none}#tnp-header{text-align:left;font-size:12px;color:#fff;font-family:soleil,sans-serif}#tnp-header input{font-size:12px}#tnp-header a{text-decoration:none;color:white;letter-spacing:.1em}#tnp-header a:hover{color:#fff}.error a,.error a:hover{color:#000!important}.updated a,.updated a:hover{color:#000!important}.tnp-error{border-left:5px solid #d00;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-warning{border-left:5px solid #ffb900;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-message{border-left:5px solid #46b450;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4,#tnp-body p{color:#fff}#tnp-body a,#tnp-body a:active{color:#2980b9}#tnp-body a:hover{color:#3498db}#tnp-body .tnp-submit{margin-bottom:10px}#tnp-body .button,#tnp-body .button:visited,#tnp-body .button:hover,#tnp-body .button:active,#tnp-body .button:focus,#tnp-body .button-primary,#tnp-body .button-primary:visited,#tnp-body .button-primary:hover,#tnp-body .button-secondary,#tnp-body .button-secondary:visited,#tnp-body .button-secondary:hover{color:#fff;background-color:#3498db;text-shadow:none;width:auto}#tnp-body span.wp-media-buttons-icon:before{color:#fff}#tnp-body .tnp-button{color:#fff;background-color:#3498db;text-shadow:none}#tnp-body .button-primary.tnp-button-white,#tnp-body .tnp-button.tnp-button-white{color:#444!important;background-color:#fff!important;box-shadow:none!important;-webkit-box-shadow:none!important;width:auto}#tnp-body .form-table h1,#tnp-body .form-table h2,#tnp-body .form-table h4,#tnp-body .form-table h3{color:#444}#tnp-body tbody th,#tnp-body td,#tnp-body td p,#tnp-body td .button,#tnp-body td .button:visited,#tnp-body td .button:hover,#tnp-body td .button:active,#tnp-body td .button:focus{color:#444}#tnp-body td a,#tnp-body td a:visited{color:#27ae60}#tnp-body .form-table{background-color:#fff;border:1px solid #ecf0f1;margin-top:2em;border-spacing:4px;border-collapse:separate}#tnp-body .form-table th{text-align:right;font-weight:bold;max-width:200px;color:#000;background-color:#ecf0f1;vertical-align:middle}#tnp-body .form-table th small{font-weight:normal}#tnp-body .form-table textarea{width:100%}#tnp-body .form-table table{border-collapse:collapse}#tnp-body .form-table table td,.form-table table th{padding:5px;font-size:.9em;font-weight:normal;border:1px solid #eee}#tnp-body .form-table table thead th{text-align:left;font-weight:bold}#tnp-body .widefat{width:90%}#tnp-body .widefat th{text-align:left}#tnp-body .widefat thead{background-color:#3498db;font-family:soleil,sans-serif;color:#fff!important}#tnp-body .widefat thead tr th{color:#fff!important}#tnp-body .widefat td,.widefat th{vertical-align:middle}.tnp-newsletters-list tbody tr{height:70px}.widefat tr:nth-child(even){background-color:#f4faff}#tnp-body #tabs h1,#tnp-body #tabs h2,#tnp-body #tabs h3,#tnp-body #tabs h4,#tnp-body #tabs p,#tnp-body #tabs td,#tnp-body #tabs th,#tnp-body #tabs input,#tnp-body #tabs select,#tnp-body #tabs textarea,#tnp-body #tabs a{color:#444}#tnp-body #tabs .button,#tnp-body #tabs .button:visited,#tnp-body #tabs .button:hover,#tnp-body #tabs .button-primary,#tnp-body #tabs .button-primary:visited,#tnp-body #tabs .button-primary:hover,#tnp-body #tabs .button-secondary,#tnp-body #tabs .button-secondary:visited,#tnp-body #tabs .button-secondary:hover{color:#fff;width:auto}table.clicks td{border:1px solid #666;padding:2px;font-size:10px}table.clicks{border-collapse:collapse}.grid{border-collapse:collapse}.grid td,.grid th{padding:10px;border:1px solid #ddd;margin:0}.grid th{background-color:#aaa}.tnp-checkboxes label{display:block;float:left;width:220px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;margin-right:5px}.tnp-buttons{padding:10px}.newsletter-checkbox-group,.nl-checkbox-group{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item{float:left;margin-right:5px;border:1px solid #ddd;border-radius:3px;background-color:#f4f4f4;width:150px;margin-bottom:5px;padding:3px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item input{vertical-align:text-bottom}.newsletter-checkboxes-item label{display:inline}.newsletter-preferences-item{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;width:250px;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-preferences-item label{display:inline}.form-table td .nl-checkbox-group label{display:inline}.tnp-notice{padding:15px;margin:10px 0;padding-right:70px;position:relative;border:1px solid #eee;background-color:#fff;color:#444;font-size:13px;border-left:5px solid #27ae60}.tnp-notice a{color:#0073aa;text-decoration:none;font-weight:bold}.tnp-notice a.tnp-dismiss{display:block;position:absolute;right:10px;top:13px;font-size:25px;text-decoration:none;color:#666}.tnp-notice input[type=email]{margin:10px 5px 5px;width:250px;border:0;box-shadow:none;background-color:#ecf0f1;padding:8px}.tnp-notice input[type=submit]{border:0;box-shadow:none;background-color:#27ae60;padding:8px;font-family:soleil,sans-serif;font-size:13px;color:#fff;cursor:pointer}.newsletter-message{background-color:#efe;border-color:#393;border-radius:5px;border-style:solid;border-width:3px;padding:.6em;margin-bottom:.6em}.newsletter-error-span{color:#f00;font-weight:bold}.newsletter-error{background-color:#fee;border-color:#933;border-radius:5px;border-style:solid;border-width:2px;padding:.6em;margin-bottom:.6em}.newsletter-error strong,.newsletter-message strong{font-weight:bold}#newsletter-warnings{background-color:#ffebe8;border-color:#C00;border-radius:3px;border-style:solid;border-width:1px;padding:.6em;margin-bottom:.6em}.newsletter-buttons{margin-top:1em;margin-bottom:1em}.tnp-paginator{margin-top:10px;margin-bottom:5px}.newsletter-option-grid th{text-align:right;width:auto;border:0;padding:3px;font-weight:normal;vertical-align:top;padding-right:15px}.newsletter-option-grid td{border:0;padding:3px;vertical-align:top}.newsletter-box{border:1px solid #ddd;padding:10px;background-color:#fafafa;margin-bottom:15px}.newsletter-box h3{margin-top:0}.newsletter-textarea-preview{border:1px solid #ddd}.tnp-tab-notice{background-color:#fff;border:1px solid #eee;border-left:3px solid gray;padding:10px;margin:10px 0;color:#444}.tnp-tab-warning{background-color:#fff;border:1px solid #eee;border-left:3px solid orange;padding:10px;margin:10px 0;color:#444}.tnp-tab-success{background-color:#fff;border:1px solid #eee;border-left:3px solid green;padding:10px;margin:10px 0;color:#444}.tnp-tab-error{background-color:#fff;border:1px solid #eee;border-left:3px solid red;padding:10px;margin:10px 0;color:#444}.tnp-tip{margin-top:5px}.tip-button{padding:0 5px;color:#fd5f65;text-transform:uppercase;letter-spacing:.2em;font-size:10px;border:1px red solid}.tip-content{font-weight:500;font-size:11px;color:#999}p.description{font-size:12px!important}.tnp-theme-preview{display:inline-block;text-align:center}.tnp-theme-preview p{font-family:soleil;font-size:13px;letter-spacing:.2em;color:#fff}.tnp-theme-preview img:hover{box-shadow:3px 3px 8px 2px #293848}.tnp-theme-preview img{border-radius:10px;height:190px;width:auto}.tnp-theme-preview .tnp-theme-composer{height:250px;width:auto}.tnp-theme-preview .tnp-theme-html{height:250px;width:auto}.tnp-header-logo{margin-left:10px}.wp-core-ui .button-primary{background-color:#2b2f3a;color:#fff;width:auto}#tnp-body{padding:10px;background-color:#28313c}.tnp-darkbg{background-color:#34495e!important}#tnp-body h3{margin-top:25px;clear:both;margin-bottom:10px}.tnp-body-lite{background-color:#f1f1f1!important}#tnp-heading{padding:10px;margin-bottom:10px;border-radius:5px}#tnp-heading a{color:#fff;border-bottom:1px solid #fff;text-decoration:none}#tnp-heading a:hover{color:#27ae60;border-bottom:1px solid #27ae60}#tnp-heading div p{color:#565656}#tnp-heading h2{color:#fff;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:1.1rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0;margin-bottom:15px}#tnp-heading h3{color:#27ae60;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:.8rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0}#tnp-heading p{margin:0;color:#ccc}#tnp-heading .notice p{margin:.5em 0;padding:2px}#tnp-heading .tnp-btn-h1{color:#fff;background-color:#3498db;border-radius:3px;padding:6px 11px;text-decoration:none;text-transform:capitalize;font-family:soleil,sans-serif;margin-left:10px;font-size:.75rem;font-weight:300;border:0}#tnp-heading .tnp-btn-h1:hover{color:#fff;background-color:#5dade2;-webkit-transition:background-color .25s linear;transition:background-color .25s linear;-webkit-font-smoothing:subpixel-antialiased;border:0;color:#fff}.metabox-holder{width:100%}.postbox{border:0}.postbox h3 a{float:right}#dashboard-widgets .postbox-container{width:33.333%}#tnp-body .postbox p{color:#000}#dashboard-widgets .postbox-container .postbox h3{font-family:soleil,sans-serif;letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#dashboard-widgets .postbox-container h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem}#dashboard-widgets .postbox-container h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}.postbox-container i{margin-right:3px}#tnp-dash-newsletters tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:first-of-type{width:250px;overflow:hidden}#tnp-dash-subscribers table{table-layout:fixed}#tnp-dash-documentation .inside div{margin-top:10px}#tnp-dash-documentation .inside a{text-decoration:none;color:#fff;display:block;font-family:soleil,sans-serif;padding:5px 10px}#tnp-footer{margin-top:10px;padding:20px 10px 10px 40px;background-color:#28313c;font-family:soleil,sans-serif}#tnp-footer div{width:33%;display:inline-block}#tnp-footer a{color:#fff;text-decoration:none}#tnp-footer a:hover{color:#bdc3c7}#tnp-footer input[type="submit"]{background-color:#2ecc71;border:0;padding:5px;color:#fff}#tnp-footer form{white-space:nowrap}#tnp-footer li{display:inline;margin-left:15px;padding:2px 5px;border-left:3px solid #2ecc71}#wpwrap{background-color:#222b36!important}#dashboard-widgets .button{border:0;background:0;box-shadow:none;color:#322c39}#dashboard-widgets .button:hover{background-color:#ecf0f1}.wp-core-ui .button-secondary,.wp-core-ui .button-primary{background-color:#3498db;border:0;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px;width:auto}.wp-core-ui .button-secondary,.wp-core-ui .button,.wp-core-ui .button-primary{background-color:#3498db;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px}.wp-core-ui .button-secondary:hover,.wp-core-ui .button:hover,.wp-core-ui .button-primary:hover{background-color:#5dade2;color:#fff;width:auto}span.wp-media-buttons-icon:before{color:#fff}.tnp-paginator [value="Go"]{background-color:#27ae60}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71}.notice-dismiss{padding:3px}.tnp-paginator{color:#fff;font-family:soleil,sans-serif;margin:10px 0}.tnp-paginator .button-secondary{padding:5px;line-height:normal;height:auto;font-size:12px;height:25px;border:0;border-radius:3px;vertical-align:baseline}.tnp-paginator [value="Go"]{background-color:#27ae60!important}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71!important}.tnp-paginator input{background-color:#2c3e50;border:0;border-radius:3px;color:#fff;padding:5px;line-height:normal;font-size:12px;height:25px}.tnp-subscribers-search{color:#fff;font-family:soleil,sans-serif;background-color:#2c3e50;padding:20px;border-radius:5px;margin-bottom:20px;display:inline-block}.tnp-subscribers-search select{margin-left:5px;padding:0;line-height:inherit}.tnp-video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.tnp-video-container iframe,.tnp-video-container object,.tnp-video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.bg-white{background-color:#FFF}.orange{background-color:#f39c12}.blue{background-color:#2980b9}.purple{background-color:#8e44ad}.notice a{color:#27ae60!important;text-decoration:underline!important}.tnp-chart{border:1px solid #eee;width:100%}.tnp-db-table{width:auto;background-color:#fff}.tnp-db-table thead{border-bottom:1px solid #eee}.tnp-db-table th{font-weight:bold}.tnp-db-table td,.tnp-db-table th{padding:3px;font-family:monospace;border:0}.tnp-main-status h3,.tnp-main-status h4{color:#fff}#tnp-status-table .tnp-ok{font-weight:bold;color:white;font-size:14px;background-color:#27ae60;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-ko{font-weight:bold;color:white;font-size:14px;background-color:#e74c41;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-maybe{font-weight:bold;color:white;font-size:14px;background-color:#f1c40f;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}.tnp-main-status .tnp-log-files li{padding-left:15px}.tnp-main-status .tnp-log-files li,.tnp-main-status .tnp-log-files li a{color:#fff}.tnp-main-status .tnp-log-files .tnp-log-size{font-style:italic}table.widefat{border:0;box-shadow:none}#tnp-status-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-parameters-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-body .ui-widget{font-family:soleil,sans-serif}#tnp-body #tabs{background-color:transparent;border:0!important;padding:0;margin:0}#tnp-body #tabs .ui-widget-header{background:#28313c;border:0}#tnp-body #tabs .ui-tabs-panel{padding:15px!important;background-color:#fff}#tnp-body #tabs a.ui-tabs-anchor,#tnp-body #tabs a.ui-tabs-anchor:visited{color:#444}#tnp-body .ui-tabs .ui-tabs-nav{padding:0}#tnp-body .ui-tabs .ui-tabs-nav li a{font-size:14px}#tnp-body #tabs .ui-tabs{border-color:#28313c;background-color:#28313c;border:0}#tnp-body #tabs .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0 0;background-color:#f2f2f2}#tnp-body #tabs .ui-tabs .ui-tabs-panel{padding:1em 0;background-color:#f2f2f2;margin:0;border:0}#tnp-body .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff!important;font-weight:normal;font-family:soleil,sans-serif}#tnp-body .ui-widget-content{background:#fff}#tnp-body .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.tnp-extension-premium-box,.tnp-extension-free-box,.tnp-integration-box{width:300px;height:220px;background-color:#222b36;text-align:center;margin:20px;float:left;position:relative}.tnp-extension-premium-box:hover,.tnp-extension-free-box:hover,.tnp-integration-box:hover{background-color:#232c35;box-shadow:1px 1px 15px #222b36}.tnp-extension-premium-box p,.tnp-extension-free-box p,.tnp-integration-box p{padding:5px 10px;color:#72777c;font-size:14px;margin-top:0}.tnp-extension-premium-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-free-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-integration-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-premium-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-free-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-integration-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-premium-action span{color:#27ae60}.tnp-extension-free-action span{color:#27ae60}.tnp-integration-action span{color:#27ae60}.tnp-extension-activate{color:#1abc9c;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-install{color:#2980b9;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-buy{color:#f1c40f;padding:5px 8px;text-decoration:none;cursor:pointer}#tnp-body a.tnp-extension-details{color:#999;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-free{color:#d35400;padding:5px 8px;text-decoration:none;cursor:pointer;position:relative}img.tnp-extensions-free-badge{position:absolute;display:block;right:0;top:0;width:70px}.tnp-extensions-image img{margin:25px 0 -10px}#tnp-subscribe-overlay{height:100vh;width:100vw;z-index:10000;display:none;background-image:url(images/modal-background.png);background-repeat:repeat;position:fixed;top:0;left:-20px}#tnp-subscribe-modal{width:600px;background-color:rgba(255,255,255,1);margin-right:auto;margin-left:auto;margin-top:100px;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);box-shadow:0 0 20px 0 rgba(0,0,0,0.5);padding:25px;background-color:#1d2b38;text-align:center}#tnp-subscribe-modal img{width:30%}#tnp-subscribe-title{font-size:20px;margin-top:30px;margin-bottom:30px;line-height:30px;color:white;font-weight:200}#tnp-subscribe-email-wrapper{margin:20px}#tnp-subscribe-email-wrapper input{border:0;background-color:#223242;color:white}#tnp-subscribe-email{font-size:24px;box-sizing:border-box;width:100%;padding:10px;text-align:center}#tnp-subscribe-submit-wrapper{margin-bottom:20px}#tnp-subscribe-submit{font-size:24px;background-color:#219050;color:#fff;padding:10px 35px;border:0;font-size:17px;letter-spacing:2px}#tnp-subscribe-no-thanks{color:#666;margin-top:20px;margin-bottom:20px}#tnp-body div.tnp-emails-theme-options{background-color:#fff;padding:10px;margin-top:14px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.cd-slider-wrapper{position:relative;width:100%;height:90vh;overflow:hidden;margin:0 auto}.cd-slider-wrapper .cd-slider,.cd-slider-wrapper .cd-slider>li{height:100%;width:100%}.tnp-logo-big{width:300px}.tnp-row{display:table-row}.tnp-third{width:33%;float:left}.tnp-welcome-confirm-button{color:#fff;padding:10px 30px;background-color:#2ecc71;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none;display:inline-block;text-align:center;margin:20px auto 0}.tnp-welcome-confirm-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-confirm-button:visited{color:#fff;text-decoration:none}.tnp-welcome-link-button{color:#fff;padding:10px 30px;background-color:#3498db;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none}.tnp-welcome-link-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-link-button:visited{color:#fff;text-decoration:none}#tnp-welcome input[type="text"],#tnp-welcome input[type="email"]{max-width:90%}.tnp-welcome-next{background-color:#2ecc71;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-next:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-next:visited{color:#fff;text-decoration:none}.tnp-welcome-prev{background-color:#3498db;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 0 0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-prev:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-prev:visited{color:#fff;text-decoration:none}.tnp-welcome-next svg{margin-left:10px}.tnp-welcome-prev svg{margin-right:10px}.cd-slider input{width:250px;height:40px;border:1px solid #6c7280;background:#454a56;color:white;color:white;padding:0 10px}.cd-slider>li{position:absolute;top:0;left:0;opacity:0;display:table;background-position:center center;background-repeat:no-repeat;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cd-slider>li.visible{position:relative;z-index:2;opacity:1}.cd-slider>li:first-of-type{background-color:#2b313a}.cd-slider>li:nth-of-type(2){background-color:#2b313a}.cd-slider>li:nth-of-type(3){background-color:#2b313a}.cd-slider>li:nth-of-type(4){background-color:#2b313a}.cd-slider>li:first-of-type,.cd-slider>li:nth-of-type(2),.cd-slider>li:nth-of-type(3),.cd-slider>li:nth-of-type(4){background-size:cover}.cd-slider>li>div{display:table-cell;vertical-align:middle;text-align:center}.cd-slider>li h2,.cd-slider>li p{text-shadow:0 1px 3px rgba(0,0,0,0.1);line-height:1.2;margin:0 auto 14px;color:#fff;width:90%;max-width:320px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}.cd-slider>li .cd-btn{display:inline-block;padding:1.2em 1.4em;margin-top:.8em;background-color:rgba(0,0,0,0.6);border-radius:.25em;font-size:1.3rem;font-weight:700;letter-spacing:1px;color:#fff;text-transform:uppercase;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.no-touch .cd-slider>li .cd-btn:hover{background-color:rgba(0,0,0,0.8)}@media only screen and (min-width:768px){.cd-slider>li h2,.cd-slider>li p{max-width:520px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}}@media only screen and (min-width:1170px){.cd-slider>li h2,.cd-slider>li p{margin-bottom:20px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:center;color:#b8c3c9;margin:30px auto}}.cd-slider-navigation{position:relative;bottom:110px;z-index:3;display:flex;justify-content:center}.cd-svg-cover{position:absolute;z-index:1;left:0;top:0;height:100%;width:100%;opacity:0}.cd-svg-cover path{fill:#ed6a6a}.cd-svg-cover.is-animating{z-index:4;opacity:1;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}#tnp-body div.tnp-emails-theme-options table.form-table{margin:0}#tnp-body div.tnp-emails-theme-options h3{color:#000}.tnp-emails-edit #options-subject{font-size:16px;display:inline-block;margin:20px 0;width:auto;border-radius:4px;padding:5px 10px}.tnp-suggest-button{font-family:soleil,sans-serif;margin-left:8px;border-radius:3px;background-color:#2980b9;padding:10px 15px 8px;font-size:14px;color:#fff!important;text-decoration:none}.tnp-suggest-button:hover{background-color:#3f8dbf}.tnp-popup-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.8);z-index:10000}.tnp-popup{width:40vw;height:66vh;overflow:auto;margin:100px auto 0 auto;background-color:#181818;padding:20px;position:relative}.tnp-popup-close{display:block;position:absolute;top:5px;right:5px;background-color:#181818;color:#fff;font-size:40px;padding:10px;text-align:right;cursor:pointer}.tnp-subjects-header{font-size:16px;color:#fff;padding:0 70px 20px 20px;font-family:soleil,sans-serif;border-bottom:1px solid #282828}#tnp-edit-subjects-list{padding:0 70px 20px 20px}#tnp-edit-subjects-list a{padding:5px}#tnp-edit-subjects-list svg{margin:0 10px 0 0;vertical-align:middle}.tnp-subject-category{color:#565656;margin:25px 0 10px 0;font-size:12px;text-transform:uppercase;letter-spacing:.1em}#tnp-edit-emoji-list{font-size:28px}#tnp-edit-emoji-list a{display:inline-block;margin-right:5px;margin-bottom:5px}.tnp-list-conditions p{margin:0 10px}.tnp-lists .tnp-notes{margin:0;font-size:.9em}iframe.tnp-editor-preview-mobile{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;box-shadow:1px 1px 10px #777;border-radius:10px;padding:5px;width:320px;height:500px;float:left}iframe.tnp-editor-preview-desktop{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;border-radius:10px;box-shadow:1px 1px 10px #777;padding:15px;width:650px;margin-right:20px;height:500px;float:left}#tnp-license-control{border-left:5px solid #27ae60;display:inline-block;padding:15px 20px;margin-left:-10px;margin-top:15px;border-radius:2px;background-color:#fff}#tnp-license-control form{margin-bottom:10px;margin-top:10px}#tnp-license-control form input{padding-left:10px}#tnp-license-control a{border-bottom:0;color:#27ae60}#tnp-nl-status{width:100%;background:#fffafa;padding:15px 25px 15px 25px;border-left:10px solid #27ae60;border-radius:0 5px 5px 0}#tnp-nl-status p{font-size:17px}.tnp-nl-status-row{margin:10px 0}.tnp-nl-status-title{font-size:26px;line-height:32px;margin:5px 0 0 0;color:#3498db;font-weight:900;vertical-align:middle}.tnp-nl-status-title-value{font-size:13px;line-height:32px;margin:0 0 0 5px;color:#fff;background-color:#95a5a6;border-radius:4px;text-transform:uppercase;letter-spacing:1px;vertical-align:sub}.tnp-nl-status-schedule-targeting{font-size:15px;color:#34495e}.tnp-nl-status-schedule-value{font-size:15px;color:#34495e}.tnp-status-header #options-subject{width:calc(100% - 150px)}.tnp-one-third{width:40%;display:inline-block;vertical-align:top}.tnp-two-thirds{width:59%;display:inline-block;vertical-align:top}.tnp-progress{display:flex;height:1.5rem;overflow:hidden;font-size:.75rem;background-color:#c9cccf;border-radius:.25rem;margin:0;min-width:100px}.tnp-progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}.tnp-progress.sent .tnp-progress-bar{background-color:green}.tnp-progress-numbers{text-align:center;color:#666}.tnp-progress-date{color:#666;font-style:italic}span.tnp-email-status-new{background-color:#8e44ad;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-paused{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sending{background-color:#27ae60;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-scheduled{background-color:#e67e22;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sent{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}.tnp-themes-new{border-bottom:2px solid #243342;margin-bottom:30px;padding-bottom:30px}#tnp-schedule-button{background-color:#e67e22!important}#tnp-schedule-button:hover{background-color:#ec913f!important}.tnp-button-cancel{background-color:#e74c3c!important}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnp-promo{text-align:left;background-color:#222b36;margin:20px;border-radius:5px;padding:20px 40px}#tnp-promo .tnp-promo-how-to{width:50%;padding:5px 20px;margin-top:30px;margin-bottom:30px;border-left:2px solid #f1c40f}#tnp-promo .tnp-promo-how-to h3{color:#ecf0f1;margin:0;line-height:36px}#tnp-promo .tnp-promo-how-to p{color:#ecf0f1;margin:0;font-size:16px;line-height:26px}#tnp-promo .tnp-promo-buttons{margin:50px 0}#tnp-promo .tnp-promo-button{background:#27ae60;text-decoration:none;color:white;padding:15px 20px;font-size:15px;border-radius:2px}#tnp-promo .tnp-promo-button:hover{background:#2ecc71;color:white}#tnp-promo .tnp-promo-button i{margin-right:3px}#tnp-body td a.tnp-table-link,#tnp-body td a.tnp-table-link:visited{color:#444}#tnp-body td a.tnp-table-link:hover{color:#3498db}.text-left{text-align:left}
|
1 |
+
#tnp-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tnp-wrap .iris-picker,#tnp-wrap .iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#tnp-wrap *:before,#tnp-wrap *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}@media all and (max-width:1100px){.col-md-12{width:100%}.col-md-11{width:100%}.col-md-10{width:100%}.col-md-9{width:100%}.col-md-8{width:100%}.col-md-7{width:100%}.col-md-6{width:100%}.col-md-5{width:100%}.col-md-4{width:100%}.col-md-3{width:100%}.col-md-2{width:100%}.col-md-1{width:100%}}.tnp-row-padded{width:90%;margin:0 auto;display:flex;justify-content:space-between}.tnp-col-3-boxed{width:30%;border:1px solid #3c414c;padding:0 0 30px 0;border-radius:10px}.tnp-margin-top{margin-top:80px}#tnp-wrap,#tnp-header,#tnp-body p,#tnp-body td,#tnp-body td p,#tnp-body input,#tnp-body select,#tnp-body textarea{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-promotion-bar{background-color:#ff5f65;color:ddd;padding:10px 0;text-align:center;font-size:16px}#tnp-promotion-bar a{color:#fff;font-weight:normal;text-decoration:none}#tnp-header{text-align:left;font-size:12px;color:#fff;font-family:soleil,sans-serif}#tnp-header input{font-size:12px}#tnp-header a{text-decoration:none;color:white;letter-spacing:.1em}#tnp-header a:hover{color:#fff}.error a,.error a:hover{color:#000!important}.updated a,.updated a:hover{color:#000!important}.tnp-error{border-left:5px solid #d00;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-warning{border-left:5px solid #ffb900;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-message{border-left:5px solid #46b450;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4,#tnp-body p{color:#fff}#tnp-body a,#tnp-body a:active{color:#2980b9}#tnp-body a:hover{color:#3498db}#tnp-body .tnp-submit{margin-bottom:10px}#tnp-body .button,#tnp-body .button:visited,#tnp-body .button:hover,#tnp-body .button:active,#tnp-body .button:focus,#tnp-body .button-primary,#tnp-body .button-primary:visited,#tnp-body .button-primary:hover,#tnp-body .button-secondary,#tnp-body .button-secondary:visited,#tnp-body .button-secondary:hover{color:#fff;background-color:#3498db;text-shadow:none;width:auto}#tnp-body span.wp-media-buttons-icon:before{color:#fff}#tnp-body .tnp-button{color:#fff;background-color:#3498db;text-shadow:none}#tnp-body .button-primary.tnp-button-white,#tnp-body .tnp-button.tnp-button-white{color:#444!important;background-color:#fff!important;box-shadow:none!important;-webkit-box-shadow:none!important;width:auto}#tnp-body .form-table h1,#tnp-body .form-table h2,#tnp-body .form-table h4,#tnp-body .form-table h3{color:#444}#tnp-body tbody th,#tnp-body td,#tnp-body td p,#tnp-body td .button,#tnp-body td .button:visited,#tnp-body td .button:hover,#tnp-body td .button:active,#tnp-body td .button:focus{color:#444}#tnp-body td a,#tnp-body td a:visited{color:#27ae60}#tnp-body .form-table{background-color:#fff;border:1px solid #ecf0f1;margin-top:2em;border-spacing:4px;border-collapse:separate}#tnp-body .form-table th{text-align:right;font-weight:bold;max-width:200px;color:#000;background-color:#ecf0f1;vertical-align:middle}#tnp-body .form-table th small{font-weight:normal}#tnp-body .form-table textarea{width:100%}#tnp-body .form-table table{border-collapse:collapse}#tnp-body .form-table table td,.form-table table th{padding:5px;font-size:.9em;font-weight:normal;border:1px solid #eee}#tnp-body .form-table table thead th{text-align:left;font-weight:bold}#tnp-body .widefat{width:90%}#tnp-body .widefat th{text-align:left}#tnp-body .widefat thead{background-color:#3498db;font-family:soleil,sans-serif;color:#fff!important}#tnp-body .widefat thead tr th{color:#fff!important}#tnp-body .widefat td,.widefat th{vertical-align:middle}.tnp-newsletters-list tbody tr{height:70px}.widefat tr:nth-child(even){background-color:#f4faff}#tnp-body #tabs h1,#tnp-body #tabs h2,#tnp-body #tabs h3,#tnp-body #tabs h4,#tnp-body #tabs p,#tnp-body #tabs td,#tnp-body #tabs th,#tnp-body #tabs input,#tnp-body #tabs select,#tnp-body #tabs textarea,#tnp-body #tabs a{color:#444}#tnp-body #tabs .button,#tnp-body #tabs .button:visited,#tnp-body #tabs .button:hover,#tnp-body #tabs .button-primary,#tnp-body #tabs .button-primary:visited,#tnp-body #tabs .button-primary:hover,#tnp-body #tabs .button-secondary,#tnp-body #tabs .button-secondary:visited,#tnp-body #tabs .button-secondary:hover{color:#fff;width:auto}table.clicks td{border:1px solid #666;padding:2px;font-size:10px}table.clicks{border-collapse:collapse}.grid{border-collapse:collapse}.grid td,.grid th{padding:10px;border:1px solid #ddd;margin:0}.grid th{background-color:#aaa}.tnp-checkboxes label{display:block;float:left;width:220px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;margin-right:5px}.tnp-buttons{padding:10px}.newsletter-checkbox-group,.nl-checkbox-group{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item{float:left;margin-right:5px;border:1px solid #ddd;border-radius:3px;background-color:#f4f4f4;width:150px;margin-bottom:5px;padding:3px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item input{vertical-align:text-bottom}.newsletter-checkboxes-item label{display:inline}.newsletter-preferences-item{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;width:250px;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-preferences-item label{display:inline}.form-table td .nl-checkbox-group label{display:inline}.tnp-notice{padding:15px;margin:10px 0;padding-right:70px;position:relative;border:1px solid #eee;background-color:#fff;color:#444;font-size:13px;border-left:5px solid #27ae60}.tnp-notice a{color:#0073aa;text-decoration:none;font-weight:bold}.tnp-notice a.tnp-dismiss{display:block;position:absolute;right:10px;top:13px;font-size:25px;text-decoration:none;color:#666}.tnp-notice input[type=email]{margin:10px 5px 5px;width:250px;border:0;box-shadow:none;background-color:#ecf0f1;padding:8px}.tnp-notice input[type=submit]{border:0;box-shadow:none;background-color:#27ae60;padding:8px;font-family:soleil,sans-serif;font-size:13px;color:#fff;cursor:pointer}.newsletter-message{background-color:#efe;border-color:#393;border-radius:5px;border-style:solid;border-width:3px;padding:.6em;margin-bottom:.6em}.newsletter-error-span{color:#f00;font-weight:bold}.newsletter-error{background-color:#fee;border-color:#933;border-radius:5px;border-style:solid;border-width:2px;padding:.6em;margin-bottom:.6em}.newsletter-error strong,.newsletter-message strong{font-weight:bold}#newsletter-warnings{background-color:#ffebe8;border-color:#C00;border-radius:3px;border-style:solid;border-width:1px;padding:.6em;margin-bottom:.6em}.newsletter-buttons{margin-top:1em;margin-bottom:1em}.tnp-paginator{margin-top:10px;margin-bottom:5px}.newsletter-option-grid th{text-align:right;width:auto;border:0;padding:3px;font-weight:normal;vertical-align:top;padding-right:15px}.newsletter-option-grid td{border:0;padding:3px;vertical-align:top}.newsletter-box{border:1px solid #ddd;padding:10px;background-color:#fafafa;margin-bottom:15px}.newsletter-box h3{margin-top:0}.newsletter-textarea-preview{border:1px solid #ddd}.tnp-tab-notice{background-color:#fff;border:1px solid #eee;border-left:3px solid gray;padding:10px;margin:10px 0;color:#444}.tnp-tab-warning{background-color:#fff;border:1px solid #eee;border-left:3px solid orange;padding:10px;margin:10px 0;color:#444}.tnp-tab-success{background-color:#fff;border:1px solid #eee;border-left:3px solid green;padding:10px;margin:10px 0;color:#444}.tnp-tab-error{background-color:#fff;border:1px solid #eee;border-left:3px solid red;padding:10px;margin:10px 0;color:#444}.tnp-tip{margin-top:5px}.tip-button{padding:0 5px;color:#fd5f65;text-transform:uppercase;letter-spacing:.2em;font-size:10px;border:1px red solid}.tip-content{font-weight:500;font-size:11px;color:#999}p.description{font-size:12px!important}.tnp-theme-preview{display:inline-block;text-align:center}.tnp-theme-preview p{font-family:soleil;font-size:13px;letter-spacing:.2em;color:#fff}.tnp-theme-preview img:hover{box-shadow:3px 3px 8px 2px #293848}.tnp-theme-preview img{border-radius:10px;height:190px;width:auto}.tnp-theme-preview .tnp-theme-composer{height:250px;width:auto}.tnp-theme-preview .tnp-theme-html{height:250px;width:auto}.tnp-header-logo{margin-left:10px}.wp-core-ui .button-primary{background-color:#2b2f3a;color:#fff;width:auto}#tnp-body{padding:10px;background-color:#28313c}.tnp-darkbg{background-color:#34495e!important}#tnp-body h3{margin-top:25px;clear:both;margin-bottom:10px}.tnp-body-lite{background-color:#f1f1f1!important}#tnp-heading{padding:10px;margin-bottom:10px;border-radius:5px}#tnp-heading a{color:#fff;border-bottom:1px solid #fff;text-decoration:none}#tnp-heading a:hover{color:#27ae60;border-bottom:1px solid #27ae60}#tnp-heading div p{color:#565656}#tnp-heading h2{color:#fff;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:1.1rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0;margin-bottom:15px}#tnp-heading h3{color:#27ae60;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:.8rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0}#tnp-heading p{margin:0;color:#ccc}#tnp-heading .notice p{margin:.5em 0;padding:2px}#tnp-heading .tnp-btn-h1{color:#fff;background-color:#3498db;border-radius:3px;padding:6px 11px;text-decoration:none;text-transform:capitalize;font-family:soleil,sans-serif;margin-left:10px;font-size:.75rem;font-weight:300;border:0}#tnp-heading .tnp-btn-h1:hover{color:#fff;background-color:#5dade2;-webkit-transition:background-color .25s linear;transition:background-color .25s linear;-webkit-font-smoothing:subpixel-antialiased;border:0;color:#fff}.metabox-holder{width:100%}.postbox{border:0}.postbox h3 a{float:right}#dashboard-widgets .postbox-container{width:33.333%}#tnp-body .postbox p{color:#000}#dashboard-widgets .postbox-container .postbox h3{font-family:soleil,sans-serif;letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#dashboard-widgets .postbox-container h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem}#dashboard-widgets .postbox-container h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}.postbox-container i{margin-right:3px}#tnp-dash-newsletters tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:first-of-type{width:250px;overflow:hidden}#tnp-dash-subscribers table{table-layout:fixed}#tnp-dash-documentation .inside div{margin-top:10px}#tnp-dash-documentation .inside a{text-decoration:none;color:#fff;display:block;font-family:soleil,sans-serif;padding:5px 10px}#tnp-footer{margin-top:10px;padding:20px 10px 10px 40px;background-color:#28313c;font-family:soleil,sans-serif}#tnp-footer div{width:33%;display:inline-block}#tnp-footer a{color:#fff;text-decoration:none}#tnp-footer a:hover{color:#bdc3c7}#tnp-footer input[type="submit"]{background-color:#2ecc71;border:0;padding:5px;color:#fff}#tnp-footer form{white-space:nowrap}#tnp-footer li{display:inline;margin-left:15px;padding:2px 5px;border-left:3px solid #2ecc71}#wpwrap{background-color:#222b36!important}#dashboard-widgets .button{border:0;background:0;box-shadow:none;color:#322c39}#dashboard-widgets .button:hover{background-color:#ecf0f1}.wp-core-ui .button-secondary,.wp-core-ui .button-primary{background-color:#3498db;border:0;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px;width:auto}.wp-core-ui .button-secondary,.wp-core-ui .button,.wp-core-ui .button-primary{background-color:#3498db;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px}.wp-core-ui .button-secondary:hover,.wp-core-ui .button:hover,.wp-core-ui .button-primary:hover{background-color:#5dade2;color:#fff;width:auto}span.wp-media-buttons-icon:before{color:#fff}.tnp-paginator [value="Go"]{background-color:#27ae60}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71}.notice-dismiss{padding:3px}.tnp-paginator{color:#fff;font-family:soleil,sans-serif;margin:10px 0}.tnp-paginator .button-secondary{padding:5px;line-height:normal;height:auto;font-size:12px;height:25px;border:0;border-radius:3px;vertical-align:baseline}.tnp-paginator [value="Go"]{background-color:#27ae60!important}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71!important}.tnp-paginator input{background-color:#2c3e50;border:0;border-radius:3px;color:#fff;padding:5px;line-height:normal;font-size:12px;height:25px}.tnp-subscribers-search{color:#fff;font-family:soleil,sans-serif;background-color:#2c3e50;padding:20px;border-radius:5px;margin-bottom:20px;display:inline-block}.tnp-subscribers-search select{margin-left:5px;padding:0;line-height:inherit}.tnp-video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.tnp-video-container iframe,.tnp-video-container object,.tnp-video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.bg-white{background-color:#FFF}.orange{background-color:#f39c12}.blue{background-color:#2980b9}.purple{background-color:#8e44ad}.notice a{color:#27ae60!important;text-decoration:underline!important}.tnp-chart{border:1px solid #eee;width:100%}.tnp-db-table{width:auto;background-color:#fff}.tnp-db-table thead{border-bottom:1px solid #eee}.tnp-db-table th{font-weight:bold}.tnp-db-table td,.tnp-db-table th{padding:3px;font-family:monospace;border:0}.tnp-main-status h3,.tnp-main-status h4{color:#fff}#tnp-status-table .tnp-ok{font-weight:bold;color:white;font-size:14px;background-color:#27ae60;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-ko{font-weight:bold;color:white;font-size:14px;background-color:#e74c41;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-maybe{font-weight:bold;color:white;font-size:14px;background-color:#f1c40f;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}.tnp-main-status .tnp-log-files li{padding-left:15px}.tnp-main-status .tnp-log-files li,.tnp-main-status .tnp-log-files li a{color:#fff}.tnp-main-status .tnp-log-files .tnp-log-size{font-style:italic}table.widefat{border:0;box-shadow:none}#tnp-status-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-parameters-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-body .ui-widget{font-family:soleil,sans-serif}#tnp-body #tabs{background-color:transparent;border:0!important;padding:0;margin:0}#tnp-body #tabs .ui-widget-header{background:#28313c;border:0}#tnp-body #tabs .ui-tabs-panel{padding:15px!important;background-color:#fff}#tnp-body #tabs a.ui-tabs-anchor,#tnp-body #tabs a.ui-tabs-anchor:visited{color:#444}#tnp-body .ui-tabs .ui-tabs-nav{padding:0}#tnp-body .ui-tabs .ui-tabs-nav li a{font-size:14px}#tnp-body #tabs .ui-tabs{border-color:#28313c;background-color:#28313c;border:0}#tnp-body #tabs .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0 0;background-color:#f2f2f2}#tnp-body #tabs .ui-tabs .ui-tabs-panel{padding:1em 0;background-color:#f2f2f2;margin:0;border:0}#tnp-body .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff!important;font-weight:normal;font-family:soleil,sans-serif}#tnp-body .ui-widget-content{background:#fff}#tnp-body .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.tnp-extension-premium-box,.tnp-extension-free-box,.tnp-integration-box{width:300px;height:220px;background-color:#222b36;text-align:center;margin:20px;float:left;position:relative}.tnp-extension-premium-box:hover,.tnp-extension-free-box:hover,.tnp-integration-box:hover{background-color:#232c35;box-shadow:1px 1px 15px #222b36}.tnp-extension-premium-box p,.tnp-extension-free-box p,.tnp-integration-box p{padding:5px 10px;color:#72777c;font-size:14px;margin-top:0}.tnp-extension-premium-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-free-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-integration-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-premium-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-free-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-integration-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-premium-action span{color:#27ae60}.tnp-extension-free-action span{color:#27ae60}.tnp-integration-action span{color:#27ae60}.tnp-extension-activate{color:#1abc9c;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-install{color:#2980b9;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-buy{color:#f1c40f;padding:5px 8px;text-decoration:none;cursor:pointer}#tnp-body a.tnp-extension-details{color:#999;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-free{color:#d35400;padding:5px 8px;text-decoration:none;cursor:pointer;position:relative}img.tnp-extensions-free-badge{position:absolute;display:block;right:0;top:0;width:70px}.tnp-extensions-image img{margin:25px 0 -10px}#tnp-subscribe-overlay{height:100vh;width:100vw;z-index:10000;display:none;background-image:url(images/modal-background.png);background-repeat:repeat;position:fixed;top:0;left:-20px}#tnp-subscribe-modal{width:600px;background-color:rgba(255,255,255,1);margin-right:auto;margin-left:auto;margin-top:100px;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);box-shadow:0 0 20px 0 rgba(0,0,0,0.5);padding:25px;background-color:#1d2b38;text-align:center}#tnp-subscribe-modal img{width:30%}#tnp-subscribe-title{font-size:20px;margin-top:30px;margin-bottom:30px;line-height:30px;color:white;font-weight:200}#tnp-subscribe-email-wrapper{margin:20px}#tnp-subscribe-email-wrapper input{border:0;background-color:#223242;color:white}#tnp-subscribe-email{font-size:24px;box-sizing:border-box;width:100%;padding:10px;text-align:center}#tnp-subscribe-submit-wrapper{margin-bottom:20px}#tnp-subscribe-submit{font-size:24px;background-color:#219050;color:#fff;padding:10px 35px;border:0;font-size:17px;letter-spacing:2px}#tnp-subscribe-no-thanks{color:#666;margin-top:20px;margin-bottom:20px}#tnp-body div.tnp-emails-theme-options{background-color:#fff;padding:10px;margin-top:14px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.cd-slider-wrapper{position:relative;width:100%;height:90vh;overflow:hidden;margin:0 auto}.cd-slider-wrapper .cd-slider,.cd-slider-wrapper .cd-slider>li{height:100%;width:100%}.tnp-logo-big{width:300px}.tnp-row{display:table-row}.tnp-third{width:33%;float:left}.tnp-welcome-confirm-button{color:#fff;padding:10px 30px;background-color:#2ecc71;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none;display:inline-block;text-align:center;margin:20px auto 0}.tnp-welcome-confirm-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-confirm-button:visited{color:#fff;text-decoration:none}.tnp-welcome-link-button{color:#fff;padding:10px 30px;background-color:#3498db;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none}.tnp-welcome-link-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-link-button:visited{color:#fff;text-decoration:none}#tnp-welcome input[type="text"],#tnp-welcome input[type="email"]{max-width:90%}.tnp-welcome-next{background-color:#2ecc71;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-next:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-next:visited{color:#fff;text-decoration:none}.tnp-welcome-prev{background-color:#3498db;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 0 0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-prev:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-prev:visited{color:#fff;text-decoration:none}.tnp-welcome-next svg{margin-left:10px}.tnp-welcome-prev svg{margin-right:10px}.cd-slider input{width:250px;height:40px;border:1px solid #6c7280;background:#454a56;color:white;color:white;padding:0 10px}.cd-slider>li{position:absolute;top:0;left:0;opacity:0;display:table;background-position:center center;background-repeat:no-repeat;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cd-slider>li.visible{position:relative;z-index:2;opacity:1}.cd-slider>li:first-of-type{background-color:#2b313a}.cd-slider>li:nth-of-type(2){background-color:#2b313a}.cd-slider>li:nth-of-type(3){background-color:#2b313a}.cd-slider>li:nth-of-type(4){background-color:#2b313a}.cd-slider>li:first-of-type,.cd-slider>li:nth-of-type(2),.cd-slider>li:nth-of-type(3),.cd-slider>li:nth-of-type(4){background-size:cover}.cd-slider>li>div{display:table-cell;vertical-align:middle;text-align:center}.cd-slider>li h2,.cd-slider>li p{text-shadow:0 1px 3px rgba(0,0,0,0.1);line-height:1.2;margin:0 auto 14px;color:#fff;width:90%;max-width:320px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}.cd-slider>li .cd-btn{display:inline-block;padding:1.2em 1.4em;margin-top:.8em;background-color:rgba(0,0,0,0.6);border-radius:.25em;font-size:1.3rem;font-weight:700;letter-spacing:1px;color:#fff;text-transform:uppercase;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.no-touch .cd-slider>li .cd-btn:hover{background-color:rgba(0,0,0,0.8)}@media only screen and (min-width:768px){.cd-slider>li h2,.cd-slider>li p{max-width:520px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}}@media only screen and (min-width:1170px){.cd-slider>li h2,.cd-slider>li p{margin-bottom:20px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:center;color:#b8c3c9;margin:30px auto}}.cd-slider-navigation{position:relative;bottom:110px;z-index:3;display:flex;justify-content:center}.cd-svg-cover{position:absolute;z-index:1;left:0;top:0;height:100%;width:100%;opacity:0}.cd-svg-cover path{fill:#ed6a6a}.cd-svg-cover.is-animating{z-index:4;opacity:1;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}#tnp-body div.tnp-emails-theme-options table.form-table{margin:0}#tnp-body div.tnp-emails-theme-options h3{color:#000}.tnp-emails-edit #options-subject{font-size:16px;display:inline-block;margin:20px 0;width:auto;border-radius:4px;padding:5px 10px}.tnp-suggest-button{font-family:soleil,sans-serif;margin-left:8px;border-radius:3px;background-color:#2980b9;padding:10px 15px 8px;font-size:14px;color:#fff!important;text-decoration:none}.tnp-suggest-button:hover{background-color:#3f8dbf}.tnp-popup-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.8);z-index:10000}.tnp-popup{width:40vw;height:66vh;overflow:auto;margin:100px auto 0 auto;background-color:#181818;padding:20px;position:relative}.tnp-popup-close{display:block;position:absolute;top:5px;right:5px;background-color:#181818;color:#fff;font-size:40px;padding:10px;text-align:right;cursor:pointer}.tnp-subjects-header{font-size:16px;color:#fff;padding:0 70px 20px 20px;font-family:soleil,sans-serif;border-bottom:1px solid #282828}#tnp-edit-subjects-list{padding:0 70px 20px 20px}#tnp-edit-subjects-list a{padding:5px}#tnp-edit-subjects-list svg{margin:0 10px 0 0;vertical-align:middle}.tnp-subject-category{color:#565656;margin:25px 0 10px 0;font-size:12px;text-transform:uppercase;letter-spacing:.1em}#tnp-edit-emoji-list{font-size:28px}#tnp-edit-emoji-list a{display:inline-block;margin-right:5px;margin-bottom:5px}.tnp-list-conditions p{margin:0 10px}.tnp-lists .tnp-notes{margin:0;font-size:.9em}iframe.tnp-editor-preview-mobile{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;box-shadow:1px 1px 10px #777;border-radius:10px;padding:5px;width:320px;height:500px;float:left}iframe.tnp-editor-preview-desktop{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;border-radius:10px;box-shadow:1px 1px 10px #777;padding:15px;width:650px;margin-right:20px;height:500px;float:left}#tnp-license-control{border-left:5px solid #27ae60;display:inline-block;padding:15px 20px;margin-left:-10px;margin-top:15px;border-radius:2px;background-color:#fff}#tnp-license-control form{margin-bottom:10px;margin-top:10px}#tnp-license-control form input{padding-left:10px}#tnp-license-control a{border-bottom:0;color:#27ae60}#tnp-nl-status{width:100%;background:#fffafa;padding:15px 25px 15px 25px;border-left:10px solid #27ae60;border-radius:0 5px 5px 0}#tnp-nl-status p{font-size:17px}.tnp-nl-status-row{margin:10px 0}.tnp-nl-status-title{font-size:26px;line-height:32px;margin:5px 0 0 0;color:#3498db;font-weight:900;vertical-align:middle}.tnp-nl-status-title-value{font-size:13px;line-height:32px;margin:0 0 0 5px;color:#fff;background-color:#95a5a6;border-radius:4px;text-transform:uppercase;letter-spacing:1px;vertical-align:sub}.tnp-nl-status-schedule-targeting{font-size:15px;color:#34495e}.tnp-nl-status-schedule-value{font-size:15px;color:#34495e}.tnp-status-header #options-subject{width:calc(100% - 150px)}.tnp-one-third{width:40%;display:inline-block;vertical-align:top}.tnp-two-thirds{width:59%;display:inline-block;vertical-align:top}.tnp-progress{display:flex;height:1.5rem;overflow:hidden;font-size:.75rem;background-color:#c9cccf;border-radius:.25rem;margin:0;min-width:100px}.tnp-progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}.tnp-progress.sent .tnp-progress-bar{background-color:green}.tnp-progress-numbers{text-align:center;color:#666}.tnp-progress-date{color:#666;font-style:italic}span.tnp-email-status-new{background-color:#8e44ad;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-paused{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sending{background-color:#27ae60;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-scheduled{background-color:#e67e22;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sent{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}.tnp-themes-new{border-bottom:2px solid #243342;margin-bottom:30px;padding-bottom:30px}#tnp-schedule-button{background-color:#e67e22!important}#tnp-schedule-button:hover{background-color:#ec913f!important}.tnp-button-cancel{background-color:#e74c3c!important}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnp-promo{text-align:left;background-color:#222b36;margin:20px;border-radius:5px;padding:20px 40px}#tnp-promo .tnp-promo-how-to{width:50%;padding:5px 20px;margin-top:30px;margin-bottom:30px;border-left:2px solid #f1c40f}#tnp-promo .tnp-promo-how-to h3{color:#ecf0f1;margin:0;line-height:36px}#tnp-promo .tnp-promo-how-to p{color:#ecf0f1;margin:0;font-size:16px;line-height:26px}#tnp-promo .tnp-promo-buttons{margin:50px 0}#tnp-promo .tnp-promo-button{background:#27ae60;text-decoration:none;color:white;padding:15px 20px;font-size:15px;border-radius:2px}#tnp-promo .tnp-promo-button:hover{background:#2ecc71;color:white}#tnp-promo .tnp-promo-button i{margin-right:3px}#tnp-body td a.tnp-table-link,#tnp-body td a.tnp-table-link:visited{color:#444}#tnp-body td a.tnp-table-link:hover{color:#3498db}.text-left{text-align:left}.tab-min-height{min-height:500px}.tnp-control-all-languages-notice{padding:15px;border:1px dashed #999}
|
emails/blocks/posts/block.php
CHANGED
@@ -18,6 +18,7 @@ $defaults = array(
|
|
18 |
'title_font_family' => 'Helvetica, Arial, sans-serif',
|
19 |
'title_font_size' => '25',
|
20 |
'title_font_color' => '#333333',
|
|
|
21 |
'max' => 4,
|
22 |
'button_label' => __('Read more...', 'newsletter'),
|
23 |
'categories' => '',
|
@@ -55,6 +56,7 @@ $excerpt_length = $options['excerpt_length'];
|
|
55 |
|
56 |
$title_font_family = $options['title_font_family'];
|
57 |
$title_font_size = $options['title_font_size'];
|
|
|
58 |
|
59 |
$show_image = !empty($options['show_image']);
|
60 |
|
18 |
'title_font_family' => 'Helvetica, Arial, sans-serif',
|
19 |
'title_font_size' => '25',
|
20 |
'title_font_color' => '#333333',
|
21 |
+
'title_font_weight' => 'normal',
|
22 |
'max' => 4,
|
23 |
'button_label' => __('Read more...', 'newsletter'),
|
24 |
'categories' => '',
|
56 |
|
57 |
$title_font_family = $options['title_font_family'];
|
58 |
$title_font_size = $options['title_font_size'];
|
59 |
+
$title_font_weight = $options['title_font_weight'];
|
60 |
|
61 |
$show_image = !empty($options['show_image']);
|
62 |
|
emails/blocks/posts/layout-big-image.php
CHANGED
@@ -14,7 +14,7 @@ $size = ['width' => 600, 'height' => 0];
|
|
14 |
padding: 0 0 5px 0;
|
15 |
font-size: <?php echo $title_font_size ?>px;
|
16 |
font-family: <?php echo $title_font_family ?>;
|
17 |
-
font-weight:
|
18 |
color: <?php echo $options['title_font_color'] ?>;
|
19 |
line-height: normal;
|
20 |
}
|
14 |
padding: 0 0 5px 0;
|
15 |
font-size: <?php echo $title_font_size ?>px;
|
16 |
font-family: <?php echo $title_font_family ?>;
|
17 |
+
font-weight: <?php echo $title_font_weight ?>;
|
18 |
color: <?php echo $options['title_font_color'] ?>;
|
19 |
line-height: normal;
|
20 |
}
|
emails/blocks/posts/layout-one.php
CHANGED
@@ -14,7 +14,7 @@ $size = ['width' => 300, 'height' => 0];
|
|
14 |
padding: 0 0 5px 0;
|
15 |
font-size: <?php echo $title_font_size ?>px;
|
16 |
font-family: <?php echo $title_font_family ?>;
|
17 |
-
font-weight:
|
18 |
color: <?php echo $options['title_font_color'] ?>;
|
19 |
line-height: normal;
|
20 |
}
|
14 |
padding: 0 0 5px 0;
|
15 |
font-size: <?php echo $title_font_size ?>px;
|
16 |
font-family: <?php echo $title_font_family ?>;
|
17 |
+
font-weight: <?php echo $title_font_weight ?>;
|
18 |
color: <?php echo $options['title_font_color'] ?>;
|
19 |
line-height: normal;
|
20 |
}
|
emails/blocks/posts/layout-two.php
CHANGED
@@ -14,6 +14,7 @@ $size = array('width' => 240, 'height' => 160, "crop" => true);
|
|
14 |
font-family: <?php echo $title_font_family ?>;
|
15 |
color: <?php echo $options['title_font_color'] ?>;
|
16 |
font-size: <?php echo $title_font_size ?>px;
|
|
|
17 |
line-height: 1.3em;
|
18 |
}
|
19 |
.post-excerpt {
|
14 |
font-family: <?php echo $title_font_family ?>;
|
15 |
color: <?php echo $options['title_font_color'] ?>;
|
16 |
font-size: <?php echo $title_font_size ?>px;
|
17 |
+
font-weight: <?php echo $title_font_weight ?>;
|
18 |
line-height: 1.3em;
|
19 |
}
|
20 |
.post-excerpt {
|
emails/blocks/social/block.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Name: Social links
|
4 |
* Section: footer
|
5 |
* Description: Link with icons to social profiles
|
6 |
-
*
|
7 |
*/
|
8 |
|
9 |
/* @var $options array */
|
@@ -98,6 +98,22 @@ $configured = false;
|
|
98 |
<a href="<?php echo esc_url($block_options['vimeo_url']) ?>"><img src="<?php echo $social_icon_url ?>/vimeo.png" alt="Vimeo"></a>
|
99 |
</span>
|
100 |
<?php } ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
<?php if (!$configured) { ?>
|
102 |
<p>Configure your social links in the <a href="?page=newsletter_main_info">Social configuration section</a>.<br/>
|
103 |
Then remove and add again this block.</p>
|
3 |
* Name: Social links
|
4 |
* Section: footer
|
5 |
* Description: Link with icons to social profiles
|
6 |
+
*
|
7 |
*/
|
8 |
|
9 |
/* @var $options array */
|
98 |
<a href="<?php echo esc_url($block_options['vimeo_url']) ?>"><img src="<?php echo $social_icon_url ?>/vimeo.png" alt="Vimeo"></a>
|
99 |
</span>
|
100 |
<?php } ?>
|
101 |
+
<?php
|
102 |
+
if (!empty($block_options['telegram_url'])) {
|
103 |
+
$configured = true;
|
104 |
+
?>
|
105 |
+
<span class="tnpc-row-edit" data-type="image">
|
106 |
+
<a href="<?php echo esc_url($block_options['telegram_url']) ?>"><img src="<?php echo $social_icon_url ?>/telegram.png" alt="Telegram"></a>
|
107 |
+
</span>
|
108 |
+
<?php } ?>
|
109 |
+
<?php
|
110 |
+
if (!empty($block_options['vk_url'])) {
|
111 |
+
$configured = true;
|
112 |
+
?>
|
113 |
+
<span class="tnpc-row-edit" data-type="image">
|
114 |
+
<a href="<?php echo esc_url($block_options['vk_url']) ?>"><img src="<?php echo $social_icon_url ?>/vk.png" alt="VK"></a>
|
115 |
+
</span>
|
116 |
+
<?php } ?>
|
117 |
<?php if (!$configured) { ?>
|
118 |
<p>Configure your social links in the <a href="?page=newsletter_main_info">Social configuration section</a>.<br/>
|
119 |
Then remove and add again this block.</p>
|
emails/edit.php
CHANGED
@@ -316,19 +316,18 @@ if ($email['status'] != 'sent') {
|
|
316 |
<?php } ?>
|
317 |
|
318 |
<?php if ($email['status'] != 'sending' && $email['status'] != 'sent') $controls->button_save(); ?>
|
319 |
-
|
320 |
-
|
|
|
|
|
|
|
321 |
<a id="tnp-schedule-button" class="button-secondary" href="javascript:tnp_toggle_schedule()"><i class="far fa-clock"></i> <?php _e("Schedule") ?></a>
|
322 |
<span id="tnp-schedule" style="display: none;">
|
323 |
<?php $controls->datetime('send_on') ?>
|
324 |
-
|
325 |
<a class="button-secondary tnp-button-cancel" href="javascript:tnp_toggle_schedule()"><?php _e("Cancel") ?></a>
|
326 |
</span>
|
327 |
-
|
328 |
-
<?php if ($email['status'] == 'sending') $controls->button_confirm('pause', __('Pause', 'newsletter'), __('Pause the delivery?', 'newsletter')); ?>
|
329 |
-
<?php if ($email['status'] == 'paused') $controls->button_confirm('continue', __('Continue', 'newsletter'), 'Continue the delivery?'); ?>
|
330 |
-
<?php if ($email['status'] == 'paused') $controls->button_confirm('abort', __('Stop', 'newsletter'), __('This totally stop the delivery, ok?', 'newsletter')); ?>
|
331 |
-
|
332 |
</div>
|
333 |
|
334 |
<?php $controls->text('subject', null, 'Subject'); ?>
|
316 |
<?php } ?>
|
317 |
|
318 |
<?php if ($email['status'] != 'sending' && $email['status'] != 'sent') $controls->button_save(); ?>
|
319 |
+
<?php if ($email['status'] == 'new' ) $controls->button_confirm('send', __('Send now', 'newsletter'), __('Start real delivery?', 'newsletter')); ?>
|
320 |
+
<?php if ($email['status'] == 'sending') $controls->button_confirm('pause', __('Pause', 'newsletter'), __('Pause the delivery?', 'newsletter')); ?>
|
321 |
+
<?php if ($email['status'] == 'paused') $controls->button_confirm('continue', __('Continue', 'newsletter'), 'Continue the delivery?'); ?>
|
322 |
+
<?php if ($email['status'] == 'paused') $controls->button_confirm('abort', __('Stop', 'newsletter'), __('This totally stop the delivery, ok?', 'newsletter')); ?>
|
323 |
+
<?php if ($email['status'] == 'new' || ( $email['status'] == 'paused' && $email['send_on'] > time() )) { ?>
|
324 |
<a id="tnp-schedule-button" class="button-secondary" href="javascript:tnp_toggle_schedule()"><i class="far fa-clock"></i> <?php _e("Schedule") ?></a>
|
325 |
<span id="tnp-schedule" style="display: none;">
|
326 |
<?php $controls->datetime('send_on') ?>
|
327 |
+
<?php $controls->button_confirm('schedule', __('Schedule', 'newsletter'), __('Schedule delivery?', 'newsletter')); ?>
|
328 |
<a class="button-secondary tnp-button-cancel" href="javascript:tnp_toggle_schedule()"><?php _e("Cancel") ?></a>
|
329 |
</span>
|
330 |
+
<?php } ?>
|
|
|
|
|
|
|
|
|
331 |
</div>
|
332 |
|
333 |
<?php $controls->text('subject', null, 'Subject'); ?>
|
emails/index.php
CHANGED
@@ -2,6 +2,8 @@
|
|
2 |
defined('ABSPATH') || exit;
|
3 |
|
4 |
require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
|
|
|
|
|
5 |
$controls = new NewsletterControls();
|
6 |
$module = NewsletterEmails::instance();
|
7 |
|
@@ -31,7 +33,17 @@ if ($controls->is_action('delete_selected')) {
|
|
31 |
$controls->messages .= $r . ' message(s) deleted';
|
32 |
}
|
33 |
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
?>
|
36 |
|
37 |
<div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
|
@@ -49,10 +61,11 @@ $emails = $module->get_emails('message');
|
|
49 |
<form method="post" action="">
|
50 |
<?php $controls->init(); ?>
|
51 |
|
52 |
-
<
|
53 |
-
|
54 |
-
|
55 |
-
|
|
|
56 |
<table class="widefat tnp-newsletters-list" style="width: 100%">
|
57 |
<thead>
|
58 |
<tr>
|
@@ -94,11 +107,11 @@ $emails = $module->get_emails('message');
|
|
94 |
<td>
|
95 |
<?php echo $module->get_edit_button($email) ?>
|
96 |
</td>
|
97 |
-
|
98 |
<td>
|
99 |
-
<a class="button-primary" href="<?php echo NewsletterStatistics::instance()->get_statistics_url($email->id); ?>"><i class="
|
100 |
</td>
|
101 |
-
<td><a class="button-primary" target="_blank" rel="noopener" href="<?php echo home_url('/')?>?na=view&id=<?php echo $email->id; ?>"><i class="
|
102 |
<td><?php $controls->button_copy($email->id); ?></td>
|
103 |
<td><?php $controls->button_delete($email->id); ?></td>
|
104 |
</tr>
|
2 |
defined('ABSPATH') || exit;
|
3 |
|
4 |
require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
|
5 |
+
require_once NEWSLETTER_INCLUDES_DIR . '/paginator.php';
|
6 |
+
|
7 |
$controls = new NewsletterControls();
|
8 |
$module = NewsletterEmails::instance();
|
9 |
|
33 |
$controls->messages .= $r . ' message(s) deleted';
|
34 |
}
|
35 |
|
36 |
+
/* ====================================== */
|
37 |
+
/* ======= PAGINATION CONTROLLERS ======= */
|
38 |
+
/* ====================================== */
|
39 |
+
|
40 |
+
$pagination_controller = new TNP_Pagination_Controller( NEWSLETTER_EMAILS_TABLE, 'id', [ 'type' => 'message' ] );
|
41 |
+
$emails = $pagination_controller->get_items();
|
42 |
+
|
43 |
+
/* ====================================== */
|
44 |
+
/* ===== END PAGINATION CONTROLLERS ===== */
|
45 |
+
/* ====================================== */
|
46 |
+
|
47 |
?>
|
48 |
|
49 |
<div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
|
61 |
<form method="post" action="">
|
62 |
<?php $controls->init(); ?>
|
63 |
|
64 |
+
<a href="<?php echo $module->get_admin_page_url('theme'); ?>" class="button-primary"><?php _e('New newsletter', 'newsletter') ?></a>
|
65 |
+
<?php $controls->button_confirm('delete_selected', __('Delete selected newsletters', 'newsletter')); ?>
|
66 |
+
|
67 |
+
<?php $pagination_controller->display_paginator(); ?>
|
68 |
+
|
69 |
<table class="widefat tnp-newsletters-list" style="width: 100%">
|
70 |
<thead>
|
71 |
<tr>
|
107 |
<td>
|
108 |
<?php echo $module->get_edit_button($email) ?>
|
109 |
</td>
|
110 |
+
|
111 |
<td>
|
112 |
+
<a class="button-primary" href="<?php echo NewsletterStatistics::instance()->get_statistics_url($email->id); ?>"><i class="fas fa-chart-bar"></i> <?php _e('Statistics', 'newsletter') ?></a>
|
113 |
</td>
|
114 |
+
<td><a class="button-primary" target="_blank" rel="noopener" href="<?php echo home_url('/')?>?na=view&id=<?php echo $email->id; ?>"><i class="fas fa-eye"></i> <?php _e('View', 'newsletter')?></a></td>
|
115 |
<td><?php $controls->button_copy($email->id); ?></td>
|
116 |
<td><?php $controls->button_delete($email->id); ?></td>
|
117 |
</tr>
|
emails/themes/default/images/soundcloud.png
CHANGED
Binary file
|
emails/themes/default/images/telegram.png
ADDED
Binary file
|
emails/themes/default/images/vk.png
ADDED
Binary file
|
emails/tnp-composer/index-v2.php
CHANGED
@@ -91,7 +91,9 @@ $fields = new NewsletterFields($controls);
|
|
91 |
|
92 |
<form id="tnpc-global-styles-form">
|
93 |
|
94 |
-
|
|
|
|
|
95 |
</form>
|
96 |
|
97 |
</div>
|
91 |
|
92 |
<form id="tnpc-global-styles-form">
|
93 |
|
94 |
+
<?php $fields->color( 'options_composer_background', __( 'Background color', 'newsletter' ), [ 'default' => '#f4f4f4' ] ) ?>
|
95 |
+
<?php $fields->text( 'options_preheader', __( 'Snippet', 'newsletter' ), ['description'=>'Short content preview shown by Gmail']) ?>
|
96 |
+
|
97 |
</form>
|
98 |
|
99 |
</div>
|
includes/addon.php
CHANGED
@@ -10,6 +10,7 @@ class NewsletterAddon {
|
|
10 |
var $name;
|
11 |
var $options;
|
12 |
var $version;
|
|
|
13 |
|
14 |
public function __construct($name, $version = '0.0.0') {
|
15 |
$this->name = $name;
|
@@ -43,6 +44,18 @@ class NewsletterAddon {
|
|
43 |
|
44 |
}
|
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
/**
|
47 |
* General logger for this add-on.
|
48 |
*
|
@@ -70,13 +83,26 @@ class NewsletterAddon {
|
|
70 |
/**
|
71 |
* Loads and prepares the options. It can be used to late initialize the options to save some resources on
|
72 |
* add-ons which do not need to do something on each page load.
|
73 |
-
* @return array
|
74 |
*/
|
75 |
function setup_options() {
|
76 |
if ($this->options) {
|
77 |
return;
|
78 |
}
|
79 |
-
$this->options = get_option('newsletter_' . $this->name,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
}
|
81 |
|
82 |
/**
|
@@ -84,17 +110,45 @@ class NewsletterAddon {
|
|
84 |
* property.
|
85 |
* @param array $options
|
86 |
*/
|
87 |
-
function save_options($options) {
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
|
|
90 |
}
|
91 |
|
92 |
function merge_defaults($defaults) {
|
93 |
-
$options = get_option('newsletter_' . $this->name,
|
94 |
$options = array_merge($defaults, $options);
|
95 |
$this->save_options($options);
|
96 |
}
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
/**
|
99 |
* Equivalent to $wpdb->query() but logs the event in case of error.
|
100 |
*
|
@@ -116,7 +170,7 @@ class NewsletterAddon {
|
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
-
* Used by
|
120 |
* are interpreted automatically.
|
121 |
*
|
122 |
* They are:
|
@@ -163,8 +217,8 @@ class NewsletterMailerAddon extends NewsletterAddon {
|
|
163 |
update_option('newsletter_' . $this->name . '_last_run', $time);
|
164 |
}
|
165 |
|
166 |
-
function save_options($options) {
|
167 |
-
parent::save_options($options);
|
168 |
$this->enabled = !empty($options['enabled']);
|
169 |
}
|
170 |
|
@@ -200,7 +254,7 @@ class NewsletterMailerAddon extends NewsletterAddon {
|
|
200 |
if ($type) {
|
201 |
$message->subject .= ' - ' . $type . ' only';
|
202 |
}
|
203 |
-
|
204 |
$message->from = Newsletter::instance()->options['sender_email'];
|
205 |
$message->from_name = Newsletter::instance()->options['sender_name'];
|
206 |
return $message;
|
10 |
var $name;
|
11 |
var $options;
|
12 |
var $version;
|
13 |
+
var $labels;
|
14 |
|
15 |
public function __construct($name, $version = '0.0.0') {
|
16 |
$this->name = $name;
|
44 |
|
45 |
}
|
46 |
|
47 |
+
function get_current_language() {
|
48 |
+
return Newsletter::instance()->get_current_language();
|
49 |
+
}
|
50 |
+
|
51 |
+
function is_all_languages() {
|
52 |
+
return Newsletter::instance()->is_all_languages();
|
53 |
+
}
|
54 |
+
|
55 |
+
function is_allowed() {
|
56 |
+
return Newsletter::instance()->is_allowed();
|
57 |
+
}
|
58 |
+
|
59 |
/**
|
60 |
* General logger for this add-on.
|
61 |
*
|
83 |
/**
|
84 |
* Loads and prepares the options. It can be used to late initialize the options to save some resources on
|
85 |
* add-ons which do not need to do something on each page load.
|
|
|
86 |
*/
|
87 |
function setup_options() {
|
88 |
if ($this->options) {
|
89 |
return;
|
90 |
}
|
91 |
+
$this->options = get_option('newsletter_' . $this->name, []);
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Retrieve the stored options, merged with the specified language set.
|
96 |
+
*
|
97 |
+
* @param string $language
|
98 |
+
* @return array
|
99 |
+
*/
|
100 |
+
function get_options($language = '') {
|
101 |
+
if ($language) {
|
102 |
+
return array_merge(get_option('newsletter_' . $this->name, []), get_option('newsletter_' . $this->name . '_' . $language, []));
|
103 |
+
} else {
|
104 |
+
return get_option('newsletter_' . $this->name, []);
|
105 |
+
}
|
106 |
}
|
107 |
|
108 |
/**
|
110 |
* property.
|
111 |
* @param array $options
|
112 |
*/
|
113 |
+
function save_options($options, $language = '') {
|
114 |
+
if ($language) {
|
115 |
+
update_option('newsletter_' . $this->name . '_' . $language, $options);
|
116 |
+
} else {
|
117 |
+
update_option('newsletter_' . $this->name, $options);
|
118 |
+
$this->options = $options;
|
119 |
+
}
|
120 |
}
|
121 |
|
122 |
function merge_defaults($defaults) {
|
123 |
+
$options = get_option('newsletter_' . $this->name, []);
|
124 |
$options = array_merge($defaults, $options);
|
125 |
$this->save_options($options);
|
126 |
}
|
127 |
|
128 |
+
/**
|
129 |
+
*
|
130 |
+
*/
|
131 |
+
function setup_labels() {
|
132 |
+
if (!$this->labels) {
|
133 |
+
$labels = [];
|
134 |
+
}
|
135 |
+
}
|
136 |
+
|
137 |
+
function get_label($key) {
|
138 |
+
if (!$this->options)
|
139 |
+
$this->setup_options();
|
140 |
+
|
141 |
+
if (!empty($this->options[$key])) {
|
142 |
+
return $this->options[$key];
|
143 |
+
}
|
144 |
+
|
145 |
+
if (!$this->labels)
|
146 |
+
$this->setup_labels();
|
147 |
+
|
148 |
+
// We assume the required key is defined. If not there is an error elsewhere.
|
149 |
+
return $this->labels[$key];
|
150 |
+
}
|
151 |
+
|
152 |
/**
|
153 |
* Equivalent to $wpdb->query() but logs the event in case of error.
|
154 |
*
|
170 |
}
|
171 |
|
172 |
/**
|
173 |
+
* Used by mailer add-ons as base-class. Some specific options collected by the mailer
|
174 |
* are interpreted automatically.
|
175 |
*
|
176 |
* They are:
|
217 |
update_option('newsletter_' . $this->name . '_last_run', $time);
|
218 |
}
|
219 |
|
220 |
+
function save_options($options, $language = '') {
|
221 |
+
parent::save_options($options, $language);
|
222 |
$this->enabled = !empty($options['enabled']);
|
223 |
}
|
224 |
|
254 |
if ($type) {
|
255 |
$message->subject .= ' - ' . $type . ' only';
|
256 |
}
|
257 |
+
|
258 |
$message->from = Newsletter::instance()->options['sender_email'];
|
259 |
$message->from_name = Newsletter::instance()->options['sender_name'];
|
260 |
return $message;
|
includes/composer.php
CHANGED
@@ -91,10 +91,25 @@ class TNP_Composer {
|
|
91 |
$open .= "\n</style>\n";
|
92 |
$open .= "</head>\n";
|
93 |
$open .= '<body style="margin: 0; padding: 0;" dir="' . (is_rtl() ? 'rtl' : 'ltr') . '">';
|
94 |
-
|
|
|
|
|
95 |
return $open;
|
96 |
}
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
static function get_html_close($email) {
|
99 |
return "</body>\n</html>";
|
100 |
}
|
@@ -255,9 +270,26 @@ class TNP_Composer {
|
|
255 |
return false;
|
256 |
}
|
257 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
258 |
static function button($options, $prefix = 'button') {
|
259 |
$defaults = [
|
260 |
-
'
|
261 |
$prefix . '_font_family' => 'Helvetica, Arial, sans-serif',
|
262 |
$prefix . '_label' => 'Click Here',
|
263 |
$prefix . '_font_color' => '#ffffff',
|
@@ -265,9 +297,9 @@ class TNP_Composer {
|
|
265 |
$prefix . '_font_size' => 20,
|
266 |
$prefix . '_background' => '#256F9C',
|
267 |
];
|
268 |
-
|
269 |
$options = array_merge($defaults, $options);
|
270 |
-
|
271 |
$b = '<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:separate;line-height:100%;">';
|
272 |
$b .= '<tr>';
|
273 |
$b .= '<td align="center" bgcolor="' . $options[$prefix . '_background'] . '" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:' . $options[$prefix . '_background'] . '" valign="middle">';
|
@@ -282,7 +314,7 @@ class TNP_Composer {
|
|
282 |
|
283 |
/**
|
284 |
* Generates an IMG tag, linked if the media has an URL.
|
285 |
-
*
|
286 |
* @param TNP_Media $media
|
287 |
* @return string
|
288 |
*/
|
@@ -308,7 +340,7 @@ class TNP_Composer {
|
|
308 |
* Returns a WP media ID for the specified post (or false if nothing can be found)
|
309 |
* looking for the featured image or, if missing, taking the first media in the gallery and
|
310 |
* if again missing, searching the first reference to a media in the post content.
|
311 |
-
*
|
312 |
* @param int $post_id
|
313 |
* @return int
|
314 |
*/
|
@@ -371,6 +403,7 @@ class TNP_Composer_Grid_System {
|
|
371 |
public function __construct($columns_per_row) {
|
372 |
$this->cells_per_row = $columns_per_row;
|
373 |
$this->cells_counter = 0;
|
|
|
374 |
}
|
375 |
|
376 |
public function __toString() {
|
91 |
$open .= "\n</style>\n";
|
92 |
$open .= "</head>\n";
|
93 |
$open .= '<body style="margin: 0; padding: 0;" dir="' . (is_rtl() ? 'rtl' : 'ltr') . '">';
|
94 |
+
$open .= "\n";
|
95 |
+
$open .= self::get_html_preheader( $email );
|
96 |
+
|
97 |
return $open;
|
98 |
}
|
99 |
|
100 |
+
static private function get_html_preheader( $email ) {
|
101 |
+
|
102 |
+
if ( empty ( $email->options['preheader'] ) ) {
|
103 |
+
return "";
|
104 |
+
}
|
105 |
+
|
106 |
+
$preheader_text = $email->options['preheader'];
|
107 |
+
$html = "<div style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">$preheader_text</div>";
|
108 |
+
$html .= "\n";
|
109 |
+
|
110 |
+
return $html;
|
111 |
+
}
|
112 |
+
|
113 |
static function get_html_close($email) {
|
114 |
return "</body>\n</html>";
|
115 |
}
|
270 |
return false;
|
271 |
}
|
272 |
|
273 |
+
/**
|
274 |
+
* Creates the HTML for a button extrating from the options, with the provided prefix, the button attributes:
|
275 |
+
*
|
276 |
+
* - [prefix]_url The button URL
|
277 |
+
* - [prefix]_font_family
|
278 |
+
* - [prefix]_font_size
|
279 |
+
* - [prefix]_font_weight
|
280 |
+
* - [prefix]_label
|
281 |
+
* - [prefix]_font_color The label color
|
282 |
+
* - [prefix]_background The button color
|
283 |
+
*
|
284 |
+
* TODO: Add radius and possiblt the alignment
|
285 |
+
*
|
286 |
+
* @param array $options
|
287 |
+
* @param string $prefix
|
288 |
+
* @return string
|
289 |
+
*/
|
290 |
static function button($options, $prefix = 'button') {
|
291 |
$defaults = [
|
292 |
+
$prefix . '_url' => '#',
|
293 |
$prefix . '_font_family' => 'Helvetica, Arial, sans-serif',
|
294 |
$prefix . '_label' => 'Click Here',
|
295 |
$prefix . '_font_color' => '#ffffff',
|
297 |
$prefix . '_font_size' => 20,
|
298 |
$prefix . '_background' => '#256F9C',
|
299 |
];
|
300 |
+
|
301 |
$options = array_merge($defaults, $options);
|
302 |
+
|
303 |
$b = '<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:separate;line-height:100%;">';
|
304 |
$b .= '<tr>';
|
305 |
$b .= '<td align="center" bgcolor="' . $options[$prefix . '_background'] . '" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:' . $options[$prefix . '_background'] . '" valign="middle">';
|
314 |
|
315 |
/**
|
316 |
* Generates an IMG tag, linked if the media has an URL.
|
317 |
+
*
|
318 |
* @param TNP_Media $media
|
319 |
* @return string
|
320 |
*/
|
340 |
* Returns a WP media ID for the specified post (or false if nothing can be found)
|
341 |
* looking for the featured image or, if missing, taking the first media in the gallery and
|
342 |
* if again missing, searching the first reference to a media in the post content.
|
343 |
+
*
|
344 |
* @param int $post_id
|
345 |
* @return int
|
346 |
*/
|
403 |
public function __construct($columns_per_row) {
|
404 |
$this->cells_per_row = $columns_per_row;
|
405 |
$this->cells_counter = 0;
|
406 |
+
$this->rows = [];
|
407 |
}
|
408 |
|
409 |
public function __toString() {
|
includes/controls.php
CHANGED
@@ -427,6 +427,12 @@ class NewsletterControls {
|
|
427 |
}
|
428 |
$this->warnings[] = 'You are configuring the language <strong>' . $newsletter->get_language_label($current_language) . '</strong>. Switch to "all languages" to see all options.';
|
429 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
430 |
|
431 |
function hint($text, $url = '') {
|
432 |
echo '<div class="hints">';
|
@@ -1208,6 +1214,11 @@ class NewsletterControls {
|
|
1208 |
$lists = $this->get_list_options($empty_label);
|
1209 |
$this->select($name, $lists);
|
1210 |
}
|
|
|
|
|
|
|
|
|
|
|
1211 |
|
1212 |
/**
|
1213 |
* Generates an associative array with the active lists to be used in a select.
|
@@ -1225,6 +1236,18 @@ class NewsletterControls {
|
|
1225 |
}
|
1226 |
return $lists;
|
1227 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1228 |
|
1229 |
function date($name) {
|
1230 |
$this->hidden($name);
|
427 |
}
|
428 |
$this->warnings[] = 'You are configuring the language <strong>' . $newsletter->get_language_label($current_language) . '</strong>. Switch to "all languages" to see all options.';
|
429 |
}
|
430 |
+
|
431 |
+
function switch_to_all_languages_notice() {
|
432 |
+
echo '<div class="tnp-control-all-languages-notice">';
|
433 |
+
_e('Switch the administration side to "all languages" to set these options', 'newsletter');
|
434 |
+
echo '</div>';
|
435 |
+
}
|
436 |
|
437 |
function hint($text, $url = '') {
|
438 |
echo '<div class="hints">';
|
1214 |
$lists = $this->get_list_options($empty_label);
|
1215 |
$this->select($name, $lists);
|
1216 |
}
|
1217 |
+
|
1218 |
+
function public_lists_select($name = 'list', $empty_label = null) {
|
1219 |
+
$lists = $this->get_public_list_options($empty_label);
|
1220 |
+
$this->select($name, $lists);
|
1221 |
+
}
|
1222 |
|
1223 |
/**
|
1224 |
* Generates an associative array with the active lists to be used in a select.
|
1236 |
}
|
1237 |
return $lists;
|
1238 |
}
|
1239 |
+
|
1240 |
+
function get_public_list_options($empty_label = null) {
|
1241 |
+
$objs = Newsletter::instance()->get_lists_public();
|
1242 |
+
$lists = array();
|
1243 |
+
if ($empty_label) {
|
1244 |
+
$lists[''] = $empty_label;
|
1245 |
+
}
|
1246 |
+
foreach ($objs as $list) {
|
1247 |
+
$lists['' . $list->id] = '(' . $list->id . ') ' . esc_html($list->name);
|
1248 |
+
}
|
1249 |
+
return $lists;
|
1250 |
+
}
|
1251 |
|
1252 |
function date($name) {
|
1253 |
$this->hidden($name);
|
includes/mailer.php
CHANGED
@@ -112,14 +112,13 @@ class NewsletterMailer {
|
|
112 |
}
|
113 |
|
114 |
/**
|
115 |
-
*
|
116 |
* @return NewsletterLogger
|
117 |
*/
|
118 |
function get_logger() {
|
119 |
if ($this->logger) {
|
120 |
return $this->logger;
|
121 |
}
|
122 |
-
$this->logger = new NewsletterLogger(
|
123 |
return $this->logger;
|
124 |
}
|
125 |
|
112 |
}
|
113 |
|
114 |
/**
|
|
|
115 |
* @return NewsletterLogger
|
116 |
*/
|
117 |
function get_logger() {
|
118 |
if ($this->logger) {
|
119 |
return $this->logger;
|
120 |
}
|
121 |
+
$this->logger = new NewsletterLogger($this->name . '-mailer');
|
122 |
return $this->logger;
|
123 |
}
|
124 |
|
includes/module.php
CHANGED
@@ -106,7 +106,7 @@ class TNP_Profile {
|
|
106 |
function is_private() {
|
107 |
return $this->status == self::STATUS_PRIVATE;
|
108 |
}
|
109 |
-
|
110 |
function show_on_profile() {
|
111 |
return $this->status == self::STATUS_PROFILE_ONLY || $this->status == self::STATUS_PUBLIC;
|
112 |
}
|
@@ -363,6 +363,8 @@ class NewsletterModule {
|
|
363 |
*/
|
364 |
var $themes;
|
365 |
var $components;
|
|
|
|
|
366 |
|
367 |
function __construct($module, $version, $module_id = null, $components = array()) {
|
368 |
$this->module = $module;
|
@@ -1059,7 +1061,7 @@ class NewsletterModule {
|
|
1059 |
return $email->total > 0 ? intval($email->sent / $email->total * 100) : 0;
|
1060 |
}
|
1061 |
|
1062 |
-
function show_email_progress_bar($email, $attrs =
|
1063 |
|
1064 |
$email = (object) $email;
|
1065 |
|
@@ -1069,6 +1071,7 @@ class NewsletterModule {
|
|
1069 |
if ($attrs['scheduled']) {
|
1070 |
echo '<span class="tnp-progress-date">', $this->format_date($email->send_on), '</span>';
|
1071 |
}
|
|
|
1072 |
} else if ($email->status == 'new') {
|
1073 |
echo '';
|
1074 |
return;
|
@@ -1078,11 +1081,6 @@ class NewsletterModule {
|
|
1078 |
$percent = $this->get_email_progress($email);
|
1079 |
}
|
1080 |
|
1081 |
-
|
1082 |
-
$label = $percent;
|
1083 |
-
if ($attrs['format'] == 'numbers') {
|
1084 |
-
$label = $email->sent . ' ' . __('of', 'newsletter') . ' ' . $email->total;
|
1085 |
-
}
|
1086 |
echo '<div class="tnp-progress ', $email->status, '">';
|
1087 |
echo '<div class="tnp-progress-bar" role="progressbar" style="width: ', $percent, '%;"> ', $percent, '% </div>';
|
1088 |
echo '</div>';
|
@@ -1339,10 +1337,10 @@ class NewsletterModule {
|
|
1339 |
function get_profiles($language = '') {
|
1340 |
return TNP_Profile_Service::get_profiles($language);
|
1341 |
}
|
1342 |
-
|
1343 |
/**
|
1344 |
* Returns a list of TNP_Profile which are public.
|
1345 |
-
*
|
1346 |
* @staticvar array $profiles
|
1347 |
* @param string $language
|
1348 |
* @return TNP_Profile[]
|
@@ -1352,17 +1350,17 @@ class NewsletterModule {
|
|
1352 |
if (isset($profiles[$language])) {
|
1353 |
return $profiles[$language];
|
1354 |
}
|
1355 |
-
|
1356 |
$profiles[$language] = [];
|
1357 |
$all = $this->get_profiles($language);
|
1358 |
foreach ($all as $profile) {
|
1359 |
if ($profile->is_private()) continue;
|
1360 |
-
|
1361 |
$profiles[$language]['' . $profile->id] = $profile;
|
1362 |
}
|
1363 |
return $profiles[$language];
|
1364 |
}
|
1365 |
-
|
1366 |
/**
|
1367 |
* Really bad name!
|
1368 |
* @staticvar array $profiles
|
@@ -1374,16 +1372,16 @@ class NewsletterModule {
|
|
1374 |
if (isset($profiles[$language])) {
|
1375 |
return $profiles[$language];
|
1376 |
}
|
1377 |
-
|
1378 |
$profiles[$language] = [];
|
1379 |
$all = $this->get_profiles($language);
|
1380 |
foreach ($all as $profile) {
|
1381 |
if (!$profile->show_on_profile()) continue;
|
1382 |
-
|
1383 |
$profiles[$language]['' . $profile->id] = $profile;
|
1384 |
}
|
1385 |
return $profiles[$language];
|
1386 |
-
}
|
1387 |
|
1388 |
/**
|
1389 |
* @param string $language The language for the list labels (it does not affect the lists returned)
|
@@ -2065,8 +2063,9 @@ class NewsletterModule {
|
|
2065 |
|
2066 |
public static function antibot_form_check($captcha = false) {
|
2067 |
|
2068 |
-
|
2069 |
-
|
|
|
2070 |
|
2071 |
if (strtolower($_SERVER['REQUEST_METHOD']) != 'post') {
|
2072 |
return false;
|
@@ -2248,6 +2247,10 @@ class NewsletterModule {
|
|
2248 |
$text = str_replace("\n", "\r\n", $text);
|
2249 |
return $text;
|
2250 |
}
|
|
|
|
|
|
|
|
|
2251 |
|
2252 |
/**
|
2253 |
* Return the current language code. Optionally, if a user is passed and it has a language
|
@@ -2262,6 +2265,10 @@ class NewsletterModule {
|
|
2262 |
if ($user && $user->language) {
|
2263 |
return $user->language;
|
2264 |
}
|
|
|
|
|
|
|
|
|
2265 |
|
2266 |
// WPML
|
2267 |
if (class_exists('SitePress')) {
|
106 |
function is_private() {
|
107 |
return $this->status == self::STATUS_PRIVATE;
|
108 |
}
|
109 |
+
|
110 |
function show_on_profile() {
|
111 |
return $this->status == self::STATUS_PROFILE_ONLY || $this->status == self::STATUS_PUBLIC;
|
112 |
}
|
363 |
*/
|
364 |
var $themes;
|
365 |
var $components;
|
366 |
+
|
367 |
+
static $current_language = '';
|
368 |
|
369 |
function __construct($module, $version, $module_id = null, $components = array()) {
|
370 |
$this->module = $module;
|
1061 |
return $email->total > 0 ? intval($email->sent / $email->total * 100) : 0;
|
1062 |
}
|
1063 |
|
1064 |
+
function show_email_progress_bar($email, $attrs = []) {
|
1065 |
|
1066 |
$email = (object) $email;
|
1067 |
|
1071 |
if ($attrs['scheduled']) {
|
1072 |
echo '<span class="tnp-progress-date">', $this->format_date($email->send_on), '</span>';
|
1073 |
}
|
1074 |
+
return;
|
1075 |
} else if ($email->status == 'new') {
|
1076 |
echo '';
|
1077 |
return;
|
1081 |
$percent = $this->get_email_progress($email);
|
1082 |
}
|
1083 |
|
|
|
|
|
|
|
|
|
|
|
1084 |
echo '<div class="tnp-progress ', $email->status, '">';
|
1085 |
echo '<div class="tnp-progress-bar" role="progressbar" style="width: ', $percent, '%;"> ', $percent, '% </div>';
|
1086 |
echo '</div>';
|
1337 |
function get_profiles($language = '') {
|
1338 |
return TNP_Profile_Service::get_profiles($language);
|
1339 |
}
|
1340 |
+
|
1341 |
/**
|
1342 |
* Returns a list of TNP_Profile which are public.
|
1343 |
+
*
|
1344 |
* @staticvar array $profiles
|
1345 |
* @param string $language
|
1346 |
* @return TNP_Profile[]
|
1350 |
if (isset($profiles[$language])) {
|
1351 |
return $profiles[$language];
|
1352 |
}
|
1353 |
+
|
1354 |
$profiles[$language] = [];
|
1355 |
$all = $this->get_profiles($language);
|
1356 |
foreach ($all as $profile) {
|
1357 |
if ($profile->is_private()) continue;
|
1358 |
+
|
1359 |
$profiles[$language]['' . $profile->id] = $profile;
|
1360 |
}
|
1361 |
return $profiles[$language];
|
1362 |
}
|
1363 |
+
|
1364 |
/**
|
1365 |
* Really bad name!
|
1366 |
* @staticvar array $profiles
|
1372 |
if (isset($profiles[$language])) {
|
1373 |
return $profiles[$language];
|
1374 |
}
|
1375 |
+
|
1376 |
$profiles[$language] = [];
|
1377 |
$all = $this->get_profiles($language);
|
1378 |
foreach ($all as $profile) {
|
1379 |
if (!$profile->show_on_profile()) continue;
|
1380 |
+
|
1381 |
$profiles[$language]['' . $profile->id] = $profile;
|
1382 |
}
|
1383 |
return $profiles[$language];
|
1384 |
+
}
|
1385 |
|
1386 |
/**
|
1387 |
* @param string $language The language for the list labels (it does not affect the lists returned)
|
2063 |
|
2064 |
public static function antibot_form_check($captcha = false) {
|
2065 |
|
2066 |
+
if ( defined( 'NEWSLETTER_ANTIBOT' ) && ! NEWSLETTER_ANTIBOT ) {
|
2067 |
+
return true;
|
2068 |
+
}
|
2069 |
|
2070 |
if (strtolower($_SERVER['REQUEST_METHOD']) != 'post') {
|
2071 |
return false;
|
2247 |
$text = str_replace("\n", "\r\n", $text);
|
2248 |
return $text;
|
2249 |
}
|
2250 |
+
|
2251 |
+
function set_current_language($language) {
|
2252 |
+
self::$current_language = $language;
|
2253 |
+
}
|
2254 |
|
2255 |
/**
|
2256 |
* Return the current language code. Optionally, if a user is passed and it has a language
|
2265 |
if ($user && $user->language) {
|
2266 |
return $user->language;
|
2267 |
}
|
2268 |
+
|
2269 |
+
if (!empty(self::$current_language)) {
|
2270 |
+
return self::$current_language;
|
2271 |
+
}
|
2272 |
|
2273 |
// WPML
|
2274 |
if (class_exists('SitePress')) {
|
includes/paginator.php
ADDED
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
|
4 |
+
|
5 |
+
class TNP_Pagination_Controller {
|
6 |
+
|
7 |
+
private $items_per_page;
|
8 |
+
private $total_items;
|
9 |
+
private $filters;
|
10 |
+
private $columns;
|
11 |
+
private $controls;
|
12 |
+
private $items;
|
13 |
+
private $current_page;
|
14 |
+
private $last_page;
|
15 |
+
private $table;
|
16 |
+
private $orderby_column;
|
17 |
+
|
18 |
+
public function __construct( $table, $orderby_column, $filters = [], $items_per_page = 20, $columns = [] ) {
|
19 |
+
$this->table = $table;
|
20 |
+
$this->orderby_column = $orderby_column;
|
21 |
+
$this->items_per_page = $items_per_page;
|
22 |
+
$this->columns = $columns;
|
23 |
+
$this->filters = $filters;
|
24 |
+
$this->total_items = $this->get_total_items();
|
25 |
+
$this->controls = new NewsletterControls();
|
26 |
+
$this->current_page = $this->compute_current_page();
|
27 |
+
}
|
28 |
+
|
29 |
+
public function get_current_page() {
|
30 |
+
return $this->current_page;
|
31 |
+
}
|
32 |
+
|
33 |
+
private function compute_current_page() {
|
34 |
+
|
35 |
+
$current_page = ! empty( $this->controls->data['search_page'] ) ? (int) $this->controls->data['search_page'] : 1;
|
36 |
+
|
37 |
+
if ( $this->controls->is_action( 'last' ) ) {
|
38 |
+
$current_page = $this->get_last_page();
|
39 |
+
}
|
40 |
+
if ( $this->controls->is_action( 'first' ) || $this->controls->is_action( 'search' ) ) {
|
41 |
+
$current_page = 1;
|
42 |
+
}
|
43 |
+
if ( $this->controls->is_action( 'next' ) ) {
|
44 |
+
$current_page ++;
|
45 |
+
}
|
46 |
+
if ( $this->controls->is_action( 'prev' ) ) {
|
47 |
+
$current_page --;
|
48 |
+
}
|
49 |
+
|
50 |
+
// Eventually fix the page
|
51 |
+
if ( $current_page <= 0 ) {
|
52 |
+
$current_page = 1;
|
53 |
+
}
|
54 |
+
|
55 |
+
if ( $current_page > $this->get_last_page() ) {
|
56 |
+
$current_page = $this->get_last_page();
|
57 |
+
}
|
58 |
+
|
59 |
+
$this->controls->data['search_page'] = $current_page;
|
60 |
+
|
61 |
+
return $current_page;
|
62 |
+
|
63 |
+
}
|
64 |
+
|
65 |
+
public function get_last_page() {
|
66 |
+
|
67 |
+
if ( is_null( $this->last_page ) ) {
|
68 |
+
$this->last_page = (int) floor( $this->total_items / $this->items_per_page ) + ( $this->total_items % $this->items_per_page > 0 ? 1 : 0 );
|
69 |
+
}
|
70 |
+
|
71 |
+
return $this->last_page;
|
72 |
+
|
73 |
+
}
|
74 |
+
|
75 |
+
public function get_items() {
|
76 |
+
|
77 |
+
if ( is_null( $this->items ) ) {
|
78 |
+
if ( $this->total_items > 0 ) {
|
79 |
+
global $wpdb;
|
80 |
+
$query = $wpdb->prepare( "SELECT " . $this->get_columns_query() . " FROM " . $this->table . $this->get_where_clause() . " ORDER BY " . $this->orderby_column . " DESC LIMIT %d,%d",
|
81 |
+
( $this->current_page - 1 ) * $this->items_per_page, $this->items_per_page );
|
82 |
+
|
83 |
+
$this->items = $wpdb->get_results( $query, OBJECT );
|
84 |
+
} else {
|
85 |
+
$this->items = [];
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
return $this->items;
|
90 |
+
|
91 |
+
}
|
92 |
+
|
93 |
+
private function get_columns_query() {
|
94 |
+
if ( empty( $this->columns ) ) {
|
95 |
+
return " * ";
|
96 |
+
} else {
|
97 |
+
return " " . implode( ',', $this->columns ) . " ";
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
public function get_total_items() {
|
102 |
+
|
103 |
+
if ( is_null( $this->total_items ) ) {
|
104 |
+
$this->total_items = Newsletter::instance()->store->get_count( $this->table, $this->get_where_clause() );
|
105 |
+
}
|
106 |
+
|
107 |
+
return $this->total_items;
|
108 |
+
}
|
109 |
+
|
110 |
+
private function get_where_clause() {
|
111 |
+
if ( empty( $this->filters ) ) {
|
112 |
+
return ' ';
|
113 |
+
}
|
114 |
+
|
115 |
+
$where = ' where ';
|
116 |
+
foreach ( $this->filters as $column => $value ) {
|
117 |
+
$where .= "$column=%s ";
|
118 |
+
}
|
119 |
+
|
120 |
+
global $wpdb;
|
121 |
+
$where = $wpdb->prepare( $where, array_values( $this->filters ) );
|
122 |
+
|
123 |
+
return $where;
|
124 |
+
}
|
125 |
+
|
126 |
+
public function display_paginator() {
|
127 |
+
|
128 |
+
?>
|
129 |
+
|
130 |
+
<div class="tnp-paginator">
|
131 |
+
|
132 |
+
<?php $this->controls->button( 'first', '«' ); ?>
|
133 |
+
<?php $this->controls->button( 'prev', '‹' ); ?>
|
134 |
+
<?php $this->controls->text( 'search_page', 3 ); ?>
|
135 |
+
of <?php echo $this->last_page ?> <?php $this->controls->button( 'go', __( 'Go', 'newsletter' ) ); ?>
|
136 |
+
<?php $this->controls->button( 'next', '›' ); ?>
|
137 |
+
<?php $this->controls->button( 'last', '»' ); ?>
|
138 |
+
<?php echo $this->get_total_items() ?> <?php _e( 'newsletter(s) found', 'newsletter' ) ?>
|
139 |
+
|
140 |
+
</div>
|
141 |
+
|
142 |
+
<?php
|
143 |
+
|
144 |
+
}
|
145 |
+
|
146 |
+
|
147 |
+
}
|
main/defaults-info.php
CHANGED
@@ -15,5 +15,7 @@ $options = array(
|
|
15 |
'tumblr_url' => '',
|
16 |
'youtube_url' => '',
|
17 |
'vimeo_url' => '',
|
18 |
-
'soundcloud_url' => ''
|
|
|
|
|
19 |
);
|
15 |
'tumblr_url' => '',
|
16 |
'youtube_url' => '',
|
17 |
'vimeo_url' => '',
|
18 |
+
'soundcloud_url' => '',
|
19 |
+
'telegram_url' => '',
|
20 |
+
'vk_url' => ''
|
21 |
);
|
main/defaults.php
CHANGED
@@ -22,7 +22,7 @@ $options = array(
|
|
22 |
'page'=>0,
|
23 |
'disable_cron_notice'=>0,
|
24 |
'do_shortcodes'=>0,
|
25 |
-
|
26 |
'header_logo' => '',
|
27 |
'header_title' => get_bloginfo('name'),
|
28 |
'header_sub' => get_bloginfo('description'),
|
@@ -37,5 +37,7 @@ $options = array(
|
|
37 |
'tumblr_url' => '',
|
38 |
'youtube_url' => '',
|
39 |
'vimeo_url' => '',
|
40 |
-
'soundcloud_url' => ''
|
|
|
|
|
41 |
);
|
22 |
'page'=>0,
|
23 |
'disable_cron_notice'=>0,
|
24 |
'do_shortcodes'=>0,
|
25 |
+
|
26 |
'header_logo' => '',
|
27 |
'header_title' => get_bloginfo('name'),
|
28 |
'header_sub' => get_bloginfo('description'),
|
37 |
'tumblr_url' => '',
|
38 |
'youtube_url' => '',
|
39 |
'vimeo_url' => '',
|
40 |
+
'soundcloud_url' => '',
|
41 |
+
'telegram_url' => '',
|
42 |
+
'vk_url' => ''
|
43 |
);
|
main/info.php
CHANGED
@@ -94,7 +94,7 @@ if (!$controls->is_action()) {
|
|
94 |
<?php $controls->text('footer_legal', 40); ?>
|
95 |
</td>
|
96 |
</tr>
|
97 |
-
</table>
|
98 |
</div>
|
99 |
|
100 |
<div id="tabs-social">
|
@@ -154,6 +154,18 @@ if (!$controls->is_action()) {
|
|
154 |
<?php $controls->text('soundcloud_url', 40); ?>
|
155 |
</td>
|
156 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
</table>
|
158 |
</div>
|
159 |
</div>
|
94 |
<?php $controls->text('footer_legal', 40); ?>
|
95 |
</td>
|
96 |
</tr>
|
97 |
+
</table>
|
98 |
</div>
|
99 |
|
100 |
<div id="tabs-social">
|
154 |
<?php $controls->text('soundcloud_url', 40); ?>
|
155 |
</td>
|
156 |
</tr>
|
157 |
+
<tr>
|
158 |
+
<th>Telegram URL</th>
|
159 |
+
<td>
|
160 |
+
<?php $controls->text('telegram_url', 40); ?>
|
161 |
+
</td>
|
162 |
+
</tr>
|
163 |
+
<tr>
|
164 |
+
<th>VK URL</th>
|
165 |
+
<td>
|
166 |
+
<?php $controls->text('vk_url', 40); ?>
|
167 |
+
</td>
|
168 |
+
</tr>
|
169 |
</table>
|
170 |
</div>
|
171 |
</div>
|
main/main.php
CHANGED
@@ -33,9 +33,10 @@ if (!$controls->is_action()) {
|
|
33 |
} else {
|
34 |
$controls->data['return_path'] = $this->normalize_email($controls->data['return_path']);
|
35 |
}
|
36 |
-
|
37 |
-
$controls->data['scheduler_max'] = (int)$controls->data['scheduler_max'];
|
38 |
-
if ($controls->data['scheduler_max'] < 10)
|
|
|
39 |
|
40 |
|
41 |
if (!$this->is_email($controls->data['reply_to'], true)) {
|
@@ -70,7 +71,7 @@ if (!$controls->is_action()) {
|
|
70 |
$page['comment_status'] = 'closed';
|
71 |
$page['ping_status'] = 'closed';
|
72 |
$page['post_category'] = array(1);
|
73 |
-
|
74 |
$current_language = $this->get_current_language();
|
75 |
$this->switch_language('');
|
76 |
// Insert the post into the database
|
@@ -79,7 +80,7 @@ if (!$controls->is_action()) {
|
|
79 |
|
80 |
$controls->data['page'] = $page_id;
|
81 |
$this->merge_options($controls->data);
|
82 |
-
|
83 |
$controls->messages = 'A new page has been created';
|
84 |
}
|
85 |
}
|
@@ -259,21 +260,6 @@ if (!empty($return_path)) {
|
|
259 |
</p>
|
260 |
|
261 |
<table class="form-table">
|
262 |
-
<tr>
|
263 |
-
<th><?php _e('Disable standard styles', 'newsletter') ?></th>
|
264 |
-
<td>
|
265 |
-
<?php $controls->yesno('css_disabled'); ?>
|
266 |
-
</td>
|
267 |
-
</tr>
|
268 |
-
<tr>
|
269 |
-
<th><?php _e('Custom styles', 'newsletter') ?></th>
|
270 |
-
<td>
|
271 |
-
<?php if (apply_filters('newsletter_enqueue_style', true) === false) { ?>
|
272 |
-
<p><strong>Warning: Newsletter styles and custom styles are disable by your theme or a plugin.</strong></p>
|
273 |
-
<?php } ?>
|
274 |
-
<?php $controls->textarea('css'); ?>
|
275 |
-
</td>
|
276 |
-
</tr>
|
277 |
<tr>
|
278 |
<th><?php _e('Allowed roles', 'newsletter') ?></th>
|
279 |
<td>
|
@@ -292,65 +278,85 @@ if (!empty($return_path)) {
|
|
292 |
|
293 |
</td>
|
294 |
</tr>
|
295 |
-
|
296 |
<tr>
|
297 |
<th>
|
298 |
-
<?php _e('
|
|
|
299 |
</th>
|
300 |
<td>
|
301 |
-
<?php $controls->
|
302 |
</td>
|
303 |
</tr>
|
304 |
-
|
305 |
<tr>
|
306 |
<th>
|
307 |
-
|
|
|
308 |
</th>
|
309 |
<td>
|
310 |
-
|
311 |
</td>
|
312 |
</tr>
|
313 |
-
|
314 |
<tr>
|
315 |
-
<th
|
|
|
|
|
|
|
316 |
<td>
|
317 |
-
<?php $controls->
|
318 |
</td>
|
319 |
</tr>
|
320 |
|
321 |
<tr>
|
322 |
-
<th><?php _e('
|
323 |
<td>
|
324 |
-
<?php $controls->yesno('
|
325 |
-
<p class="description">It can be changed on each newsletter.</p>
|
326 |
</td>
|
327 |
</tr>
|
328 |
-
|
329 |
<tr>
|
330 |
-
<th><?php _e('
|
331 |
<td>
|
332 |
-
<?php
|
|
|
|
|
|
|
333 |
</td>
|
334 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
335 |
|
336 |
<tr>
|
337 |
-
<th
|
|
|
|
|
|
|
338 |
<td>
|
339 |
-
<?php $controls->
|
340 |
-
<?php $controls->help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#encoding') ?>
|
341 |
</td>
|
342 |
</tr>
|
343 |
|
344 |
<tr>
|
345 |
<th>
|
346 |
-
<?php _e('
|
347 |
-
<?php $controls->field_help(
|
348 |
</th>
|
349 |
<td>
|
350 |
-
<?php $controls->
|
351 |
-
<?php $controls->field_help("https://www.thenewsletterplugin.com/documentation/newsletter-configuration#shortcodes") ?>
|
352 |
</td>
|
353 |
</tr>
|
|
|
|
|
354 |
</table>
|
355 |
|
356 |
</div>
|
33 |
} else {
|
34 |
$controls->data['return_path'] = $this->normalize_email($controls->data['return_path']);
|
35 |
}
|
36 |
+
|
37 |
+
$controls->data['scheduler_max'] = (int) $controls->data['scheduler_max'];
|
38 |
+
if ($controls->data['scheduler_max'] < 10)
|
39 |
+
$controls->data['scheduler_max'] = 10;
|
40 |
|
41 |
|
42 |
if (!$this->is_email($controls->data['reply_to'], true)) {
|
71 |
$page['comment_status'] = 'closed';
|
72 |
$page['ping_status'] = 'closed';
|
73 |
$page['post_category'] = array(1);
|
74 |
+
|
75 |
$current_language = $this->get_current_language();
|
76 |
$this->switch_language('');
|
77 |
// Insert the post into the database
|
80 |
|
81 |
$controls->data['page'] = $page_id;
|
82 |
$this->merge_options($controls->data);
|
83 |
+
|
84 |
$controls->messages = 'A new page has been created';
|
85 |
}
|
86 |
}
|
260 |
</p>
|
261 |
|
262 |
<table class="form-table">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
<tr>
|
264 |
<th><?php _e('Allowed roles', 'newsletter') ?></th>
|
265 |
<td>
|
278 |
|
279 |
</td>
|
280 |
</tr>
|
281 |
+
|
282 |
<tr>
|
283 |
<th>
|
284 |
+
<?php _e('Tracking default', 'newsletter') ?>
|
285 |
+
<?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#tracking') ?>
|
286 |
</th>
|
287 |
<td>
|
288 |
+
<?php $controls->yesno('track'); ?>
|
289 |
</td>
|
290 |
</tr>
|
291 |
+
|
292 |
<tr>
|
293 |
<th>
|
294 |
+
<?php _e('Execute shortcodes on newsletters', 'newsletter') ?>
|
295 |
+
<?php $controls->field_help("https://www.thenewsletterplugin.com/documentation/newsletter-configuration#shortcodes") ?>
|
296 |
</th>
|
297 |
<td>
|
298 |
+
<?php $controls->yesno('do_shortcodes', 40); ?>
|
299 |
</td>
|
300 |
</tr>
|
301 |
+
|
302 |
<tr>
|
303 |
+
<th>
|
304 |
+
<?php _e('Log level', 'newsletter') ?>
|
305 |
+
<?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#log') ?>
|
306 |
+
</th>
|
307 |
<td>
|
308 |
+
<?php $controls->log_level('log_level'); ?>
|
309 |
</td>
|
310 |
</tr>
|
311 |
|
312 |
<tr>
|
313 |
+
<th><?php _e('Disable standard styles', 'newsletter') ?></th>
|
314 |
<td>
|
315 |
+
<?php $controls->yesno('css_disabled'); ?>
|
|
|
316 |
</td>
|
317 |
</tr>
|
318 |
+
|
319 |
<tr>
|
320 |
+
<th><?php _e('Custom styles', 'newsletter') ?></th>
|
321 |
<td>
|
322 |
+
<?php if (apply_filters('newsletter_enqueue_style', true) === false) { ?>
|
323 |
+
<p><strong>Warning: Newsletter styles and custom styles are disable by your theme or a plugin.</strong></p>
|
324 |
+
<?php } ?>
|
325 |
+
<?php $controls->textarea('css'); ?>
|
326 |
</td>
|
327 |
</tr>
|
328 |
+
|
329 |
+
|
330 |
+
<tr>
|
331 |
+
<th><?php _e('IP addresses', 'newsletter') ?></th>
|
332 |
+
<td>
|
333 |
+
<?php $controls->select('ip', array('' => __('Store', 'newsletter'), 'anonymize' => __('Anonymize', 'newsletter'), 'skip' => __('Do not store', 'newsletter'))); ?>
|
334 |
+
</td>
|
335 |
+
</tr>
|
336 |
+
|
337 |
+
|
338 |
|
339 |
<tr>
|
340 |
+
<th>
|
341 |
+
<?php _e('Debug mode', 'newsletter') ?>
|
342 |
+
<?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#debug') ?>
|
343 |
+
</th>
|
344 |
<td>
|
345 |
+
<?php $controls->yesno('debug', 40); ?>
|
|
|
346 |
</td>
|
347 |
</tr>
|
348 |
|
349 |
<tr>
|
350 |
<th>
|
351 |
+
<?php _e('Email encoding', 'newsletter') ?>
|
352 |
+
<?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#encoding') ?>
|
353 |
</th>
|
354 |
<td>
|
355 |
+
<?php $controls->select('content_transfer_encoding', array('' => 'Default', '8bit' => '8 bit', 'base64' => 'Base 64', 'binary' => 'Binary', 'quoted-printable' => 'Quoted printable', '7bit' => '7 bit')); ?>
|
|
|
356 |
</td>
|
357 |
</tr>
|
358 |
+
|
359 |
+
|
360 |
</table>
|
361 |
|
362 |
</div>
|
plugin.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
Plugin Name: Newsletter
|
5 |
Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
|
6 |
Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
|
7 |
-
Version: 6.9.
|
8 |
Author: Stefano Lissa & The Newsletter Team
|
9 |
Author URI: https://www.thenewsletterplugin.com
|
10 |
Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
|
@@ -35,17 +35,13 @@ if (version_compare(phpversion(), '5.6', '<')) {
|
|
35 |
return;
|
36 |
}
|
37 |
|
38 |
-
define('NEWSLETTER_VERSION', '6.9.
|
39 |
|
40 |
global $newsletter, $wpdb;
|
41 |
|
42 |
if (!defined('NEWSLETTER_BETA'))
|
43 |
define('NEWSLETTER_BETA', false);
|
44 |
|
45 |
-
// For acceptance tests, DO NOT CHANGE
|
46 |
-
if (!defined('NEWSLETTER_ANTIBOT'))
|
47 |
-
define('NEWSLETTER_ANTIBOT', true);
|
48 |
-
|
49 |
// For acceptance tests, DO NOT CHANGE
|
50 |
if (!defined('NEWSLETTER_DEBUG'))
|
51 |
define('NEWSLETTER_DEBUG', false);
|
4 |
Plugin Name: Newsletter
|
5 |
Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
|
6 |
Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
|
7 |
+
Version: 6.9.6
|
8 |
Author: Stefano Lissa & The Newsletter Team
|
9 |
Author URI: https://www.thenewsletterplugin.com
|
10 |
Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
|
35 |
return;
|
36 |
}
|
37 |
|
38 |
+
define('NEWSLETTER_VERSION', '6.9.6');
|
39 |
|
40 |
global $newsletter, $wpdb;
|
41 |
|
42 |
if (!defined('NEWSLETTER_BETA'))
|
43 |
define('NEWSLETTER_BETA', false);
|
44 |
|
|
|
|
|
|
|
|
|
45 |
// For acceptance tests, DO NOT CHANGE
|
46 |
if (!defined('NEWSLETTER_DEBUG'))
|
47 |
define('NEWSLETTER_DEBUG', false);
|
profile/index.php
CHANGED
@@ -143,9 +143,7 @@ if ($controls->is_action()) {
|
|
143 |
</table>
|
144 |
<?php } else { ?>
|
145 |
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
|
150 |
<?php } ?>
|
151 |
</div>
|
143 |
</table>
|
144 |
<?php } else { ?>
|
145 |
|
146 |
+
<?php $controls->switch_to_all_languages_notice(); ?>
|
|
|
|
|
147 |
|
148 |
<?php } ?>
|
149 |
</div>
|
readme.txt
CHANGED
@@ -1,10 +1,12 @@
|
|
1 |
=== Newsletter ===
|
2 |
Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
|
3 |
Requires at least: 3.4.0
|
4 |
-
Tested up to: 5.5.
|
5 |
-
Stable tag: 6.9.
|
6 |
Requires PHP: 5.6
|
7 |
Contributors: satollo,webagile,michael-travan
|
|
|
|
|
8 |
|
9 |
Add a real newsletter system to your blog. For free. With unlimited newsletters and subscribers.
|
10 |
|
@@ -52,6 +54,8 @@ Improve The Newsletter Plugin with these free addons:
|
|
52 |
* [Locked Content](https://www.thenewsletterplugin.com/documentation/locked-content-extension) - open up your premium content only after subscription
|
53 |
* [Newsletter REST API](https://www.thenewsletterplugin.com/documentation/developers/newsletter-api-2/) - adds a tier of REST api to integrate with the Newsletter core services
|
54 |
* [BuddyPress integration](https://wordpress.org/plugins/newsletter-buddypress/) - subscription opt-in inside BuddyPress signup form
|
|
|
|
|
55 |
|
56 |
(*easily add them from our [Addons panel](https://www.thenewsletterplugin.com/documentation/install-extensions)*)
|
57 |
|
@@ -59,11 +63,11 @@ Improve The Newsletter Plugin with these free addons:
|
|
59 |
|
60 |
Need *more power*? Feel *something's missing*? The Newsletter Plugin features can be easily extended through our **premium, professional Addons**! Let us introduce just two of them : )
|
61 |
|
|
|
|
|
62 |
* [Extended Composer Blocks](https://www.thenewsletterplugin.com/composer) - adds new blocks to the drag & drop composer
|
63 |
* [WooCommerce Integration](https://www.thenewsletterplugin.com/woocommerce) - subscribe customers to a mailing list and generate product newletters.
|
64 |
* [Reports](https://www.thenewsletterplugin.com/reports) - improves the internal statistics collection system and provides better reports of data collected for each sent email. And retargeting. Neat.
|
65 |
-
* [Automated](https://www.thenewsletterplugin.com/automated) - generates and sends your newsletters using your blog last posts, even custom ones like events or products. Just sit and watch!
|
66 |
-
* [Autoresponder](https://www.thenewsletterplugin.com/autoresponder) - creates email series to follow up your subscribers
|
67 |
* [Leads](https://www.thenewsletterplugin.com/leads) adds a fancy subscription popup box or a fixed bar to your website that will boost your conversion rate
|
68 |
* [Amazon SES and other mail providers integration](https://www.thenewsletterplugin.com/integrations) - seamlessly integrate Amazon SES and other email service providers with The Newsletter Plugin. Hassle-free.
|
69 |
* [Contact Form 7 Integration](https://www.thenewsletterplugin.com/documentation/contact-form-7-extension) - integrate the subscription on Contact Form 7 forms
|
@@ -113,6 +117,24 @@ Thank you, The Newsletter Team
|
|
113 |
|
114 |
== Changelog ==
|
115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
= 6.9.4 =
|
117 |
|
118 |
* Fixed the profile save
|
1 |
=== Newsletter ===
|
2 |
Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
|
3 |
Requires at least: 3.4.0
|
4 |
+
Tested up to: 5.5.3
|
5 |
+
Stable tag: 6.9.6
|
6 |
Requires PHP: 5.6
|
7 |
Contributors: satollo,webagile,michael-travan
|
8 |
+
License: GPLv2 or later
|
9 |
+
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
11 |
Add a real newsletter system to your blog. For free. With unlimited newsletters and subscribers.
|
12 |
|
54 |
* [Locked Content](https://www.thenewsletterplugin.com/documentation/locked-content-extension) - open up your premium content only after subscription
|
55 |
* [Newsletter REST API](https://www.thenewsletterplugin.com/documentation/developers/newsletter-api-2/) - adds a tier of REST api to integrate with the Newsletter core services
|
56 |
* [BuddyPress integration](https://wordpress.org/plugins/newsletter-buddypress/) - subscription opt-in inside BuddyPress signup form
|
57 |
+
* [Sendinblue integration](https://www.thenewsletterplugin.com/documentation/addons/delivery-addons/sendinblue-extension/) - deliver your newsletters with Sendinblue
|
58 |
+
|
59 |
|
60 |
(*easily add them from our [Addons panel](https://www.thenewsletterplugin.com/documentation/install-extensions)*)
|
61 |
|
63 |
|
64 |
Need *more power*? Feel *something's missing*? The Newsletter Plugin features can be easily extended through our **premium, professional Addons**! Let us introduce just two of them : )
|
65 |
|
66 |
+
* [Automated](https://www.thenewsletterplugin.com/automated) - generates and sends your newsletters using your blog last posts, even custom ones like events or products. Just sit and watch!
|
67 |
+
* [Autoresponder](https://www.thenewsletterplugin.com/autoresponder) - creates email series to follow up your subscribers
|
68 |
* [Extended Composer Blocks](https://www.thenewsletterplugin.com/composer) - adds new blocks to the drag & drop composer
|
69 |
* [WooCommerce Integration](https://www.thenewsletterplugin.com/woocommerce) - subscribe customers to a mailing list and generate product newletters.
|
70 |
* [Reports](https://www.thenewsletterplugin.com/reports) - improves the internal statistics collection system and provides better reports of data collected for each sent email. And retargeting. Neat.
|
|
|
|
|
71 |
* [Leads](https://www.thenewsletterplugin.com/leads) adds a fancy subscription popup box or a fixed bar to your website that will boost your conversion rate
|
72 |
* [Amazon SES and other mail providers integration](https://www.thenewsletterplugin.com/integrations) - seamlessly integrate Amazon SES and other email service providers with The Newsletter Plugin. Hassle-free.
|
73 |
* [Contact Form 7 Integration](https://www.thenewsletterplugin.com/documentation/contact-form-7-extension) - integrate the subscription on Contact Form 7 forms
|
117 |
|
118 |
== Changelog ==
|
119 |
|
120 |
+
= 6.9.6 =
|
121 |
+
|
122 |
+
* Added 3 months option for inactive subscriber selection
|
123 |
+
* Improved the add-ons classes
|
124 |
+
* Improved admin messages for multilanguage blogs
|
125 |
+
* Updated link to documentation on main settings
|
126 |
+
* Added VK and Telegram socials
|
127 |
+
* Removed the old bounce import on subscribe maintenance panel
|
128 |
+
* Added Telegram and VK icon on social block component
|
129 |
+
|
130 |
+
= 6.9.5 =
|
131 |
+
|
132 |
+
* Added pagination on newsletters page table
|
133 |
+
* Changed label text for empty language in edit user page
|
134 |
+
* Added preheader text on email
|
135 |
+
* If email is paused but scheduled in the future it is now possible to change the sending date
|
136 |
+
* Fixed font weight selection for titles on posts block
|
137 |
+
|
138 |
= 6.9.4 =
|
139 |
|
140 |
* Fixed the profile save
|
statistics/index.php
CHANGED
@@ -64,7 +64,7 @@ if (empty($emails)) {
|
|
64 |
<?php include NEWSLETTER_DIR . '/tnp-header.php' ?>
|
65 |
<div id="tnp-heading">
|
66 |
<h2><?php _e('Overall basic statistics (last 20 newsletters)', 'newsletter') ?></h2>
|
67 |
-
<p>More details, including Automated and Autoresponder newsletter statistics are available with the <a href="https://www.thenewsletterplugin.com/reports" target="_blank">Reports Addon</a>.</p>
|
68 |
</div>
|
69 |
|
70 |
<div id="tnp-body" class="tnp-statistics">
|
64 |
<?php include NEWSLETTER_DIR . '/tnp-header.php' ?>
|
65 |
<div id="tnp-heading">
|
66 |
<h2><?php _e('Overall basic statistics (last 20 newsletters)', 'newsletter') ?></h2>
|
67 |
+
<p>More details, including Automated and Autoresponder newsletter statistics are available with the <a href="https://www.thenewsletterplugin.com/reports?utm_source=plugin&utm_campaign=newsletter-reports" target="_blank">Reports Addon</a>.</p>
|
68 |
</div>
|
69 |
|
70 |
<div id="tnp-body" class="tnp-statistics">
|
subscription/options.php
CHANGED
@@ -163,7 +163,7 @@ if ($controls->is_action()) {
|
|
163 |
</tr>
|
164 |
</table>
|
165 |
<?php } else { ?>
|
166 |
-
|
167 |
<?php } ?>
|
168 |
|
169 |
</div>
|
163 |
</tr>
|
164 |
</table>
|
165 |
<?php } else { ?>
|
166 |
+
<?php $controls->switch_to_all_languages_notice(); ?>
|
167 |
<?php } ?>
|
168 |
|
169 |
</div>
|
subscription/subscription.php
CHANGED
@@ -285,15 +285,15 @@ class NewsletterSubscription extends NewsletterModule {
|
|
285 |
}
|
286 |
|
287 |
function first_install() {
|
288 |
-
|
289 |
}
|
290 |
|
291 |
function admin_menu() {
|
292 |
$this->add_menu_page('options', 'List building');
|
293 |
-
$this->
|
294 |
$this->add_admin_page('profile', 'Subscription Form');
|
|
|
295 |
$this->add_admin_page('forms', 'Forms');
|
296 |
-
$this->add_admin_page('lists', 'Lists');
|
297 |
$this->add_admin_page('template', 'Template');
|
298 |
}
|
299 |
|
@@ -1104,7 +1104,7 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1104 |
}
|
1105 |
|
1106 |
function get_form_javascript() {
|
1107 |
-
|
1108 |
}
|
1109 |
|
1110 |
/**
|
@@ -1156,14 +1156,14 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1156 |
}
|
1157 |
|
1158 |
/** Generates the hidden field for lists which should be implicitely set with a subscription form.
|
1159 |
-
*
|
1160 |
* @param string $lists Comma separated directly from the shortcode "lists" attribute
|
1161 |
* @param string $language ???
|
1162 |
* @return string
|
1163 |
*/
|
1164 |
function get_form_implicit_lists($lists, $language = '') {
|
1165 |
$buffer = '';
|
1166 |
-
|
1167 |
$arr = explode(',', $lists);
|
1168 |
|
1169 |
foreach ($arr as $a) {
|
@@ -1194,7 +1194,7 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1194 |
/**
|
1195 |
* Builds all the hidden fields of a subscription form. Implicit lists, confirmation url,
|
1196 |
* referrer, language, ...
|
1197 |
-
*
|
1198 |
* @param array $attrs Attributes of form shortcode
|
1199 |
* @return string HTML with the hidden fields
|
1200 |
*/
|
@@ -1236,7 +1236,7 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1236 |
|
1237 |
$language = $this->get_current_language();
|
1238 |
$b .= '<input type="hidden" name="nlang" value="' . esc_attr($language) . '">';
|
1239 |
-
|
1240 |
return $b;
|
1241 |
}
|
1242 |
|
@@ -1272,7 +1272,7 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1272 |
/**
|
1273 |
* Creates a notices to be displayed near a subscription form field to inform of worng configurations.
|
1274 |
* It is created only if the current user looking at the form is the administrator.
|
1275 |
-
*
|
1276 |
* @param string $message
|
1277 |
* @return string
|
1278 |
*/
|
@@ -1387,12 +1387,12 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1387 |
if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
|
1388 |
|
1389 |
$buffer .= '<div class="tnp-field tnp-lists">';
|
|
|
|
|
1390 |
$buffer .= '<select class="tnp-lists" name="nl[]" required>';
|
1391 |
-
// There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
|
1392 |
-
$buffer .= $this->_shortcode_label('lists', $attrs);
|
1393 |
|
1394 |
if (!empty($attrs['first_option_label'])) {
|
1395 |
-
$buffer .= '<option value="">' . esc_html($attrs['first_option_label']) . '</option>';
|
1396 |
}
|
1397 |
|
1398 |
foreach ($lists as $list) {
|
@@ -1548,7 +1548,7 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1548 |
function get_subscription_form($referrer = '', $action = null, $attrs = []) {
|
1549 |
$language = $this->get_current_language();
|
1550 |
$options_profile = $this->get_options('profile', $language);
|
1551 |
-
|
1552 |
if (!is_array($attrs)) {
|
1553 |
$attrs = [];
|
1554 |
}
|
@@ -1603,7 +1603,10 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1603 |
if (empty($attrs['lists_field_empty_label'])) {
|
1604 |
$attrs['lists_field_empty_label'] = '';
|
1605 |
}
|
1606 |
-
|
|
|
|
|
|
|
1607 |
} else {
|
1608 |
$buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
|
1609 |
}
|
@@ -1711,9 +1714,9 @@ class NewsletterSubscription extends NewsletterModule {
|
|
1711 |
}
|
1712 |
|
1713 |
/**
|
1714 |
-
* Builds the minimal subscription form, with only the email field and inline
|
1715 |
* submit button. If enabled the privacy checkbox is added.
|
1716 |
-
*
|
1717 |
* @param type $attrs
|
1718 |
* @return string
|
1719 |
*/
|
285 |
}
|
286 |
|
287 |
function first_install() {
|
288 |
+
|
289 |
}
|
290 |
|
291 |
function admin_menu() {
|
292 |
$this->add_menu_page('options', 'List building');
|
293 |
+
$this->add_admin_page('lists', 'Lists');
|
294 |
$this->add_admin_page('profile', 'Subscription Form');
|
295 |
+
$this->add_menu_page('antibot', 'Security');
|
296 |
$this->add_admin_page('forms', 'Forms');
|
|
|
297 |
$this->add_admin_page('template', 'Template');
|
298 |
}
|
299 |
|
1104 |
}
|
1105 |
|
1106 |
function get_form_javascript() {
|
1107 |
+
|
1108 |
}
|
1109 |
|
1110 |
/**
|
1156 |
}
|
1157 |
|
1158 |
/** Generates the hidden field for lists which should be implicitely set with a subscription form.
|
1159 |
+
*
|
1160 |
* @param string $lists Comma separated directly from the shortcode "lists" attribute
|
1161 |
* @param string $language ???
|
1162 |
* @return string
|
1163 |
*/
|
1164 |
function get_form_implicit_lists($lists, $language = '') {
|
1165 |
$buffer = '';
|
1166 |
+
|
1167 |
$arr = explode(',', $lists);
|
1168 |
|
1169 |
foreach ($arr as $a) {
|
1194 |
/**
|
1195 |
* Builds all the hidden fields of a subscription form. Implicit lists, confirmation url,
|
1196 |
* referrer, language, ...
|
1197 |
+
*
|
1198 |
* @param array $attrs Attributes of form shortcode
|
1199 |
* @return string HTML with the hidden fields
|
1200 |
*/
|
1236 |
|
1237 |
$language = $this->get_current_language();
|
1238 |
$b .= '<input type="hidden" name="nlang" value="' . esc_attr($language) . '">';
|
1239 |
+
|
1240 |
return $b;
|
1241 |
}
|
1242 |
|
1272 |
/**
|
1273 |
* Creates a notices to be displayed near a subscription form field to inform of worng configurations.
|
1274 |
* It is created only if the current user looking at the form is the administrator.
|
1275 |
+
*
|
1276 |
* @param string $message
|
1277 |
* @return string
|
1278 |
*/
|
1387 |
if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
|
1388 |
|
1389 |
$buffer .= '<div class="tnp-field tnp-lists">';
|
1390 |
+
// There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
|
1391 |
+
$buffer .= $this->_shortcode_label('lists', $attrs);
|
1392 |
$buffer .= '<select class="tnp-lists" name="nl[]" required>';
|
|
|
|
|
1393 |
|
1394 |
if (!empty($attrs['first_option_label'])) {
|
1395 |
+
$buffer .= '<option value="" selected="true" disabled="disabled">' . esc_html($attrs['first_option_label']) . '</option>';
|
1396 |
}
|
1397 |
|
1398 |
foreach ($lists as $list) {
|
1548 |
function get_subscription_form($referrer = '', $action = null, $attrs = []) {
|
1549 |
$language = $this->get_current_language();
|
1550 |
$options_profile = $this->get_options('profile', $language);
|
1551 |
+
|
1552 |
if (!is_array($attrs)) {
|
1553 |
$attrs = [];
|
1554 |
}
|
1603 |
if (empty($attrs['lists_field_empty_label'])) {
|
1604 |
$attrs['lists_field_empty_label'] = '';
|
1605 |
}
|
1606 |
+
if (empty($attrs['lists_field_label'])) {
|
1607 |
+
$attrs['lists_field_label'] = '';
|
1608 |
+
}
|
1609 |
+
$buffer .= $this->shortcode_newsletter_field(['name' => 'lists', 'layout' => 'dropdown', 'first_option_label' => $attrs['lists_field_empty_label'], 'label' => $attrs['lists_field_label']]);
|
1610 |
} else {
|
1611 |
$buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
|
1612 |
}
|
1714 |
}
|
1715 |
|
1716 |
/**
|
1717 |
+
* Builds the minimal subscription form, with only the email field and inline
|
1718 |
* submit button. If enabled the privacy checkbox is added.
|
1719 |
+
*
|
1720 |
* @param type $attrs
|
1721 |
* @return string
|
1722 |
*/
|
tnp-header.php
CHANGED
@@ -73,20 +73,27 @@ $warning |= empty($status_options['mail']);
|
|
73 |
</li>
|
74 |
<li><a href="#"><i class="fas fa-list"></i> <?php _e('List Building', 'newsletter') ?> <i class="fas fa-chevron-down"></i></a>
|
75 |
<ul>
|
76 |
-
<li><a href="?page=newsletter_subscription_options"><i class="fas fa-sign-in-alt"></i> <?php _e('Subscription', 'newsletter') ?>
|
77 |
-
<small><?php _e('The subscription process in detail', 'newsletter') ?></small></a></li>
|
78 |
-
|
79 |
-
<li><a href="?page=newsletter_subscription_antibot"><i class="fas fa-lock"></i> <?php _e('Security', 'newsletter') ?>
|
80 |
-
<small><?php _e('Spam subscriptions control', 'newsletter') ?></small></a></li>
|
81 |
-
|
82 |
<li>
|
83 |
<a href="?page=newsletter_subscription_profile"><i class="fas fa-check-square"></i> <?php _e('Subscription Form Fields, Buttons, Labels', 'newsletter') ?>
|
84 |
<small><?php _e('When and what data to collect', 'newsletter') ?></small></a>
|
85 |
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
<li>
|
87 |
<a href="?page=newsletter_subscription_lists"><i class="fas fa-th-list"></i> <?php _e('Lists', 'newsletter') ?>
|
88 |
<small><?php _e('Profile the subscribers for a better targeting', 'newsletter') ?></small></a>
|
89 |
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
<li>
|
91 |
<a href="?page=newsletter_unsubscription_index"><i class="fas fa-sign-out-alt"></i> <?php _e('Unsubscription', 'newsletter') ?>
|
92 |
<small><?php _e('How to give the last goodbye (or avoid it!)', 'newsletter') ?></small></a>
|
73 |
</li>
|
74 |
<li><a href="#"><i class="fas fa-list"></i> <?php _e('List Building', 'newsletter') ?> <i class="fas fa-chevron-down"></i></a>
|
75 |
<ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
<li>
|
77 |
<a href="?page=newsletter_subscription_profile"><i class="fas fa-check-square"></i> <?php _e('Subscription Form Fields, Buttons, Labels', 'newsletter') ?>
|
78 |
<small><?php _e('When and what data to collect', 'newsletter') ?></small></a>
|
79 |
</li>
|
80 |
+
|
81 |
+
<li>
|
82 |
+
<a href="?page=newsletter_subscription_options"><i class="fas fa-sign-in-alt"></i> <?php _e('Subscription', 'newsletter') ?>
|
83 |
+
<small><?php _e('The subscription process in detail', 'newsletter') ?></small></a>
|
84 |
+
</li>
|
85 |
+
|
86 |
<li>
|
87 |
<a href="?page=newsletter_subscription_lists"><i class="fas fa-th-list"></i> <?php _e('Lists', 'newsletter') ?>
|
88 |
<small><?php _e('Profile the subscribers for a better targeting', 'newsletter') ?></small></a>
|
89 |
</li>
|
90 |
+
|
91 |
+
<li>
|
92 |
+
<a href="?page=newsletter_subscription_antibot"><i class="fas fa-lock"></i> <?php _e('Security', 'newsletter') ?>
|
93 |
+
<small><?php _e('Spam subscriptions control', 'newsletter') ?></small></a>
|
94 |
+
</li>
|
95 |
+
|
96 |
+
|
97 |
<li>
|
98 |
<a href="?page=newsletter_unsubscription_index"><i class="fas fa-sign-out-alt"></i> <?php _e('Unsubscription', 'newsletter') ?>
|
99 |
<small><?php _e('How to give the last goodbye (or avoid it!)', 'newsletter') ?></small></a>
|
unsubscription/index.php
CHANGED
@@ -9,9 +9,7 @@ $current_language = $this->get_current_language();
|
|
9 |
|
10 |
$is_all_languages = $this->is_all_languages();
|
11 |
|
12 |
-
|
13 |
-
$controls->warnings[] = 'You are configuring the language <strong>' . $current_language . '</strong>. Switch to "all languages" to see all options.';
|
14 |
-
}
|
15 |
|
16 |
if (!$controls->is_action()) {
|
17 |
$controls->data = $this->get_options('', $current_language);
|
@@ -93,7 +91,12 @@ if (!$controls->is_action()) {
|
|
93 |
</td>
|
94 |
</tr>
|
95 |
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
97 |
<th><?php _e('Cancellation requests via email', 'newsletter') ?></th>
|
98 |
<td>
|
99 |
<?php $controls->text_email('list_unsubscribe_mailto_header'); ?>
|
@@ -116,6 +119,11 @@ if (!$controls->is_action()) {
|
|
116 |
</td>
|
117 |
</tr>
|
118 |
</table>
|
|
|
|
|
|
|
|
|
|
|
119 |
</div>
|
120 |
|
121 |
<div id="tabs-reactivation">
|
9 |
|
10 |
$is_all_languages = $this->is_all_languages();
|
11 |
|
12 |
+
$controls->add_language_warning();
|
|
|
|
|
13 |
|
14 |
if (!$controls->is_action()) {
|
15 |
$controls->data = $this->get_options('', $current_language);
|
91 |
</td>
|
92 |
</tr>
|
93 |
|
94 |
+
</table>
|
95 |
+
|
96 |
+
<h3>Advanced</h3>
|
97 |
+
<?php if ($is_all_languages) { ?>
|
98 |
+
<table class="form-table">
|
99 |
+
<tr>
|
100 |
<th><?php _e('Cancellation requests via email', 'newsletter') ?></th>
|
101 |
<td>
|
102 |
<?php $controls->text_email('list_unsubscribe_mailto_header'); ?>
|
119 |
</td>
|
120 |
</tr>
|
121 |
</table>
|
122 |
+
<?php } else { ?>
|
123 |
+
|
124 |
+
<?php $controls->switch_to_all_languages_notice(); ?>
|
125 |
+
|
126 |
+
<?php } ?>
|
127 |
</div>
|
128 |
|
129 |
<div id="tabs-reactivation">
|
users/edit.php
CHANGED
@@ -146,14 +146,14 @@ function percentValue($value, $total) {
|
|
146 |
<tr>
|
147 |
<th><?php _e('Status', 'newsletter'); ?></th>
|
148 |
<td>
|
149 |
-
<?php $controls->select('status', array('C' => __('Confirmed', 'newsletter'), 'S' => __('Not confirmed', 'newsletter'),
|
150 |
'U' => __('Unsubscribed', 'newsletter'), 'B' => __('Bounced', 'newsletter'))); ?>
|
151 |
</td>
|
152 |
</tr>
|
153 |
<tr>
|
154 |
<th><?php _e('Language', 'newsletter'); ?></th>
|
155 |
<td>
|
156 |
-
<?php $controls->language(); ?>
|
157 |
</td>
|
158 |
</tr>
|
159 |
<tr>
|
146 |
<tr>
|
147 |
<th><?php _e('Status', 'newsletter'); ?></th>
|
148 |
<td>
|
149 |
+
<?php $controls->select('status', array('C' => __('Confirmed', 'newsletter'), 'S' => __('Not confirmed', 'newsletter'),
|
150 |
'U' => __('Unsubscribed', 'newsletter'), 'B' => __('Bounced', 'newsletter'))); ?>
|
151 |
</td>
|
152 |
</tr>
|
153 |
<tr>
|
154 |
<th><?php _e('Language', 'newsletter'); ?></th>
|
155 |
<td>
|
156 |
+
<?php $controls->language('language', __('None', 'newsletter') ); ?>
|
157 |
</td>
|
158 |
</tr>
|
159 |
<tr>
|
users/massive.php
CHANGED
@@ -86,9 +86,10 @@ if ($controls->is_action('list_none')) {
|
|
86 |
}
|
87 |
|
88 |
if ($controls->is_action('update_inactive')) {
|
|
|
89 |
$wpdb->query("update `{$wpdb->prefix}newsletter` n join (select user_id, max(s.time) as max_time from `{$wpdb->prefix}newsletter_sent` s where s.open>0 group by user_id) as ss
|
90 |
on n.id=ss.user_id set last_activity=ss.max_time");
|
91 |
-
|
92 |
$inactive_time = (int) $controls->data['inactive_time'];
|
93 |
|
94 |
$where = 'last_activity > 0 and last_activity<' . (time() - $inactive_time * 30 * 24 * 3600);
|
@@ -96,57 +97,6 @@ if ($controls->is_action('update_inactive')) {
|
|
96 |
$count = $wpdb->query("update " . NEWSLETTER_USERS_TABLE . ' set list_' . ((int) $controls->data['list_inactive']) . '=1 where ' . $where);
|
97 |
$controls->messages = $count . ' subscribers updated';
|
98 |
}
|
99 |
-
|
100 |
-
if ($controls->is_action('bounces')) {
|
101 |
-
$lines = explode("\n", $controls->data['bounced_emails']);
|
102 |
-
$total = 0;
|
103 |
-
$marked = 0;
|
104 |
-
$error = 0;
|
105 |
-
$not_found = 0;
|
106 |
-
$already_bounced = 0;
|
107 |
-
$results = '';
|
108 |
-
foreach ($lines as &$email) {
|
109 |
-
$email = trim($email);
|
110 |
-
if (empty($email))
|
111 |
-
continue;
|
112 |
-
|
113 |
-
$total++;
|
114 |
-
|
115 |
-
$email = NewsletterModule::normalize_email($email);
|
116 |
-
if (empty($email)) {
|
117 |
-
$results .= '[INVALID] ' . $email . "\n";
|
118 |
-
$error++;
|
119 |
-
continue;
|
120 |
-
}
|
121 |
-
|
122 |
-
$user = NewsletterUsers::instance()->get_user($email);
|
123 |
-
|
124 |
-
if ($user == null) {
|
125 |
-
$results .= '[NOT FOUND] ' . $email . "\n";
|
126 |
-
$not_found++;
|
127 |
-
continue;
|
128 |
-
}
|
129 |
-
|
130 |
-
if ($user->status == 'B') {
|
131 |
-
$results .= '[ALREADY BOUNCED] ' . $email . "\n";
|
132 |
-
$already_bounced++;
|
133 |
-
continue;
|
134 |
-
}
|
135 |
-
|
136 |
-
$r = $wpdb->query($wpdb->prepare('update ' . NEWSLETTER_USERS_TABLE . " set status='B' where email=%s limit 1", $email));
|
137 |
-
if ($r === 1) {
|
138 |
-
$results .= '[BOUNCED] ' . $email . "\n";
|
139 |
-
$marked++;
|
140 |
-
continue;
|
141 |
-
}
|
142 |
-
}
|
143 |
-
|
144 |
-
$controls->messages .= 'Total: ' . $total . '<br>';
|
145 |
-
$controls->messages .= 'Bounce: ' . $marked . '<br>';
|
146 |
-
$controls->messages .= 'Errors: ' . $error . '<br>';
|
147 |
-
$controls->messages .= 'Not found: ' . $not_found . '<br>';
|
148 |
-
$controls->messages .= 'Already bounced: ' . $already_bounced . '<br>';
|
149 |
-
}
|
150 |
?>
|
151 |
|
152 |
<div class="wrap tnp-users tnp-users-massive" id="tnp-wrap">
|
@@ -178,7 +128,6 @@ if ($controls->is_action('bounces')) {
|
|
178 |
<ul>
|
179 |
<li><a href="#tabs-1"><?php _e('General', 'newsletter') ?></a></li>
|
180 |
<li><a href="#tabs-2"><?php _e('Lists', 'newsletter') ?></a></li>
|
181 |
-
<li><a href="#tabs-4"><?php _e('Bounces', 'newsletter') ?></a></li>
|
182 |
</ul>
|
183 |
|
184 |
<div id="tabs-1">
|
@@ -245,6 +194,7 @@ if ($controls->is_action('bounces')) {
|
|
245 |
<td>
|
246 |
<?php
|
247 |
$controls->select('inactive_time', array(
|
|
|
248 |
'6' => '6 ' . __('months', 'newsletter'),
|
249 |
'12' => '1 ' . __('year', 'newsletter'),
|
250 |
'24' => '2 ' . __('years', 'newsletter'),
|
@@ -257,22 +207,22 @@ if ($controls->is_action('bounces')) {
|
|
257 |
'108' => '9 ' . __('years', 'newsletter'),
|
258 |
'120' => '10 ' . __('years', 'newsletter')
|
259 |
))
|
260 |
-
?>
|
261 |
to
|
262 |
<?php $controls->lists_select('list_inactive'); ?>
|
263 |
-
|
264 |
</td>
|
265 |
<td>
|
266 |
<?php $controls->button_confirm('update_inactive', __('Update', 'newsletter')); ?>
|
267 |
</td>
|
268 |
</tr>
|
269 |
-
|
270 |
<?php if ($this->is_multilanguage()) { ?>
|
271 |
<tr>
|
272 |
<td>Language</td>
|
273 |
<td>
|
274 |
<?php _e('Set to', 'newsletter') ?>
|
275 |
-
<?php $controls->language('language', false) ?> <?php _e('subscribers without a language', 'newsletter') ?>
|
276 |
</td>
|
277 |
<td>
|
278 |
<?php $controls->button_confirm('language', '»'); ?>
|
@@ -312,33 +262,10 @@ if ($controls->is_action('bounces')) {
|
|
312 |
<?php $controls->lists_select('list_3') ?> <?php _e('subscribers without a list', 'newsletter') ?> <?php $controls->button_confirm('list_none', '»'); ?>
|
313 |
</td>
|
314 |
</tr>
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
</table>
|
319 |
-
</div>
|
320 |
|
321 |
|
322 |
|
323 |
-
<div id="tabs-4">
|
324 |
-
<p>
|
325 |
-
Import a set of bounced email addresses: they will be marked as "bounced" and no more contacted. Sending
|
326 |
-
messages to bounced address (many times) can put your server in some black list.
|
327 |
-
</p>
|
328 |
-
|
329 |
-
<table class="form-table">
|
330 |
-
<tr>
|
331 |
-
<th><?php _e('Bounced addresses', 'newsletter') ?></th>
|
332 |
-
<td>
|
333 |
-
<?php $controls->textarea('bounced_emails'); ?>
|
334 |
-
<p class="description">
|
335 |
-
<?php _e('One email address per line.', 'newsletter') ?>
|
336 |
-
</p>
|
337 |
-
</td>
|
338 |
-
</tr>
|
339 |
</table>
|
340 |
-
|
341 |
-
<?php $controls->button_confirm('bounces', 'Mark those emails as bounced'); ?>
|
342 |
</div>
|
343 |
|
344 |
</div>
|
86 |
}
|
87 |
|
88 |
if ($controls->is_action('update_inactive')) {
|
89 |
+
//Update users 'last_activity' column
|
90 |
$wpdb->query("update `{$wpdb->prefix}newsletter` n join (select user_id, max(s.time) as max_time from `{$wpdb->prefix}newsletter_sent` s where s.open>0 group by user_id) as ss
|
91 |
on n.id=ss.user_id set last_activity=ss.max_time");
|
92 |
+
|
93 |
$inactive_time = (int) $controls->data['inactive_time'];
|
94 |
|
95 |
$where = 'last_activity > 0 and last_activity<' . (time() - $inactive_time * 30 * 24 * 3600);
|
97 |
$count = $wpdb->query("update " . NEWSLETTER_USERS_TABLE . ' set list_' . ((int) $controls->data['list_inactive']) . '=1 where ' . $where);
|
98 |
$controls->messages = $count . ' subscribers updated';
|
99 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
?>
|
101 |
|
102 |
<div class="wrap tnp-users tnp-users-massive" id="tnp-wrap">
|
128 |
<ul>
|
129 |
<li><a href="#tabs-1"><?php _e('General', 'newsletter') ?></a></li>
|
130 |
<li><a href="#tabs-2"><?php _e('Lists', 'newsletter') ?></a></li>
|
|
|
131 |
</ul>
|
132 |
|
133 |
<div id="tabs-1">
|
194 |
<td>
|
195 |
<?php
|
196 |
$controls->select('inactive_time', array(
|
197 |
+
'3' => '3 ' . __('months', 'newsletter'),
|
198 |
'6' => '6 ' . __('months', 'newsletter'),
|
199 |
'12' => '1 ' . __('year', 'newsletter'),
|
200 |
'24' => '2 ' . __('years', 'newsletter'),
|
207 |
'108' => '9 ' . __('years', 'newsletter'),
|
208 |
'120' => '10 ' . __('years', 'newsletter')
|
209 |
))
|
210 |
+
?>
|
211 |
to
|
212 |
<?php $controls->lists_select('list_inactive'); ?>
|
213 |
+
|
214 |
</td>
|
215 |
<td>
|
216 |
<?php $controls->button_confirm('update_inactive', __('Update', 'newsletter')); ?>
|
217 |
</td>
|
218 |
</tr>
|
219 |
+
|
220 |
<?php if ($this->is_multilanguage()) { ?>
|
221 |
<tr>
|
222 |
<td>Language</td>
|
223 |
<td>
|
224 |
<?php _e('Set to', 'newsletter') ?>
|
225 |
+
<?php $controls->language('language', false) ?> <?php _e('subscribers without a language', 'newsletter') ?>
|
226 |
</td>
|
227 |
<td>
|
228 |
<?php $controls->button_confirm('language', '»'); ?>
|
262 |
<?php $controls->lists_select('list_3') ?> <?php _e('subscribers without a list', 'newsletter') ?> <?php $controls->button_confirm('list_none', '»'); ?>
|
263 |
</td>
|
264 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
265 |
|
266 |
|
267 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
268 |
</table>
|
|
|
|
|
269 |
</div>
|
270 |
|
271 |
</div>
|