Newsletter - Version 6.5.5

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 Icon 128x128 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 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
- if ( isset( $context['type'] ) && $context['type'] == 'automated' ) {
76
- // No new posts
 
77
  if (empty($posts)) {
78
- if (isset($options['automated_required'])) {
79
- $out['return_empty_message'] = true;
 
 
 
 
 
80
  }
81
- return;
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
- $out['subject'] = $posts[0]->post_title;
 
 
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('automated_include', __('What to include', 'newsletter'), array('new' => __('New posts after last newsletter', 'newsletter'),
12
- 'max' => __('Always max posts if at least one is new', 'newsletter')),
13
- array('description'=>'This option is effective only when the newsletter is generated, not while composing')) ?>
14
- <?php $fields->checkbox('automated_required', __('Required', 'newsletter'), array('description'=>'This block must return content or the newslettter has not to be sent')) ?>
 
 
 
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
- * The last run parameter can instruct the block to generate content conditioned to
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
- if ($out['return_empty_message']) {
233
- return '';
 
 
 
 
 
 
 
 
 
 
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
- static $blocks = null;
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 == 'action') {
395
  options[i].value = 'tnpc_options';
396
  }
397
  }
398
- options["action"] = "tnpc_options";
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->setup_options();
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>" . esc_html($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";
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
- echo '<i class="fas fa-copy"></i> ';
832
- echo esc_html(__('Duplicate', 'newsletter'));
 
 
 
 
 
 
 
 
 
 
833
  echo '</button>';
834
  }
835
 
836
  /**
837
- * Creates a button wirh "delete" action.
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
- echo '<i class="fas fa-times"></i> ';
845
- echo esc_html(__('Delete', 'newsletter'));
 
 
 
 
 
 
 
 
 
 
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.4
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.4');
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.4
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