NextGEN Gallery – WordPress Gallery Plugin - Version 3.11

Version Description

  • 05.26.2021
  • Fixed: Now compatible with NimbleBuilder
  • Fixed: Importing images from the Media Library was broken due to a z-index issue
Download this release

Release Info

Developer photocrati
Plugin Icon 128x128 NextGEN Gallery – WordPress Gallery Plugin
Version 3.11
Comparing to
See all releases

Code changes from version 3.10 to 3.11

changelog.txt CHANGED
@@ -1,6 +1,10 @@
1
  NextGEN Gallery
2
  by Imagely
3
 
 
 
 
 
4
  = V3.10 - 05.19.2021
5
  * NEW: Added option under Misc Options to disable the /ngg_tag/ page feature
6
  * Fixed: Misc performance improvements to NGG 3.9.0
1
  NextGEN Gallery
2
  by Imagely
3
 
4
+ = V3.11 - 05.26.2021
5
+ * Fixed: Now compatible with NimbleBuilder
6
+ * Fixed: Importing images from the Media Library was broken due to a z-index issue
7
+
8
  = V3.10 - 05.19.2021
9
  * NEW: Added option under Misc Options to disable the /ngg_tag/ page feature
10
  * Fixed: Misc performance improvements to NGG 3.9.0
nggallery.php CHANGED
@@ -4,7 +4,7 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
4
  /**
5
  * Plugin Name: NextGEN Gallery
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.
7
- * Version: 3.10
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
@@ -712,7 +712,7 @@ class C_NextGEN_Bootstrap
712
  define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
713
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
714
  define('NGG_PLUGIN_STARTED_AT', microtime());
715
- define('NGG_PLUGIN_VERSION', '3.10');
716
 
717
  define(
718
  'NGG_SCRIPT_VERSION',
4
  /**
5
  * Plugin Name: NextGEN Gallery
6
  * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.
7
+ * Version: 3.11
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
712
  define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
713
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
714
  define('NGG_PLUGIN_STARTED_AT', microtime());
715
+ define('NGG_PLUGIN_VERSION', '3.11');
716
 
717
  define(
718
  'NGG_SCRIPT_VERSION',
non_pope/class.nextgen_shortcode_manager.php CHANGED
@@ -87,9 +87,9 @@ class C_NextGen_Shortcode_Manager
87
  // altered we substitute our shortcodes with placeholders at the start of the the_content() filter
88
  // queue and then at the end of the the_content() queue, we substitute the placeholders with our
89
  // actual markup
90
- add_filter('the_content', array(&$this, 'fix_nested_shortcodes'), -1);
91
- add_filter('the_content', array(&$this, 'parse_content'), PHP_INT_MAX);
92
- add_filter('widget_text', array(&$this, 'fix_nested_shortcodes'), -1);
93
  }
94
 
95
  /**
@@ -302,13 +302,24 @@ class C_NextGen_Shortcode_Manager
302
 
303
  function replace_with_placeholder($shortcode, $params=array(), $inner_content='')
304
  {
305
- $id = count($this->_found);
306
- $this->_found[$id] = array(
307
- 'shortcode' => $shortcode,
308
- 'params' => $params,
309
- 'inner_content' => $inner_content
310
- );
311
-
312
- return sprintf($this->_placeholder_text, $id); // try to wptexturize this! ha!
 
 
313
  }
 
 
 
 
 
 
 
 
 
314
  }
87
  // altered we substitute our shortcodes with placeholders at the start of the the_content() filter
88
  // queue and then at the end of the the_content() queue, we substitute the placeholders with our
89
  // actual markup
90
+ add_filter('the_content', [$this, 'fix_nested_shortcodes'], -1);
91
+ add_filter('the_content', [$this, 'parse_content'], PHP_INT_MAX);
92
+ add_filter('widget_text', [$this, 'fix_nested_shortcodes'], -1);
93
  }
94
 
95
  /**
302
 
303
  function replace_with_placeholder($shortcode, $params=array(), $inner_content='')
304
  {
305
+ $id = count($this->_found);
306
+ $this->_found[$id] = array(
307
+ 'shortcode' => $shortcode,
308
+ 'params' => $params,
309
+ 'inner_content' => $inner_content
310
+ );
311
+
312
+ $placeholder = sprintf($this->_placeholder_text, $id); // try to wptexturize this! ha!
313
+
314
+ return apply_filters('ngg_shortcode_placeholder', $placeholder, $shortcode, $params, $inner_content);
315
  }
316
+
317
+ /**
318
+ * @return string
319
+ */
320
+ public function get_shortcode_regex()
321
+ {
322
+ $keys = array_keys($this->_shortcodes);
323
+ return '/' . get_shortcode_regex($keys) . '/';
324
+ }
325
  }
products/photocrati_nextgen/modules/nextgen_block/static/editor.css CHANGED
@@ -31,7 +31,7 @@ div[data-type="imagely/nextgen-gallery"]:focus::after {
31
  bottom: 50px;
32
  right: 35px;
33
  left: 35px;
34
- z-index: 999999;
35
  }
36
 
37
  #add-ngg-gallery-modal-background {
@@ -41,7 +41,7 @@ div[data-type="imagely/nextgen-gallery"]:focus::after {
41
  left: 0;
42
  right: 0;
43
  bottom: 0;
44
- z-index: 99999;
45
  opacity: 70%;
46
  }
47
 
31
  bottom: 50px;
32
  right: 35px;
33
  left: 35px;
34
+ z-index: 99999;
35
  }
36
 
37
  #add-ngg-gallery-modal-background {
41
  left: 0;
42
  right: 0;
43
  bottom: 0;
44
+ z-index: 99988;
45
  opacity: 70%;
46
  }
47
 
products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css CHANGED
@@ -1 +1 @@
1
- div[data-type="imagely/nextgen-gallery"]{z-index:30}div[data-type="imagely/nextgen-gallery"].is-hovered>.editor-block-list__block-edit:before,div[data-type="imagely/nextgen-gallery"].is-selected>.editor-block-list__block-edit:before{outline:0!important}div[data-type="imagely/nextgen-gallery"] .editor-block-list__breadcrumb{display:none!important}div[data-type="imagely/nextgen-gallery"]:focus::after{box-shadow:none!important}#add-ngg-gallery-modal{background:#fff;position:fixed;top:50px;bottom:50px;right:35px;left:35px;z-index:999999}#add-ngg-gallery-modal-background{background:#000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999;opacity:70%}#add-ngg-gallery-modal p{color:#fff}#add-ngg-gallery-modal iframe{height:100%;width:100%}#add-ngg-gallery-modal-close{position:absolute;top:10px;right:25px;background-color:#9fbb1a;border-radius:50%;color:#fff;padding:1px}#add-ngg-gallery-modal-spinner{position:absolute;top:0;left:0;bottom:0;right:0;display:flex;justify-content:center;align-items:center;z-index:2;background:#fff;opacity:1;transition:visibility .5s linear .6s,opacity .4s linear,font-size .3s linear;visibility:visible;font-size:15vh}#add-ngg-gallery-modal-spinner.add-ngg-gallery-modal-spinner-hidden{opacity:0;visibility:hidden;transition-delay:0s;font-size:.5vh}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-parent{outline:0!important}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-block{background-color:#fff;border-radius:2px;box-shadow:0 0 4px 2px rgba(0,0,0,.05);box-sizing:border-box;border-top:5px solid #b8d330;color:#fff;font-family:sans-serif;font-size:20px;outline:0!important;min-height:210px;padding:60px 60px 70px;display:flex;justify-content:center;align-items:center;flex-wrap:wrap}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-block h3{color:#000!important;font-family:Lato,sans-serif!important;font-size:21px;font-weight:700!important;letter-spacing:3px!important;margin-bottom:15px;margin-top:0;text-align:center;text-transform:uppercase;width:100%}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button{font-size:14px;letter-spacing:1.2px;line-height:20px;font-family:Lato,sans-serif;font-weight:900;color:#fff;background-color:#000;border:none;box-shadow:none;padding:12px 24px;text-transform:uppercase;text-align:center;cursor:pointer;flex:1;flex-grow:0;margin:0 0 0 15px}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:only-of-type{flex-grow:1;width:300px;max-width:300px}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:first-of-type{margin-left:0}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:hover{background:#383838}
1
+ div[data-type="imagely/nextgen-gallery"]{z-index:30}div[data-type="imagely/nextgen-gallery"].is-hovered>.editor-block-list__block-edit:before,div[data-type="imagely/nextgen-gallery"].is-selected>.editor-block-list__block-edit:before{outline:0!important}div[data-type="imagely/nextgen-gallery"] .editor-block-list__breadcrumb{display:none!important}div[data-type="imagely/nextgen-gallery"]:focus::after{box-shadow:none!important}#add-ngg-gallery-modal{background:#fff;position:fixed;top:50px;bottom:50px;right:35px;left:35px;z-index:99999}#add-ngg-gallery-modal-background{background:#000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:99988;opacity:70%}#add-ngg-gallery-modal p{color:#fff}#add-ngg-gallery-modal iframe{height:100%;width:100%}#add-ngg-gallery-modal-close{position:absolute;top:10px;right:25px;background-color:#9fbb1a;border-radius:50%;color:#fff;padding:1px}#add-ngg-gallery-modal-spinner{position:absolute;top:0;left:0;bottom:0;right:0;display:flex;justify-content:center;align-items:center;z-index:2;background:#fff;opacity:1;transition:visibility .5s linear .6s,opacity .4s linear,font-size .3s linear;visibility:visible;font-size:15vh}#add-ngg-gallery-modal-spinner.add-ngg-gallery-modal-spinner-hidden{opacity:0;visibility:hidden;transition-delay:0s;font-size:.5vh}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-parent{outline:0!important}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-block{background-color:#fff;border-radius:2px;box-shadow:0 0 4px 2px rgba(0,0,0,.05);box-sizing:border-box;border-top:5px solid #b8d330;color:#fff;font-family:sans-serif;font-size:20px;outline:0!important;min-height:210px;padding:60px 60px 70px;display:flex;justify-content:center;align-items:center;flex-wrap:wrap}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-block h3{color:#000!important;font-family:Lato,sans-serif!important;font-size:21px;font-weight:700!important;letter-spacing:3px!important;margin-bottom:15px;margin-top:0;text-align:center;text-transform:uppercase;width:100%}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button{font-size:14px;letter-spacing:1.2px;line-height:20px;font-family:Lato,sans-serif;font-weight:900;color:#fff;background-color:#000;border:none;box-shadow:none;padding:12px 24px;text-transform:uppercase;text-align:center;cursor:pointer;flex:1;flex-grow:0;margin:0 0 0 15px}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:only-of-type{flex-grow:1;width:300px;max-width:300px}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:first-of-type{margin-left:0}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-button:hover{background:#383838}
products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php CHANGED
@@ -99,54 +99,64 @@ class M_Gallery_Display extends C_Base_Module
99
 
100
  function enqueue_frontend_resources()
101
  {
102
- global $post;
 
103
 
104
- if (have_posts())
105
- {
106
- while (have_posts()) {
107
- the_post();
 
 
108
 
109
- if ((defined('NGG_SKIP_LOAD_SCRIPTS') && NGG_SKIP_LOAD_SCRIPTS) || $this->is_rest_request() || empty($post->post_content))
110
- continue;
 
111
 
112
- $manager = C_NextGen_Shortcode_Manager::get_instance();
113
- $ngg_shortcodes = $manager->get_shortcodes();
114
- $shortcode_keys = array_keys($ngg_shortcodes);
 
 
 
 
 
 
 
 
115
 
116
- preg_match_all('/' . get_shortcode_regex($shortcode_keys) . '/', $post->post_content, $matches, PREG_SET_ORDER);
 
117
 
118
- foreach ($matches as $shortcode) {
119
- // Only process our 'ngg' shortcodes
120
- $this_shortcode_name = $shortcode[2];
121
- if (!in_array($this_shortcode_name, $shortcode_keys))
122
- continue;
123
 
124
- $params = shortcode_parse_atts(trim($shortcode[0], '[]'));
125
- if (in_array($params[0], $shortcode_keys)) // Don't pass 0 => 'ngg' as a parameter, it's just part of the shortcode itself
126
- unset($params[0]);
127
 
128
- // And do the enqueueing process
129
- $renderer = C_Displayed_Gallery_Renderer::get_instance();
130
 
131
- // This is necessary for legacy shortcode compatibility
132
- if (is_callable($ngg_shortcodes[$this_shortcode_name]['transformer']))
133
- $params = call_user_func($ngg_shortcodes[$this_shortcode_name]['transformer'], $params);
134
 
135
- $displayed_gallery = $renderer->params_to_displayed_gallery($params);
136
 
137
- if (did_action('wp_enqueue_scripts') == 1
138
- && !C_Photocrati_Resource_Manager::addons_version_check()
139
- && in_array($displayed_gallery->display_type, ['photocrati-nextgen_pro_horizontal_filmstrip', 'photocrati-nextgen_pro_slideshow']))
140
- continue;
141
 
142
- $controller = C_Display_Type_Controller::get_instance($displayed_gallery->display_type);
143
 
144
- if (!$displayed_gallery || empty($params))
145
- continue;
146
 
147
- self::enqueue_frontend_resources_for_displayed_gallery($displayed_gallery, $controller);
148
- }
149
- }
150
  }
151
  }
152
 
99
 
100
  function enqueue_frontend_resources()
101
  {
102
+ if ((defined('NGG_SKIP_LOAD_SCRIPTS') && NGG_SKIP_LOAD_SCRIPTS) || $this->is_rest_request())
103
+ return;
104
 
105
+ // Find our content and process it
106
+ global $wp_query;
107
+ $posts = $wp_query->posts;
108
+ foreach ($posts as $post) {
109
+ if (empty($post->post_content))
110
+ continue;
111
 
112
+ self::enqueue_frontent_resources_for_content($post->post_content);
113
+ }
114
+ }
115
 
116
+ /**
117
+ * Most content will come from the WP query / global $posts but it's also sometimes necessary to enqueue resources
118
+ * based on the results of an output filter
119
+ * @param string $content
120
+ */
121
+ public static function enqueue_frontent_resources_for_content($content = '')
122
+ {
123
+ $manager = C_NextGen_Shortcode_Manager::get_instance();
124
+ $pattern = $manager->get_shortcode_regex();
125
+ $ngg_shortcodes = $manager->get_shortcodes();
126
+ $ngg_shortcodes_keys = array_keys($ngg_shortcodes);
127
 
128
+ // Determine which shortcodes to look for; 'ngg' is the default but there are legacy aliases
129
+ preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
130
 
131
+ foreach ($matches as $shortcode) {
132
+ $this_shortcode_name = $shortcode[2];
133
+ if (!in_array($this_shortcode_name, $ngg_shortcodes_keys))
134
+ continue;
 
135
 
136
+ $params = shortcode_parse_atts(trim($shortcode[0], '[]'));
137
+ if (in_array($params[0], $ngg_shortcodes_keys)) // Don't pass 0 => 'ngg' as a parameter, it's just part of the shortcode itself
138
+ unset($params[0]);
139
 
140
+ // And do the enqueueing process
141
+ $renderer = C_Displayed_Gallery_Renderer::get_instance();
142
 
143
+ // This is necessary for legacy shortcode compatibility
144
+ if (is_callable($ngg_shortcodes[$this_shortcode_name]['transformer']))
145
+ $params = call_user_func($ngg_shortcodes[$this_shortcode_name]['transformer'], $params);
146
 
147
+ $displayed_gallery = $renderer->params_to_displayed_gallery($params);
148
 
149
+ if (did_action('wp_enqueue_scripts') == 1
150
+ && !C_Photocrati_Resource_Manager::addons_version_check()
151
+ && in_array($displayed_gallery->display_type, ['photocrati-nextgen_pro_horizontal_filmstrip', 'photocrati-nextgen_pro_slideshow']))
152
+ continue;
153
 
154
+ $controller = C_Display_Type_Controller::get_instance($displayed_gallery->display_type);
155
 
156
+ if (!$displayed_gallery || empty($params))
157
+ continue;
158
 
159
+ self::enqueue_frontend_resources_for_displayed_gallery($displayed_gallery, $controller);
 
 
160
  }
161
  }
162
 
products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php CHANGED
@@ -105,10 +105,16 @@ class M_Third_Party_Compat extends C_Base_Module
105
  add_filter('wpseo_sitemap_urlimages', array($this, 'add_wpseo_xml_sitemap_images'), 10, 2);
106
  add_filter('ngg_pre_delete_unused_term_id', array($this, 'dont_auto_purge_wpml_terms'));
107
 
108
- if ($this->is_ngg_page()) add_action('admin_enqueue_scripts', array(&$this, 'dequeue_spider_calendar_resources'));
 
 
 
 
 
109
 
110
  // WPML fix
111
- if (class_exists('SitePress')) {
 
112
  M_WordPress_Routing::$_use_canonical_redirect = FALSE;
113
  M_WordPress_Routing::$_use_old_slugs = FALSE;
114
  add_action('template_redirect', array(&$this, 'fix_wpml_canonical_redirect'), 1);
@@ -118,6 +124,65 @@ class M_Third_Party_Compat extends C_Base_Module
118
  add_action('the_post', array(&$this, 'add_ngg_pro_page_parameter'));
119
  }
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  public function divi()
122
  {
123
  // Divi / Divi Booster loads its own Iris JS under the 'iris' ID, but because NextGen has already
105
  add_filter('wpseo_sitemap_urlimages', array($this, 'add_wpseo_xml_sitemap_images'), 10, 2);
106
  add_filter('ngg_pre_delete_unused_term_id', array($this, 'dont_auto_purge_wpml_terms'));
107
 
108
+ // Nimble Builder needs special consideration because of our shortcode manager's use of placeholders
109
+ add_action('wp_enqueue_scripts', [$this, 'enqueue_nimble_builder_frontend_resources']);
110
+ add_filter('ngg_shortcode_placeholder', [$this, 'nimble_builder_shortcodes'], 10, 4);
111
+
112
+ if ($this->is_ngg_page())
113
+ add_action('admin_enqueue_scripts', array(&$this, 'dequeue_spider_calendar_resources'));
114
 
115
  // WPML fix
116
+ if (class_exists('SitePress'))
117
+ {
118
  M_WordPress_Routing::$_use_canonical_redirect = FALSE;
119
  M_WordPress_Routing::$_use_old_slugs = FALSE;
120
  add_action('template_redirect', array(&$this, 'fix_wpml_canonical_redirect'), 1);
124
  add_action('the_post', array(&$this, 'add_ngg_pro_page_parameter'));
125
  }
126
 
127
+ /**
128
+ * @param string $placeholder
129
+ * @param string $shortcode
130
+ * @param array $params
131
+ * @param string $inner_content
132
+ * @return string
133
+ */
134
+ public function nimble_builder_shortcodes($placeholder, $shortcode, $params, $inner_content)
135
+ {
136
+ if (!defined( 'NIMBLE_PLUGIN_FILE'))
137
+ return $placeholder;
138
+
139
+ // Invoke our gallery rendering now
140
+ if (doing_filter('the_nimble_tinymce_module_content'))
141
+ $placeholder = C_NextGen_Shortcode_Manager::get_instance()->render_shortcode($shortcode, $params, $inner_content);
142
+
143
+ return $placeholder;
144
+ }
145
+
146
+ public function nimble_find_content($collection)
147
+ {
148
+ foreach ($collection as $item) {
149
+ if (isset($item['value']) && !empty($item['value']['text_content']))
150
+ M_Gallery_Display::enqueue_frontent_resources_for_content($item['value']['text_content']);
151
+
152
+ if (!empty($item['collection']))
153
+ $this->nimble_find_content($item['collection']);
154
+ }
155
+ }
156
+
157
+ public function enqueue_nimble_builder_frontend_resources()
158
+ {
159
+ if (!defined( 'NIMBLE_PLUGIN_FILE'))
160
+ return;
161
+
162
+ if (!function_exists('\Nimble\skp_get_skope_id')
163
+ || !function_exists('\Nimble\sek_get_skoped_seks')
164
+ || !function_exists('\Nimble\sek_sniff_and_decode_richtext'))
165
+ return;
166
+
167
+ // Bail now if called before skope_id is set (before @hook 'wp')
168
+ $skope_id = \Nimble\skp_get_skope_id();
169
+ if (empty($skope_id) || '_skope_not_set_' === $skope_id)
170
+ return;
171
+
172
+ $global_sections = \Nimble\sek_get_skoped_seks(NIMBLE_GLOBAL_SKOPE_ID);
173
+ $local_sections = \Nimble\sek_get_skoped_seks($skope_id);
174
+ $raw_content = \Nimble\sek_sniff_and_decode_richtext([
175
+ 'local_sections' => $local_sections,
176
+ 'global_sections' => $global_sections
177
+ ]);
178
+ foreach ($raw_content['local_sections'] as $section) {
179
+ $this->nimble_find_content($section);
180
+ }
181
+ foreach ($raw_content['global_sections'] as $section) {
182
+ $this->nimble_find_content($section);
183
+ }
184
+ }
185
+
186
  public function divi()
187
  {
188
  // Divi / Divi Booster loads its own Iris JS under the 'iris' ID, but because NextGen has already
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
  Requires at least: 5.5.4
5
- Stable tag: 3.10
6
  Tested up to: 5.7.2
7
  License: GPLv3
8
  Requires PHP: 5.6
@@ -179,6 +179,10 @@ For more information, feel free to visit the official website for the NextGEN Ga
179
 
180
  == Changelog ==
181
 
 
 
 
 
182
  = V3.10 - 05.19.2021
183
  * NEW: Added option under Misc Options to disable the /ngg_tag/ page feature
184
  * Fixed: Misc performance improvements to NGG 3.9.0
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
  Requires at least: 5.5.4
5
+ Stable tag: 3.11
6
  Tested up to: 5.7.2
7
  License: GPLv3
8
  Requires PHP: 5.6
179
 
180
  == Changelog ==
181
 
182
+ = V3.11 - 05.26.2021
183
+ * Fixed: Now compatible with NimbleBuilder
184
+ * Fixed: Importing images from the Media Library was broken due to a z-index issue
185
+
186
  = V3.10 - 05.19.2021
187
  * NEW: Added option under Misc Options to disable the /ngg_tag/ page feature
188
  * Fixed: Misc performance improvements to NGG 3.9.0