Popup Builder – Responsive WordPress Pop up - Version 3.51

Version Description

Current Version of Popup Builder is 3.51

Download this release

Release Info

Developer Sygnoos
Plugin Icon 128x128 Popup Builder – Responsive WordPress Pop up
Version 3.51
Comparing to
See all releases

Code changes from version 3.50 to 3.51

com/classes/Actions.php CHANGED
@@ -3,6 +3,7 @@ namespace sgpb;
3
  use \WP_Query;
4
  use \SgpbPopupConfig;
5
  use \SgpbDataConfig;
 
6
  class Actions
7
  {
8
  public $customPostTypeObj;
@@ -550,7 +551,7 @@ class Actions
550
  'interval' => SGPB_CRON_REPEAT_INTERVAL * 60,
551
  'display' => __('Once Every Minute', SG_POPUP_TEXT_DOMAIN)
552
  );
553
- $schedules = apply_filters('sgpNewsletterSendMinute', $schedules);
554
 
555
  return $schedules;
556
  }
@@ -575,6 +576,7 @@ class Actions
575
  $allAvailableShortcodes['patternLastName'] = '/\[Last name]/';
576
  $allAvailableShortcodes['patternBlogName'] = '/\[Blog name]/';
577
  $allAvailableShortcodes['patternUserName'] = '/\[User name]/';
 
578
 
579
  $pattern = "/\[(\[?)(Unsubscribe)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]\*+(?:\[(?!\/\2\])[^\[]\*+)\*+)\[\/\2\])?)(\]?)/";
580
  preg_match($pattern, $emailMessage, $matches);
@@ -667,9 +669,7 @@ class Actions
667
  $emailMessageCustom = stripslashes($emailMessageCustom);
668
 
669
  $emailMessageCustom = apply_filters('sgpNewsletterSendingMessage', $emailMessageCustom);
670
-
671
  $mailStatus = wp_mail($subscriber['email'], $mailSubject, $emailMessageCustom, $headers);
672
-
673
  if (!$mailStatus) {
674
  $errorLogSql = $wpdb->prepare('INSERT INTO '. $wpdb->prefix .SGPB_SUBSCRIBERS_ERROR_TABLE_NAME.' (`popupType`, `email`, `date`) VALUES (%s, %s, %s)', $subscriptionFormId, $subscriber['email'], date('Y-m-d H:i'));
675
  $wpdb->query($errorLogSql);
3
  use \WP_Query;
4
  use \SgpbPopupConfig;
5
  use \SgpbDataConfig;
6
+
7
  class Actions
8
  {
9
  public $customPostTypeObj;
551
  'interval' => SGPB_CRON_REPEAT_INTERVAL * 60,
552
  'display' => __('Once Every Minute', SG_POPUP_TEXT_DOMAIN)
553
  );
554
+ $schedules = apply_filters('sgpbCronTimeoutSettings', $schedules);
555
 
556
  return $schedules;
557
  }
576
  $allAvailableShortcodes['patternLastName'] = '/\[Last name]/';
577
  $allAvailableShortcodes['patternBlogName'] = '/\[Blog name]/';
578
  $allAvailableShortcodes['patternUserName'] = '/\[User name]/';
579
+ $allAvailableShortcodes['patternUnsubscribe'] = '';
580
 
581
  $pattern = "/\[(\[?)(Unsubscribe)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]\*+(?:\[(?!\/\2\])[^\[]\*+)\*+)\[\/\2\])?)(\]?)/";
582
  preg_match($pattern, $emailMessage, $matches);
669
  $emailMessageCustom = stripslashes($emailMessageCustom);
670
 
671
  $emailMessageCustom = apply_filters('sgpNewsletterSendingMessage', $emailMessageCustom);
 
672
  $mailStatus = wp_mail($subscriber['email'], $mailSubject, $emailMessageCustom, $headers);
 
673
  if (!$mailStatus) {
674
  $errorLogSql = $wpdb->prepare('INSERT INTO '. $wpdb->prefix .SGPB_SUBSCRIBERS_ERROR_TABLE_NAME.' (`popupType`, `email`, `date`) VALUES (%s, %s, %s)', $subscriptionFormId, $subscriber['email'], date('Y-m-d H:i'));
675
  $wpdb->query($errorLogSql);
com/classes/Filters.php CHANGED
@@ -33,7 +33,7 @@ class Filters
33
  add_filter('post_row_actions', array($this, 'quickRowLinksManager'), 10, 2);
34
  add_filter('sgpbAdminJs', array($this, 'adminJsFilter'), 1, 1);
35
  add_filter('sgpbAdminCssFiles', array($this, 'sgpbAdminCssFiles'), 1, 1);
36
- add_filter('sgpbPopupContentLoadToPage', array($this, 'filterPopupContent'), 10, 1);
37
  add_filter('the_content', array($this, 'clearContentPreviewMode'), 10, 1);
38
  // The priority of this action should be higher than the extensions' init priority.
39
  add_action('init', array($this, 'excludePostToShowPrepare'), 99999999);
@@ -88,6 +88,7 @@ class Filters
88
 
89
  $inactiveExtensionNotice['priority'] = 1;
90
  $inactiveExtensionNotice['type'] = 1;
 
91
  $inactiveExtensionNotice['message'] = $message;
92
 
93
  $notifications[] = $inactiveExtensionNotice;
@@ -449,7 +450,7 @@ class Filters
449
  return $content;
450
  }
451
 
452
- public function filterPopupContent($content)
453
  {
454
  preg_match_all('/<iframe.*?src="(.*?)".*?<\/iframe>/', $content, $matches);
455
  /*$finalContent = '';*/
33
  add_filter('post_row_actions', array($this, 'quickRowLinksManager'), 10, 2);
34
  add_filter('sgpbAdminJs', array($this, 'adminJsFilter'), 1, 1);
35
  add_filter('sgpbAdminCssFiles', array($this, 'sgpbAdminCssFiles'), 1, 1);
36
+ add_filter('sgpbPopupContentLoadToPage', array($this, 'filterPopupContent'), 10, 2);
37
  add_filter('the_content', array($this, 'clearContentPreviewMode'), 10, 1);
38
  // The priority of this action should be higher than the extensions' init priority.
39
  add_action('init', array($this, 'excludePostToShowPrepare'), 99999999);
88
 
89
  $inactiveExtensionNotice['priority'] = 1;
90
  $inactiveExtensionNotice['type'] = 1;
91
+ $inactiveExtensionNotice['id'] = 'sgpbMainActiveInactiveLicense';
92
  $inactiveExtensionNotice['message'] = $message;
93
 
94
  $notifications[] = $inactiveExtensionNotice;
450
  return $content;
451
  }
452
 
453
+ public function filterPopupContent($content, $popupId)
454
  {
455
  preg_match_all('/<iframe.*?src="(.*?)".*?<\/iframe>/', $content, $matches);
456
  /*$finalContent = '';*/
com/classes/Notification.php CHANGED
@@ -68,10 +68,6 @@ class Notification
68
  public function getCloseBtnById($id)
69
  {
70
  $dismissedNotification = SGPBNotificationCenter::getAllDismissedNotifications();
71
- if (isset($dismissedNotification[$id])) {
72
- return '<button data-id="'.$id.'" class="button dismiss sgpb-activate-notification-js"><span class="dashicons dashicons-hidden"></span></button>';
73
- }
74
-
75
  return '<button data-id="'.$id.'" class="button dismiss sgpb-dismiss-notification-js"><span class="dashicons dashicons-no-alt"></span></button>';
76
  }
77
  }
68
  public function getCloseBtnById($id)
69
  {
70
  $dismissedNotification = SGPBNotificationCenter::getAllDismissedNotifications();
 
 
 
 
71
  return '<button data-id="'.$id.'" class="button dismiss sgpb-dismiss-notification-js"><span class="dashicons dashicons-no-alt"></span></button>';
72
  }
73
  }
com/classes/NotificationCenter.php CHANGED
@@ -4,7 +4,7 @@ namespace sgpb;
4
  class SGPBNotificationCenter
5
  {
6
  private $notificationsCount = 0;
7
- private $requestUrl = SG_POPUP_BUILDER_URL.'notifications.json';
8
  private $cronTimeout = 'daily';
9
 
10
  public function __construct()
@@ -15,7 +15,7 @@ class SGPBNotificationCenter
15
 
16
  public function addActions()
17
  {
18
- add_filter('cron_schedules', array($this, 'cronAddMinutes'), 10, 1);
19
  add_action('sgpbGetNotifications', array($this, 'updateNotificationsArray'));
20
  add_action('wp_ajax_sgpb_dismiss_notification', array($this, 'dismissNotification'));
21
  add_action('admin_head', array($this, 'menuItemCounter'));
@@ -105,7 +105,7 @@ class SGPBNotificationCenter
105
  $dismissedNotifications = get_option('sgpb-all-dismissed-notifications');
106
  $dismissedNotifications = json_decode($dismissedNotifications, true);
107
  foreach ($notifications as $notification) {
108
- $id = $notification['id'];
109
  if (isset($dismissedNotifications[$id])) {
110
  continue;
111
  }
4
  class SGPBNotificationCenter
5
  {
6
  private $notificationsCount = 0;
7
+ private $requestUrl = SG_POPUP_BUILDER_NOTIFICATIONS_URL;
8
  private $cronTimeout = 'daily';
9
 
10
  public function __construct()
15
 
16
  public function addActions()
17
  {
18
+ add_filter('sgpbCronTimeoutSettings', array($this, 'cronAddMinutes'), 10, 1);
19
  add_action('sgpbGetNotifications', array($this, 'updateNotificationsArray'));
20
  add_action('wp_ajax_sgpb_dismiss_notification', array($this, 'dismissNotification'));
21
  add_action('admin_head', array($this, 'menuItemCounter'));
105
  $dismissedNotifications = get_option('sgpb-all-dismissed-notifications');
106
  $dismissedNotifications = json_decode($dismissedNotifications, true);
107
  foreach ($notifications as $notification) {
108
+ $id = @$notification['id'];
109
  if (isset($dismissedNotifications[$id])) {
110
  continue;
111
  }
com/classes/ScriptsLoader.php CHANGED
@@ -136,7 +136,7 @@ class ScriptsLoader
136
 
137
  $popupOptions = $this->getEncodedOptionsFromPopup($popup);
138
 
139
- $popupContent = apply_filters('sgpbPopupContentLoadToPage', $popup->getPopupTypeContent());
140
 
141
  add_action('admin_footer', function() use ($popupId, $events, $popupOptions, $popupContent) {
142
  $footerPopupContent = '<div style="position:absolute;top: -999999999999999999999px;">
136
 
137
  $popupOptions = $this->getEncodedOptionsFromPopup($popup);
138
 
139
+ $popupContent = apply_filters('sgpbPopupContentLoadToPage', $popup->getPopupTypeContent(), $popupId);
140
 
141
  add_action('admin_footer', function() use ($popupId, $events, $popupOptions, $popupContent) {
142
  $footerPopupContent = '<div style="position:absolute;top: -999999999999999999999px;">
com/classes/popups/SGPopup.php CHANGED
@@ -686,10 +686,6 @@ abstract class SGPopup
686
  return true;
687
  }
688
 
689
- if ($saveMode) {
690
- $eventsFromPopup[] = array();
691
- }
692
-
693
  $eventsFromPopup = apply_filters('sgpbPopupEventsMetadata', $eventsFromPopup);
694
 
695
  return update_post_meta($popupId, 'sg_popup_events'.$saveMode, $eventsFromPopup);
686
  return true;
687
  }
688
 
 
 
 
 
689
  $eventsFromPopup = apply_filters('sgpbPopupEventsMetadata', $eventsFromPopup);
690
 
691
  return update_post_meta($popupId, 'sg_popup_events'.$saveMode, $eventsFromPopup);
com/config/config.php CHANGED
@@ -107,6 +107,7 @@ class SgpbPopupConfig
107
  self::addDefine('SGPB_POPUP_TYPE_RESTRICTION', 'ageRestriction');
108
  self::addDefine('SGPB_POPUP_DEFAULT_SOUND', 'popupOpenSound.wav');
109
  self::addDefine('SGPB_POPUP_EXTENSIONS_PATH', SG_POPUP_COM_PATH.'extensions/');
 
110
  self::addDefine('SGPB_POPUP_ADVANCED_CLOSING_PLUGIN_KEY', 'popupbuilder-advanced-closing/PopupBuilderAdvancedClosing.php');
111
  self::addDefine('SGPB_DONT_SHOW_POPUP_EXPIRY', 365);
112
  self::addDefine('SGPB_CONTACT_FORM_7_BEHAVIOR_KEY', 'contact-form-7');
107
  self::addDefine('SGPB_POPUP_TYPE_RESTRICTION', 'ageRestriction');
108
  self::addDefine('SGPB_POPUP_DEFAULT_SOUND', 'popupOpenSound.wav');
109
  self::addDefine('SGPB_POPUP_EXTENSIONS_PATH', SG_POPUP_COM_PATH.'extensions/');
110
+ self::addDefine('SG_POPUP_BUILDER_NOTIFICATIONS_URL', 'https://popup-builder.com/notifications.json');
111
  self::addDefine('SGPB_POPUP_ADVANCED_CLOSING_PLUGIN_KEY', 'popupbuilder-advanced-closing/PopupBuilderAdvancedClosing.php');
112
  self::addDefine('SGPB_DONT_SHOW_POPUP_EXPIRY', 365);
113
  self::addDefine('SGPB_CONTACT_FORM_7_BEHAVIOR_KEY', 'contact-form-7');
com/config/configPackage.php CHANGED
@@ -3,6 +3,6 @@ if (!defined('ABSPATH')) {
3
  exit();
4
  }
5
 
6
- define('SG_POPUP_VERSION', '3.50');
7
  define('SGPB_POPUP_PKG', SGPB_POPUP_PKG_FREE);
8
  define('POPUP_BUILDER_BASENAME', 'popupbuilder-platinum/popup-builder.php');
3
  exit();
4
  }
5
 
6
+ define('SG_POPUP_VERSION', '3.51');
7
  define('SGPB_POPUP_PKG', SGPB_POPUP_PKG_FREE);
8
  define('POPUP_BUILDER_BASENAME', 'popupbuilder-platinum/popup-builder.php');
com/helpers/AdminHelper.php CHANGED
@@ -496,7 +496,8 @@ class AdminHelper
496
 
497
  $savedUserRoles = self::getPopupPostAllowedUserRoles();
498
  $currentUserRole = self::getCurrentUserRole();
499
- if (!is_array($savedUserRoles) || !is_array($currentUserRole)) {
 
500
  return true;
501
  }
502
 
496
 
497
  $savedUserRoles = self::getPopupPostAllowedUserRoles();
498
  $currentUserRole = self::getCurrentUserRole();
499
+ $userSavedRoles = get_option('sgpb-user-roles');
500
+ if (!is_array($savedUserRoles) || !is_array($currentUserRole) || empty($userSavedRoles)) {
501
  return true;
502
  }
503
 
com/helpers/ConfigDataHelper.php CHANGED
@@ -486,7 +486,8 @@ class ConfigDataHelper
486
  'user-role' => __('User Role', SG_POPUP_TEXT_DOMAIN),
487
  'countries' => __('Countries', SG_POPUP_TEXT_DOMAIN),
488
  'detect-by-url' => __('Detect by URL', SG_POPUP_TEXT_DOMAIN),
489
- 'cookie-detection' => __('Cookie Detection', SG_POPUP_TEXT_DOMAIN)
 
490
  );
491
 
492
  $data['closeButtonPositions'] = array(
486
  'user-role' => __('User Role', SG_POPUP_TEXT_DOMAIN),
487
  'countries' => __('Countries', SG_POPUP_TEXT_DOMAIN),
488
  'detect-by-url' => __('Detect by URL', SG_POPUP_TEXT_DOMAIN),
489
+ 'cookie-detection' => __('Cookie Detection', SG_POPUP_TEXT_DOMAIN),
490
+ 'operation-system' => __('Operating System', SG_POPUP_TEXT_DOMAIN)
491
  );
492
 
493
  $data['closeButtonPositions'] = array(
popup-builder.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Popup Builder
4
  * Plugin URI: https://popup-builder.com
5
  * Description: The most complete popup plugin. Html, image, iframe, shortcode, video and many other popup types. Manage popup dimensions, effects, themes and more.
6
- * Version: 3.50
7
  * Author: Sygnoos
8
  * Author URI: https://sygnoos.com
9
  * License: GPLv2
3
  * Plugin Name: Popup Builder
4
  * Plugin URI: https://popup-builder.com
5
  * Description: The most complete popup plugin. Html, image, iframe, shortcode, video and many other popup types. Manage popup dimensions, effects, themes and more.
6
+ * Version: 3.51
7
  * Author: Sygnoos
8
  * Author URI: https://sygnoos.com
9
  * License: GPLv2
public/js/Backend.js CHANGED
@@ -1571,6 +1571,11 @@ SGPBBackend.prototype.changeColor = function(element)
1571
 
1572
  SGPBBackend.prototype.previewInit = function()
1573
  {
 
 
 
 
 
1574
  jQuery('#post-preview').click(function() {
1575
  SGPBBackend.prototype.autosave();
1576
  /* when preview button clicked, set input value to 1 */
@@ -1581,7 +1586,7 @@ SGPBBackend.prototype.previewInit = function()
1581
  SGPBBackend.prototype.autosave();
1582
  });
1583
  jQuery('#publish').click(function() {
1584
- /* when bublish/update clicked, set input value to 0 */
1585
  jQuery('#sgpb-is-preview').val('0');
1586
  });
1587
  };
1571
 
1572
  SGPBBackend.prototype.previewInit = function()
1573
  {
1574
+ jQuery('input').on('change', function() {
1575
+ jQuery('.wrap').on('click', function() {
1576
+ SGPBBackend.prototype.autosave();
1577
+ })
1578
+ });
1579
  jQuery('#post-preview').click(function() {
1580
  SGPBBackend.prototype.autosave();
1581
  /* when preview button clicked, set input value to 1 */
1586
  SGPBBackend.prototype.autosave();
1587
  });
1588
  jQuery('#publish').click(function() {
1589
+ /* when publish/update clicked, set input value to 0 */
1590
  jQuery('#sgpb-is-preview').val('0');
1591
  });
1592
  };
public/views/conditionsView.php CHANGED
@@ -51,7 +51,7 @@ $defaultConditions = $defaultData['freeConditions'];
51
  <?php echo AdminHelper::createSelectBox(array('is' => __('Is', SG_POPUP_TEXT_DOMAIN), 'is-not' => __('Is not', SG_POPUP_TEXT_DOMAIN)), 'is', array('class' => 'js-sg-select2')); ?>
52
  </div>
53
  <div class="col-md-3">
54
- <input type="text" class="sgpb-full-width-events form-control" value="<?php _e('Select needed countries', SG_POPUP_TEXT_DOMAIN);?>">
55
  </div>
56
  <div class="col-md-3">
57
  <a href="<?php echo SG_POPUP_ADVANCED_TARGETING_URL;?>" target="_blank" class="btn btn-warning btn-xs sgpb-advanced-targeting-pro-label">
@@ -167,7 +167,33 @@ $defaultConditions = $defaultData['freeConditions'];
167
  </a>
168
  </div>
169
  </div>
170
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  <div class="row">
172
  <div class="col-md-3">
173
  <label><?php _e('Condition', SG_POPUP_TEXT_DOMAIN);?></label>
51
  <?php echo AdminHelper::createSelectBox(array('is' => __('Is', SG_POPUP_TEXT_DOMAIN), 'is-not' => __('Is not', SG_POPUP_TEXT_DOMAIN)), 'is', array('class' => 'js-sg-select2')); ?>
52
  </div>
53
  <div class="col-md-3">
54
+ <input type="text" class="sgpb-full-width-events form-control" value="<?php _e('Select needed devices', SG_POPUP_TEXT_DOMAIN);?>">
55
  </div>
56
  <div class="col-md-3">
57
  <a href="<?php echo SG_POPUP_ADVANCED_TARGETING_URL;?>" target="_blank" class="btn btn-warning btn-xs sgpb-advanced-targeting-pro-label">
167
  </a>
168
  </div>
169
  </div>
170
+ <div class="row">
171
+ <div class="col-md-3">
172
+ <label><?php _e('Condition', SG_POPUP_TEXT_DOMAIN);?></label>
173
+ </div>
174
+ <div class="col-md-3">
175
+ <label><?php _e('Rule', SG_POPUP_TEXT_DOMAIN);?></label>
176
+ </div>
177
+ <div class="col-md-3">
178
+ <label><?php _e('Select user OS', SG_POPUP_TEXT_DOMAIN);?></label>
179
+ </div>
180
+ </div>
181
+ <div class="row form-group">
182
+ <div class="col-md-3">
183
+ <?php echo AdminHelper::createSelectBox($defaultConditions, 'operation-system', array('class' => 'js-sg-select2')); ?>
184
+ </div>
185
+ <div class="col-md-3">
186
+ <?php echo AdminHelper::createSelectBox(array('is' => __('Is', SG_POPUP_TEXT_DOMAIN), 'is-not' => __('Is not', SG_POPUP_TEXT_DOMAIN)), 'is', array('class' => 'js-sg-select2')); ?>
187
+ </div>
188
+ <div class="col-md-3">
189
+ <input type="text" class="sgpb-full-width-events form-control" value="<?php _e('IOS, Android, Windows, Linux...', SG_POPUP_TEXT_DOMAIN);?>">
190
+ </div>
191
+ <div class="col-md-3">
192
+ <a href="<?php echo SG_POPUP_ADVANCED_TARGETING_URL;?>" target="_blank" class="btn btn-warning btn-xs sgpb-advanced-targeting-pro-label">
193
+ <?php _e('UNLOCK OPTION', SG_POPUP_TEXT_DOMAIN);?>
194
+ </a>
195
+ </div>
196
+ </div>
197
  <div class="row">
198
  <div class="col-md-3">
199
  <label><?php _e('Condition', SG_POPUP_TEXT_DOMAIN);?></label>
public/views/eventsView.php CHANGED
@@ -4,7 +4,7 @@ $eventsData = $popupTypeObj->getOptionValue('sgpb-events');
4
  $popupTargetData = ConditionBuilder::createEventsConditionBuilder($eventsData);
5
  ?>
6
 
7
- <div class="popup-conditions-wrapper popup-special-conditions-wrapper popup-conditions-events sgpb-wrapper" data-condition-type="events">
8
  <?php
9
  $creator = new ConditionCreator($popupTargetData);
10
  echo $creator->render();
4
  $popupTargetData = ConditionBuilder::createEventsConditionBuilder($eventsData);
5
  ?>
6
 
7
+ <div class="popup-conditions-wrapper popup-special-conditions-wrapper popup-conditions-events sgpb-wrapper" data-condition-type="events">
8
  <?php
9
  $creator = new ConditionCreator($popupTargetData);
10
  echo $creator->render();
readme.txt CHANGED
@@ -9,7 +9,7 @@ Tags: popup, pop up, wordpress popup, popup maker, exit popup, popup builder, wo
9
  Requires at least: 3.8
10
  Tested up to: 5.3
11
  Requires PHP: 5.3.3
12
- Stable tag: 3.50
13
  License: GPLv2 or later
14
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
15
 
@@ -185,13 +185,18 @@ Go to the Popup Builder settings and set your desired options.
185
 
186
  == Changelog ==
187
 
 
 
 
 
 
 
188
  = Version 3.50 =
189
  * Added new feature to add custom JS and CSS codes. You can add your custom JS logic to control popup opening also you can add custom CSS to change popup styles.
190
  * Bug fixed related to image upload.
191
  * Big fixed related to popup opening events. Sometimes it didn't get saved.
192
  * Code improvements. We have changed the auto save option to not call AJAX every time.
193
 
194
-
195
  = Version 3.49 =
196
  * Added async image preloading to make Image popup loads faster.
197
  * Code improvements and minor bug fixes.
@@ -1063,7 +1068,7 @@ Leave us a good review :)
1063
 
1064
  == Upgrade Notice ==
1065
 
1066
- Current Version of Popup Builder is 3.50
1067
 
1068
  == Other Notes ==
1069
 
9
  Requires at least: 3.8
10
  Tested up to: 5.3
11
  Requires PHP: 5.3.3
12
+ Stable tag: 3.51
13
  License: GPLv2 or later
14
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
15
 
185
 
186
  == Changelog ==
187
 
188
+ = Version 3.51 =
189
+ * Bug fixed related to Newsletter.
190
+ * Added new parameter PopupID inside sgpbPopupContentLoadToPage filter.
191
+ * Added plugin notification URL.
192
+ * Typo fixes.
193
+
194
  = Version 3.50 =
195
  * Added new feature to add custom JS and CSS codes. You can add your custom JS logic to control popup opening also you can add custom CSS to change popup styles.
196
  * Bug fixed related to image upload.
197
  * Big fixed related to popup opening events. Sometimes it didn't get saved.
198
  * Code improvements. We have changed the auto save option to not call AJAX every time.
199
 
 
200
  = Version 3.49 =
201
  * Added async image preloading to make Image popup loads faster.
202
  * Code improvements and minor bug fixes.
1068
 
1069
  == Upgrade Notice ==
1070
 
1071
+ Current Version of Popup Builder is 3.51
1072
 
1073
  == Other Notes ==
1074