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 | NextGEN Gallery – WordPress Gallery Plugin |
Version | 3.11 |
Comparing to | |
See all releases |
Code changes from version 3.10 to 3.11
- changelog.txt +4 -0
- nggallery.php +2 -2
- non_pope/class.nextgen_shortcode_manager.php +22 -11
- products/photocrati_nextgen/modules/nextgen_block/static/editor.css +2 -2
- products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css +1 -1
- products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php +45 -35
- products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php +67 -2
- readme.txt +5 -1
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.
|
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.
|
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',
|
91 |
-
add_filter('the_content',
|
92 |
-
add_filter('widget_text',
|
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 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
|
|
|
|
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:
|
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:
|
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:
|
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 |
-
|
|
|
103 |
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
|
|
|
|
108 |
|
109 |
-
|
110 |
-
|
|
|
111 |
|
112 |
-
|
113 |
-
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
|
116 |
-
|
|
|
117 |
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
continue;
|
123 |
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
|
128 |
-
|
129 |
-
|
130 |
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
|
135 |
-
|
136 |
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
|
142 |
-
|
143 |
|
144 |
-
|
145 |
-
|
146 |
|
147 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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.
|
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
|