Version Description
- Revised the posts block for the new Automated features
- Added action_link to controls
- Revised the newsletter regeneration and added blocks behaviors
Download this release
Release Info
Developer | satollo |
Plugin | Newsletter |
Version | 6.5.5 |
Comparing to | |
See all releases |
Code changes from version 6.5.4 to 6.5.5
- emails/blocks/posts/block.php +30 -9
- emails/blocks/posts/options.php +9 -5
- emails/emails.php +35 -31
- emails/tnp-composer/_scripts/newsletter-builder-v2.js +2 -3
- includes/addon.php +1 -1
- includes/composer.php +1 -1
- includes/controls.php +49 -11
- plugin.php +5 -2
- readme.txt +10 -2
emails/blocks/posts/block.php
CHANGED
@@ -3,7 +3,6 @@
|
|
3 |
* Name: Last posts
|
4 |
* Section: content
|
5 |
* Description: Last posts list with different layouts
|
6 |
-
* Type: dynamic
|
7 |
*/
|
8 |
|
9 |
/* @var $options array */
|
@@ -36,9 +35,16 @@ $defaults = array(
|
|
36 |
'excerpt_length' => 30,
|
37 |
'post_offset' => 0,
|
38 |
'automated_include' => 'new',
|
39 |
-
'inline_edits' => []
|
|
|
|
|
40 |
);
|
41 |
|
|
|
|
|
|
|
|
|
|
|
42 |
$options = array_merge($defaults, $options);
|
43 |
|
44 |
$font_family = $options['font_family'];
|
@@ -72,14 +78,19 @@ if (!empty($context['last_run'])) {
|
|
72 |
|
73 |
$posts = Newsletter::instance()->get_posts($filters, $options['language']);
|
74 |
|
75 |
-
|
76 |
-
|
|
|
77 |
if (empty($posts)) {
|
78 |
-
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
80 |
}
|
81 |
-
|
82 |
-
}
|
83 |
|
84 |
// We have something new but we need to reload the posts without filtering by date
|
85 |
if ($options['automated_include'] == 'max') {
|
@@ -88,7 +99,9 @@ if ( isset( $context['type'] ) && $context['type'] == 'automated' ) {
|
|
88 |
}
|
89 |
}
|
90 |
|
91 |
-
|
|
|
|
|
92 |
|
93 |
$button_background = $options['button_background'];
|
94 |
$button_label = $options['button_label'];
|
@@ -102,6 +115,14 @@ $alternative_2 = plugins_url( 'newsletter' ) . '/emails/blocks/posts/images/blan
|
|
102 |
remove_all_filters('excerpt_more');
|
103 |
?>
|
104 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
<?php if ($options['layout'] == 'one') { ?>
|
106 |
<style>
|
107 |
.posts-post-date {
|
3 |
* Name: Last posts
|
4 |
* Section: content
|
5 |
* Description: Last posts list with different layouts
|
|
|
6 |
*/
|
7 |
|
8 |
/* @var $options array */
|
35 |
'excerpt_length' => 30,
|
36 |
'post_offset' => 0,
|
37 |
'automated_include' => 'new',
|
38 |
+
'inline_edits' => [],
|
39 |
+
'automated_no_contents' => 'No new posts by now!',
|
40 |
+
'automated' => ''
|
41 |
);
|
42 |
|
43 |
+
// Backward compatibility
|
44 |
+
if (isset($options['automated_required'])) {
|
45 |
+
$defaults['automated'] = '1';
|
46 |
+
}
|
47 |
+
|
48 |
$options = array_merge($defaults, $options);
|
49 |
|
50 |
$font_family = $options['font_family'];
|
78 |
|
79 |
$posts = Newsletter::instance()->get_posts($filters, $options['language']);
|
80 |
|
81 |
+
// This is a block regeneration with a timestamp
|
82 |
+
if ($context['type'] == 'automated' && !empty($context['last_run'])) {
|
83 |
+
// We don't care the timestamp of the last newsletter sent, we want to send only future events
|
84 |
if (empty($posts)) {
|
85 |
+
// I this block was marked as required, we tell the regenerator to return an empty message
|
86 |
+
if ($options['automated'] == '1') {
|
87 |
+
$out['stop'] = true;
|
88 |
+
return;
|
89 |
+
} else if ($options['automated'] == '2') {
|
90 |
+
$out['skip'] = true;
|
91 |
+
return;
|
92 |
}
|
93 |
+
}
|
|
|
94 |
|
95 |
// We have something new but we need to reload the posts without filtering by date
|
96 |
if ($options['automated_include'] == 'max') {
|
99 |
}
|
100 |
}
|
101 |
|
102 |
+
if ($posts) {
|
103 |
+
$out['subject'] = $posts[0]->post_title;
|
104 |
+
}
|
105 |
|
106 |
$button_background = $options['button_background'];
|
107 |
$button_label = $options['button_label'];
|
115 |
remove_all_filters('excerpt_more');
|
116 |
?>
|
117 |
|
118 |
+
<?php if (!$posts) { ?>
|
119 |
+
|
120 |
+
|
121 |
+
<div inline-class="nocontents"><?php echo $options['automated_no_contents'] ?></div>
|
122 |
+
|
123 |
+
|
124 |
+
<?php return; } ?>
|
125 |
+
|
126 |
<?php if ($options['layout'] == 'one') { ?>
|
127 |
<style>
|
128 |
.posts-post-date {
|
emails/blocks/posts/options.php
CHANGED
@@ -5,15 +5,19 @@
|
|
5 |
/* @var $fields NewsletterFields */
|
6 |
|
7 |
?>
|
|
|
8 |
<?php if ($context['type'] == 'automated') { ?>
|
9 |
-
<p>This is a dynamic block which is regenerated with the latest posts when Automated generate a new newsletter.</p>
|
10 |
|
11 |
-
<?php $fields->select('
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
15 |
<?php } ?>
|
16 |
|
|
|
17 |
<?php $fields->select('layout', __('Layout', 'newsletter'), array('one' => __('One column', 'newsletter'), 'two' => __('Two columns', 'newsletter'))) ?>
|
18 |
|
19 |
<?php $fields->font('title_font', __('Title font', 'newsletter')) ?>
|
5 |
/* @var $fields NewsletterFields */
|
6 |
|
7 |
?>
|
8 |
+
|
9 |
<?php if ($context['type'] == 'automated') { ?>
|
|
|
10 |
|
11 |
+
<?php $fields->select('automated', __('If there are no new posts...', 'newsletter'), [''=>'Show the message below', '1'=>'Do not send the newsletter', '2'=>'Remove the block'],
|
12 |
+
['description' => 'Works only on automatic newsletter creation']) ?>
|
13 |
+
<?php $fields->text('automated_no_contents', 'No posts text') ?>
|
14 |
+
|
15 |
+
<?php $fields->select('automated_include', __('What to include', 'newsletter'), array('new' => __('New posts after last newsletter', 'newsletter'),
|
16 |
+
'max' => __('Always max posts if at least one is new', 'newsletter')),
|
17 |
+
array('description'=>'This option is effective only when the newsletter is generated, not while composing')) ?>
|
18 |
<?php } ?>
|
19 |
|
20 |
+
|
21 |
<?php $fields->select('layout', __('Layout', 'newsletter'), array('one' => __('One column', 'newsletter'), 'two' => __('Two columns', 'newsletter'))) ?>
|
22 |
|
23 |
<?php $fields->font('title_font', __('Title font', 'newsletter')) ?>
|
emails/emails.php
CHANGED
@@ -11,6 +11,9 @@ class NewsletterEmails extends NewsletterModule {
|
|
11 |
const EDITOR_TINYMCE = 0;
|
12 |
|
13 |
static $PRESETS_LIST;
|
|
|
|
|
|
|
14 |
|
15 |
/**
|
16 |
* @return NewsletterEmails
|
@@ -110,6 +113,7 @@ class NewsletterEmails extends NewsletterModule {
|
|
110 |
$controls->init();
|
111 |
echo '<input type="hidden" name="action" value="tnpc_render">';
|
112 |
echo '<input type="hidden" name="b" value="' . esc_attr($_REQUEST['id']) . '">';
|
|
|
113 |
$inline_edits = '';
|
114 |
if (isset($controls->data['inline_edits'])) {
|
115 |
$inline_edits = $controls->data['inline_edits'];
|
@@ -183,9 +187,7 @@ class NewsletterEmails extends NewsletterModule {
|
|
183 |
* conditioned (possibly) by the context. The context is usually passed to blocks
|
184 |
* so they can act in the right manner.
|
185 |
*
|
186 |
-
*
|
187 |
-
* the passed timestamp (for example limiting the content to new posts from the last
|
188 |
-
* run timestamp).
|
189 |
*
|
190 |
* $email can actually be even a string containing the full newsletter HTML code.
|
191 |
*
|
@@ -212,9 +214,8 @@ class NewsletterEmails extends NewsletterModule {
|
|
212 |
$context = array_merge(array('last_run' => 0, 'type' => ''), $context);
|
213 |
|
214 |
preg_match_all('/data-json="(.*?)"/m', $theme, $matches, PREG_PATTERN_ORDER);
|
|
|
215 |
$result = '';
|
216 |
-
$all_empty = true; // If all dynamic content blocks return an empty html
|
217 |
-
$has_dynamic_blocks = false;
|
218 |
$subject = '';
|
219 |
|
220 |
foreach ($matches[1] as $match) {
|
@@ -224,30 +225,29 @@ class NewsletterEmails extends NewsletterModule {
|
|
224 |
$block = $this->get_block($options['block_id']);
|
225 |
if (!$block) {
|
226 |
$this->logger->debug('Unable to load the block ' . $options['block_id']);
|
227 |
-
continue;
|
228 |
}
|
229 |
|
230 |
ob_start();
|
231 |
$out = $this->render_block($options['block_id'], true, $options, $context);
|
232 |
-
|
233 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
234 |
}
|
235 |
if (empty($subject) && !empty($out['subject'])) {
|
236 |
$subject = $out['subject'];
|
237 |
}
|
238 |
$block_html = ob_get_clean();
|
239 |
$result .= $block_html;
|
240 |
-
// If a dynamic block return something, we need to return a regenerated template
|
241 |
-
if ($block['type'] == 'dynamic') {
|
242 |
-
$has_dynamic_blocks = true;
|
243 |
-
if (!empty($block_html)) {
|
244 |
-
$all_empty = false;
|
245 |
-
}
|
246 |
-
}
|
247 |
-
}
|
248 |
-
|
249 |
-
if (!empty($context['last_run']) && $has_dynamic_blocks && $all_empty) {
|
250 |
-
return '';
|
251 |
}
|
252 |
|
253 |
// We need to keep the CSS/HEAD part, the regenearion is only about blocks
|
@@ -267,6 +267,7 @@ class NewsletterEmails extends NewsletterModule {
|
|
267 |
if (is_object($email)) {
|
268 |
$email->message = $result;
|
269 |
$email->subject = $subject;
|
|
|
270 |
}
|
271 |
|
272 |
// Kept for compatibility
|
@@ -309,6 +310,8 @@ class NewsletterEmails extends NewsletterModule {
|
|
309 |
$block_options = get_option('newsletter_main');
|
310 |
|
311 |
$block = $this->get_block($block_id);
|
|
|
|
|
312 |
|
313 |
// Block not found
|
314 |
if (!$block) {
|
@@ -329,7 +332,7 @@ class NewsletterEmails extends NewsletterModule {
|
|
329 |
return;
|
330 |
}
|
331 |
|
332 |
-
$out = array('subject' => '', 'return_empty_message' => false);
|
333 |
|
334 |
|
335 |
ob_start();
|
@@ -769,25 +772,26 @@ class NewsletterEmails extends NewsletterModule {
|
|
769 |
*/
|
770 |
function get_blocks() {
|
771 |
|
772 |
-
|
773 |
-
|
774 |
-
if (!is_null($blocks))
|
775 |
-
return $blocks;
|
776 |
|
777 |
-
$blocks = $this->scan_blocks_dir(__DIR__ . '/blocks');
|
778 |
|
779 |
$extended = $this->scan_blocks_dir(WP_CONTENT_DIR . '/extensions/newsletter/blocks');
|
780 |
|
781 |
-
$blocks = array_merge($extended, $blocks);
|
782 |
|
783 |
$dirs = apply_filters('newsletter_blocks_dir', array());
|
|
|
|
|
|
|
784 |
|
785 |
$this->logger->debug('Block dirs: ' . print_r($dirs, true));
|
786 |
|
787 |
foreach ($dirs as $dir) {
|
788 |
$dir = str_replace('\\', '/', $dir);
|
789 |
$list = $this->scan_blocks_dir($dir);
|
790 |
-
$blocks = array_merge($list, $blocks);
|
791 |
}
|
792 |
|
793 |
do_action('newsletter_register_blocks');
|
@@ -798,15 +802,15 @@ class NewsletterEmails extends NewsletterModule {
|
|
798 |
$this->logger->error($block);
|
799 |
continue;
|
800 |
}
|
801 |
-
if (!isset($blocks[$block['id']])) {
|
802 |
-
$blocks[$block['id']] = $block;
|
803 |
} else {
|
804 |
$this->logger->error('The block "' . $block['id'] . '" is already registered');
|
805 |
}
|
806 |
}
|
807 |
|
808 |
-
$blocks = array_reverse($blocks);
|
809 |
-
return $blocks;
|
810 |
}
|
811 |
|
812 |
/**
|
11 |
const EDITOR_TINYMCE = 0;
|
12 |
|
13 |
static $PRESETS_LIST;
|
14 |
+
|
15 |
+
// Cache
|
16 |
+
var $blocks = null;
|
17 |
|
18 |
/**
|
19 |
* @return NewsletterEmails
|
113 |
$controls->init();
|
114 |
echo '<input type="hidden" name="action" value="tnpc_render">';
|
115 |
echo '<input type="hidden" name="b" value="' . esc_attr($_REQUEST['id']) . '">';
|
116 |
+
echo '<input type="hidden" name="context_type" value="' . esc_attr( $context['type'] ) . '">';
|
117 |
$inline_edits = '';
|
118 |
if (isset($controls->data['inline_edits'])) {
|
119 |
$inline_edits = $controls->data['inline_edits'];
|
187 |
* conditioned (possibly) by the context. The context is usually passed to blocks
|
188 |
* so they can act in the right manner.
|
189 |
*
|
190 |
+
* $context contains a type and, for automated, the last_run.
|
|
|
|
|
191 |
*
|
192 |
* $email can actually be even a string containing the full newsletter HTML code.
|
193 |
*
|
214 |
$context = array_merge(array('last_run' => 0, 'type' => ''), $context);
|
215 |
|
216 |
preg_match_all('/data-json="(.*?)"/m', $theme, $matches, PREG_PATTERN_ORDER);
|
217 |
+
|
218 |
$result = '';
|
|
|
|
|
219 |
$subject = '';
|
220 |
|
221 |
foreach ($matches[1] as $match) {
|
225 |
$block = $this->get_block($options['block_id']);
|
226 |
if (!$block) {
|
227 |
$this->logger->debug('Unable to load the block ' . $options['block_id']);
|
228 |
+
//continue;
|
229 |
}
|
230 |
|
231 |
ob_start();
|
232 |
$out = $this->render_block($options['block_id'], true, $options, $context);
|
233 |
+
//var_dump($out);
|
234 |
+
if ($out['return_empty_message'] || $out['stop']) {
|
235 |
+
if (is_object($email)) {
|
236 |
+
return false;
|
237 |
+
}
|
238 |
+
return array();
|
239 |
+
}
|
240 |
+
if ($out['skip']) {
|
241 |
+
if (NEWSLETTER_DEBUG) {
|
242 |
+
$result .= 'Block removed by request';
|
243 |
+
}
|
244 |
+
continue;
|
245 |
}
|
246 |
if (empty($subject) && !empty($out['subject'])) {
|
247 |
$subject = $out['subject'];
|
248 |
}
|
249 |
$block_html = ob_get_clean();
|
250 |
$result .= $block_html;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
}
|
252 |
|
253 |
// We need to keep the CSS/HEAD part, the regenearion is only about blocks
|
267 |
if (is_object($email)) {
|
268 |
$email->message = $result;
|
269 |
$email->subject = $subject;
|
270 |
+
return true;
|
271 |
}
|
272 |
|
273 |
// Kept for compatibility
|
310 |
$block_options = get_option('newsletter_main');
|
311 |
|
312 |
$block = $this->get_block($block_id);
|
313 |
+
|
314 |
+
if (!isset($context['type'])) $context['type'] = '';
|
315 |
|
316 |
// Block not found
|
317 |
if (!$block) {
|
332 |
return;
|
333 |
}
|
334 |
|
335 |
+
$out = array('subject' => '', 'return_empty_message' => false, 'stop'=>false, 'skip'=>false);
|
336 |
|
337 |
|
338 |
ob_start();
|
772 |
*/
|
773 |
function get_blocks() {
|
774 |
|
775 |
+
if (!is_null($this->blocks))
|
776 |
+
return $this->blocks;
|
|
|
|
|
777 |
|
778 |
+
$this->blocks = $this->scan_blocks_dir(__DIR__ . '/blocks');
|
779 |
|
780 |
$extended = $this->scan_blocks_dir(WP_CONTENT_DIR . '/extensions/newsletter/blocks');
|
781 |
|
782 |
+
$this->blocks = array_merge($extended, $this->blocks);
|
783 |
|
784 |
$dirs = apply_filters('newsletter_blocks_dir', array());
|
785 |
+
|
786 |
+
//var_dump($dirs);
|
787 |
+
//die();
|
788 |
|
789 |
$this->logger->debug('Block dirs: ' . print_r($dirs, true));
|
790 |
|
791 |
foreach ($dirs as $dir) {
|
792 |
$dir = str_replace('\\', '/', $dir);
|
793 |
$list = $this->scan_blocks_dir($dir);
|
794 |
+
$this->blocks = array_merge($list, $this->blocks);
|
795 |
}
|
796 |
|
797 |
do_action('newsletter_register_blocks');
|
802 |
$this->logger->error($block);
|
803 |
continue;
|
804 |
}
|
805 |
+
if (!isset($this->blocks[$block['id']])) {
|
806 |
+
$this->blocks[$block['id']] = $block;
|
807 |
} else {
|
808 |
$this->logger->error('The block "' . $block['id'] . '" is already registered');
|
809 |
}
|
810 |
}
|
811 |
|
812 |
+
$this->blocks = array_reverse($this->blocks);
|
813 |
+
return $this->blocks;
|
814 |
}
|
815 |
|
816 |
/**
|
emails/tnp-composer/_scripts/newsletter-builder-v2.js
CHANGED
@@ -391,12 +391,11 @@ function tnpc_reload_options(e) {
|
|
391 |
e.preventDefault();
|
392 |
let options = jQuery("#tnpc-block-options-form").serializeArray();
|
393 |
for (let i = 0; i < options.length; i++) {
|
394 |
-
if (options[i].name
|
395 |
options[i].value = 'tnpc_options';
|
396 |
}
|
397 |
}
|
398 |
-
|
399 |
-
options["id"] = container.data("id");
|
400 |
jQuery("#tnpc-block-options-form").load(ajaxurl, options);
|
401 |
}
|
402 |
|
391 |
e.preventDefault();
|
392 |
let options = jQuery("#tnpc-block-options-form").serializeArray();
|
393 |
for (let i = 0; i < options.length; i++) {
|
394 |
+
if (options[i].name === 'action') {
|
395 |
options[i].value = 'tnpc_options';
|
396 |
}
|
397 |
}
|
398 |
+
|
|
|
399 |
jQuery("#tnpc-block-options-form").load(ajaxurl, options);
|
400 |
}
|
401 |
|
includes/addon.php
CHANGED
@@ -58,7 +58,7 @@ class NewsletterAddon {
|
|
58 |
|
59 |
function save_options($options) {
|
60 |
update_option('newsletter_' . $this->name, $options);
|
61 |
-
$this->
|
62 |
}
|
63 |
|
64 |
function merge_defaults($defaults) {
|
58 |
|
59 |
function save_options($options) {
|
60 |
update_option('newsletter_' . $this->name, $options);
|
61 |
+
$this->options = $options;
|
62 |
}
|
63 |
|
64 |
function merge_defaults($defaults) {
|
includes/composer.php
CHANGED
@@ -83,7 +83,7 @@ class TNP_Composer {
|
|
83 |
|
84 |
static function get_html_open($email) {
|
85 |
$open = "<!DOCTYPE html>\n";
|
86 |
-
$open .= "<html>\n<head>\n<title>
|
87 |
$open .= "<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n";
|
88 |
$open .= "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n";
|
89 |
$open .= "<style type=\"text/css\">\n";
|
83 |
|
84 |
static function get_html_open($email) {
|
85 |
$open = "<!DOCTYPE html>\n";
|
86 |
+
$open .= "<html>\n<head>\n<title>{email_subject}</title>\n";
|
87 |
$open .= "<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n";
|
88 |
$open .= "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n";
|
89 |
$open .= "<style type=\"text/css\">\n";
|
includes/controls.php
CHANGED
@@ -10,6 +10,9 @@ class NewsletterControls {
|
|
10 |
var $action = false;
|
11 |
var $button_data = '';
|
12 |
var $errors = '';
|
|
|
|
|
|
|
13 |
var $messages = '';
|
14 |
var $warnings = array();
|
15 |
var $countries = array(
|
@@ -375,6 +378,13 @@ class NewsletterControls {
|
|
375 |
echo '</div>';
|
376 |
}
|
377 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
378 |
|
379 |
function add_message_saved() {
|
380 |
if (!empty($this->messages)) {
|
@@ -788,6 +798,14 @@ class NewsletterControls {
|
|
788 |
}
|
789 |
}
|
790 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
791 |
/**
|
792 |
* With translated "Save" label.
|
793 |
*/
|
@@ -824,25 +842,45 @@ class NewsletterControls {
|
|
824 |
* Creates a button with "copy" action.
|
825 |
* @param type $data
|
826 |
*/
|
827 |
-
function button_copy($data = '') {
|
828 |
echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'copy\';if (!confirm(\'';
|
829 |
-
echo esc_attr(esc_js(__('Proceed?', 'newsletter')));
|
830 |
-
echo '\')) return false;"
|
831 |
-
|
832 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
833 |
echo '</button>';
|
834 |
}
|
835 |
|
836 |
/**
|
837 |
-
* Creates a button
|
838 |
* @param type $data
|
839 |
*/
|
840 |
-
function button_delete($data = '') {
|
841 |
echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'delete\';if (!confirm(\'';
|
842 |
-
echo esc_attr(esc_js(__('Proceed?', 'newsletter')));
|
843 |
-
echo '\')) return false;"
|
844 |
-
|
845 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
846 |
echo '</button>';
|
847 |
}
|
848 |
|
10 |
var $action = false;
|
11 |
var $button_data = '';
|
12 |
var $errors = '';
|
13 |
+
/**
|
14 |
+
* @var string
|
15 |
+
*/
|
16 |
var $messages = '';
|
17 |
var $warnings = array();
|
18 |
var $countries = array(
|
378 |
echo '</div>';
|
379 |
}
|
380 |
}
|
381 |
+
|
382 |
+
function add_message($text) {
|
383 |
+
if (!empty($this->messages)) {
|
384 |
+
$this->messages .= '<br><br>';
|
385 |
+
}
|
386 |
+
$this->messages .= $text;
|
387 |
+
}
|
388 |
|
389 |
function add_message_saved() {
|
390 |
if (!empty($this->messages)) {
|
798 |
}
|
799 |
}
|
800 |
|
801 |
+
function action_link($action, $label, $function = null) {
|
802 |
+
if ($function != null) {
|
803 |
+
echo '<input class="button-link" type="button" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';' . esc_html($function) . '"/>';
|
804 |
+
} else {
|
805 |
+
echo '<input class="button-link" type="submit" value="' . esc_attr($label) . '" onclick="this.form.act.value=\'' . esc_attr($action) . '\';return true;"/>';
|
806 |
+
}
|
807 |
+
}
|
808 |
+
|
809 |
/**
|
810 |
* With translated "Save" label.
|
811 |
*/
|
842 |
* Creates a button with "copy" action.
|
843 |
* @param type $data
|
844 |
*/
|
845 |
+
function button_copy($data = '', $label = null) {
|
846 |
echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'copy\';if (!confirm(\'';
|
847 |
+
echo esc_attr(esc_js(__('Proceed with copy?', 'newsletter')));
|
848 |
+
echo '\')) return false;"';
|
849 |
+
if (empty($label)) {
|
850 |
+
echo 'title="', esc_attr(__('Duplicate', 'newsletter')), '"';
|
851 |
+
}
|
852 |
+
echo '>';
|
853 |
+
echo '<i class="fas fa-copy"></i>';
|
854 |
+
if (is_null($label)) {
|
855 |
+
echo ' ', esc_html(__('Duplicate', 'newsletter'));
|
856 |
+
} else {
|
857 |
+
if (!empty($label)) {
|
858 |
+
echo ' ' , $label;
|
859 |
+
}
|
860 |
+
}
|
861 |
echo '</button>';
|
862 |
}
|
863 |
|
864 |
/**
|
865 |
+
* Creates a button with "delete" action.
|
866 |
* @param type $data
|
867 |
*/
|
868 |
+
function button_delete($data = '', $label = null) {
|
869 |
echo '<button class="button-secondary" onclick="this.form.btn.value=\'' . esc_attr($data) . '\';this.form.act.value=\'delete\';if (!confirm(\'';
|
870 |
+
echo esc_attr(esc_js(__('Proceed with delete?', 'newsletter')));
|
871 |
+
echo '\')) return false;"';
|
872 |
+
if (empty($label)) {
|
873 |
+
echo 'title="', esc_attr(__('Delete', 'newsletter')), '"';
|
874 |
+
}
|
875 |
+
echo '>';
|
876 |
+
echo '<i class="fas fa-times"></i>';
|
877 |
+
if (is_null($label)) {
|
878 |
+
echo ' ' , esc_html(__('Delete', 'newsletter'));
|
879 |
+
} else {
|
880 |
+
if (!empty($label)) {
|
881 |
+
echo ' ' , $label;
|
882 |
+
}
|
883 |
+
}
|
884 |
echo '</button>';
|
885 |
}
|
886 |
|
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.5.
|
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,13 +35,16 @@ if (version_compare(phpversion(), '5.6', '<')) {
|
|
35 |
return;
|
36 |
}
|
37 |
|
38 |
-
define('NEWSLETTER_VERSION', '6.5.
|
39 |
|
40 |
global $newsletter, $wpdb;
|
41 |
|
42 |
if (!defined('NEWSLETTER_BETA'))
|
43 |
define('NEWSLETTER_BETA', false);
|
44 |
|
|
|
|
|
|
|
45 |
if (!defined('NEWSLETTER_EXTENSION_UPDATE'))
|
46 |
define('NEWSLETTER_EXTENSION_UPDATE', true);
|
47 |
|
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.5.5
|
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.5.5');
|
39 |
|
40 |
global $newsletter, $wpdb;
|
41 |
|
42 |
if (!defined('NEWSLETTER_BETA'))
|
43 |
define('NEWSLETTER_BETA', false);
|
44 |
|
45 |
+
if (!defined('NEWSLETTER_DEBUG'))
|
46 |
+
define('NEWSLETTER_DEBUG', false);
|
47 |
+
|
48 |
if (!defined('NEWSLETTER_EXTENSION_UPDATE'))
|
49 |
define('NEWSLETTER_EXTENSION_UPDATE', true);
|
50 |
|
readme.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
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.3.2
|
5 |
-
Stable tag: 6.5.
|
6 |
Requires PHP: 5.6
|
7 |
Contributors: satollo,webagile,michael-travan
|
8 |
|
@@ -109,12 +109,20 @@ Thank you, The Newsletter Team
|
|
109 |
|
110 |
== Changelog ==
|
111 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
112 |
= 6.5.4 =
|
113 |
|
114 |
* Font awesome now included
|
115 |
* Spacing fix on hero block
|
116 |
* Support methods for the WooCommerce addon
|
117 |
-
* Security fix on CSV export
|
118 |
* Removed obsolete fonts
|
119 |
* PHP 5.6 check
|
120 |
|
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.3.2
|
5 |
+
Stable tag: 6.5.5
|
6 |
Requires PHP: 5.6
|
7 |
Contributors: satollo,webagile,michael-travan
|
8 |
|
109 |
|
110 |
== Changelog ==
|
111 |
|
112 |
+
= NEXT =
|
113 |
+
|
114 |
+
= 6.5.5 =
|
115 |
+
|
116 |
+
* Revised the posts block for the new Automated features
|
117 |
+
* Added action_link to controls
|
118 |
+
* Revised the newsletter regeneration and added blocks behaviors
|
119 |
+
|
120 |
= 6.5.4 =
|
121 |
|
122 |
* Font awesome now included
|
123 |
* Spacing fix on hero block
|
124 |
* Support methods for the WooCommerce addon
|
125 |
+
* Security fix on CSV export (reported by Vishnupriya Ilango of Fortinet's FortiGuard Labs)
|
126 |
* Removed obsolete fonts
|
127 |
* PHP 5.6 check
|
128 |
|