Version Description
- 02.17.2020 =
- Fixed: Added ellipsis to pagination to show pages skipped (1099) (1157)
- Fixed: Deleted images could still appear in 'random' image galleries (1129)
- Fixed: Galleries with only one page were causing pagination links to appear (1156)
- Fixed: Inability to change gallerypath on multisite networks (1150)
- Fixed: Overriding static resources (CSS & JS) through files in wp-content/ngg/ was not working (1144)
Download this release
Release Info
Developer | photocrati |
Plugin | NextGEN Gallery – WordPress Gallery Plugin |
Version | 3.7.0 |
Comparing to | |
See all releases |
Code changes from version 3.6.0 to 3.7.0
- changelog.txt +7 -0
- nggallery.php +2 -2
- non_pope/class.photocrati_installer.php +6 -6
- products/photocrati_nextgen/modules/ajax/package.module.ajax.php +1 -1
- products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php +1 -1
- products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php +5 -5
- products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php +10 -2
- products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php +1 -1
- products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php +65 -37
- products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php +11 -2
- products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php +39 -69
- products/photocrati_nextgen/modules/static_assets/module.static_assets.php +9 -4
- products/photocrati_nextgen/modules/widget/module.widget.php +4 -0
- readme.txt +17 -11
changelog.txt
CHANGED
@@ -1,6 +1,13 @@
|
|
1 |
NextGEN Gallery
|
2 |
by Imagely
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
= V3.6.0 - 02.10.2020 =
|
5 |
* NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
|
6 |
* NEW: Allow maximum_entity_limit display setting regardless of source (1146)
|
1 |
NextGEN Gallery
|
2 |
by Imagely
|
3 |
|
4 |
+
= V3.7.0 - 02.17.2020 =
|
5 |
+
* Fixed: Added ellipsis to pagination to show pages skipped (1099) (1157)
|
6 |
+
* Fixed: Deleted images could still appear in 'random' image galleries (1129)
|
7 |
+
* Fixed: Galleries with only one page were causing pagination links to appear (1156)
|
8 |
+
* Fixed: Inability to change gallerypath on multisite networks (1150)
|
9 |
+
* Fixed: Overriding static resources (CSS & JS) through files in wp-content/ngg/ was not working (1144)
|
10 |
+
|
11 |
= V3.6.0 - 02.10.2020 =
|
12 |
* NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
|
13 |
* NEW: Allow maximum_entity_limit display setting regardless of source (1146)
|
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
|
@@ -726,7 +726,7 @@ class C_NextGEN_Bootstrap
|
|
726 |
define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
|
727 |
define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
|
728 |
define('NGG_PLUGIN_STARTED_AT', microtime());
|
729 |
-
define('NGG_PLUGIN_VERSION', '3.
|
730 |
|
731 |
define(
|
732 |
'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.7.0
|
8 |
* Author: Imagely
|
9 |
* Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
|
10 |
* Author URI: https://www.imagely.com
|
726 |
define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
|
727 |
define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
|
728 |
define('NGG_PLUGIN_STARTED_AT', microtime());
|
729 |
+
define('NGG_PLUGIN_VERSION', '3.7.0');
|
730 |
|
731 |
define(
|
732 |
'NGG_SCRIPT_VERSION',
|
non_pope/class.photocrati_installer.php
CHANGED
@@ -128,16 +128,16 @@ if (!class_exists('C_Photocrati_Installer'))
|
|
128 |
// Somehow some installations are missing several default settings
|
129 |
// Because imgWidth is essential to know we do a 'soft' reset here
|
130 |
// by filling in any missing options from the default settings
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
if (!$local_settings->imgWidth) {
|
132 |
-
$settings_installer = new C_NextGen_Settings_Installer();
|
133 |
-
|
134 |
$local_settings->reset();
|
135 |
$settings_installer->install_local_settings();
|
136 |
$local_settings->save();
|
137 |
-
|
138 |
-
$global_settings->reset();
|
139 |
-
$settings_installer->install_global_settings();
|
140 |
-
$global_settings->save();
|
141 |
}
|
142 |
|
143 |
// This is a specific hack/work-around/fix and can probably be removed sometime after 2.0.20's release
|
128 |
// Somehow some installations are missing several default settings
|
129 |
// Because imgWidth is essential to know we do a 'soft' reset here
|
130 |
// by filling in any missing options from the default settings
|
131 |
+
$settings_installer = new C_NextGen_Settings_Installer();
|
132 |
+
if (!$global_settings->gallerypath) {
|
133 |
+
$global_settings->reset();
|
134 |
+
$settings_installer->install_global_settings();
|
135 |
+
$global_settings->save();
|
136 |
+
}
|
137 |
if (!$local_settings->imgWidth) {
|
|
|
|
|
138 |
$local_settings->reset();
|
139 |
$settings_installer->install_local_settings();
|
140 |
$local_settings->save();
|
|
|
|
|
|
|
|
|
141 |
}
|
142 |
|
143 |
// This is a specific hack/work-around/fix and can probably be removed sometime after 2.0.20's release
|
products/photocrati_nextgen/modules/ajax/package.module.ajax.php
CHANGED
@@ -44,7 +44,7 @@ class C_Ajax_Controller extends C_MVC_Controller
|
|
44 |
ob_end_clean();
|
45 |
}
|
46 |
// Return the JSON to the browser
|
47 |
-
|
48 |
}
|
49 |
/**
|
50 |
* Returns an instance of this class
|
44 |
ob_end_clean();
|
45 |
}
|
46 |
// Return the JSON to the browser
|
47 |
+
wp_send_json($retval);
|
48 |
}
|
49 |
/**
|
50 |
* Returns an instance of this class
|
products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php
CHANGED
@@ -26,7 +26,7 @@ class M_NextGen_Admin extends C_Base_Module
|
|
26 |
'photocrati-nextgen_admin',
|
27 |
'NextGEN Administration',
|
28 |
'Provides a framework for adding Administration pages',
|
29 |
-
'3.
|
30 |
'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
|
31 |
'Imagely',
|
32 |
'https://www.imagely.com'
|
26 |
'photocrati-nextgen_admin',
|
27 |
'NextGEN Administration',
|
28 |
'Provides a framework for adding Administration pages',
|
29 |
+
'3.7.0',
|
30 |
'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
|
31 |
'Imagely',
|
32 |
'https://www.imagely.com'
|
products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php
CHANGED
@@ -1114,12 +1114,12 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin
|
|
1114 |
*/
|
1115 |
function get_forms()
|
1116 |
{
|
1117 |
-
$forms = array();
|
1118 |
$form_manager = C_Form_Manager::get_instance();
|
1119 |
-
|
1120 |
-
$
|
1121 |
-
|
1122 |
-
|
|
|
1123 |
}
|
1124 |
/**
|
1125 |
* Gets the action to be executed
|
1114 |
*/
|
1115 |
function get_forms()
|
1116 |
{
|
|
|
1117 |
$form_manager = C_Form_Manager::get_instance();
|
1118 |
+
return array_map(function ($form) {
|
1119 |
+
$form = $this->object->get_registry()->get_utility('I_Form', $form);
|
1120 |
+
$form->page = $this;
|
1121 |
+
return $form;
|
1122 |
+
}, $form_manager->get_forms($this->object->get_form_type()));
|
1123 |
}
|
1124 |
/**
|
1125 |
* Gets the action to be executed
|
products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php
CHANGED
@@ -1700,6 +1700,15 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
|
|
1700 |
$displayed_gallery = NULL;
|
1701 |
// Get the NextGEN settings to provide some defaults
|
1702 |
$settings = C_NextGen_Settings::get_instance();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1703 |
// Configure the arguments
|
1704 |
$defaults = array('id' => NULL, 'ids' => NULL, 'source' => '', 'src' => '', 'container_ids' => array(), 'gallery_ids' => array(), 'album_ids' => array(), 'tag_ids' => array(), 'display_type' => '', 'display' => '', 'exclusions' => array(), 'order_by' => $settings->galSort, 'order_direction' => $settings->galSortOrder, 'image_ids' => array(), 'entity_ids' => array(), 'tagcloud' => FALSE, 'returns' => 'included', 'slug' => NULL, 'sortorder' => array());
|
1705 |
$args = shortcode_atts($defaults, $params, 'ngg');
|
@@ -1710,7 +1719,6 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
|
|
1710 |
unset($mapper);
|
1711 |
// no longer needed
|
1712 |
} else {
|
1713 |
-
// Perform some conversions...
|
1714 |
// Galleries?
|
1715 |
if ($args['gallery_ids']) {
|
1716 |
if ($args['source'] != 'albums' and $args['source'] != 'album') {
|
@@ -1933,7 +1941,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin
|
|
1933 |
$lookup = FALSE;
|
1934 |
}
|
1935 |
// Enqueue any necessary static resources
|
1936 |
-
if ((!defined('NGG_SKIP_LOAD_SCRIPTS') || !NGG_SKIP_LOAD_SCRIPTS) && !$this->is_rest_request()) {
|
1937 |
$controller->enqueue_frontend_resources($displayed_gallery);
|
1938 |
}
|
1939 |
// Try cache lookup, if we're to do so
|
1700 |
$displayed_gallery = NULL;
|
1701 |
// Get the NextGEN settings to provide some defaults
|
1702 |
$settings = C_NextGen_Settings::get_instance();
|
1703 |
+
// Perform some conversions...
|
1704 |
+
if (isset($params['galleries'])) {
|
1705 |
+
$params['gallery_ids'] = $params['galleries'];
|
1706 |
+
unset($params['galleries']);
|
1707 |
+
}
|
1708 |
+
if (isset($params['albums'])) {
|
1709 |
+
$params['album_ids'] = $params['albums'];
|
1710 |
+
unset($params['albums']);
|
1711 |
+
}
|
1712 |
// Configure the arguments
|
1713 |
$defaults = array('id' => NULL, 'ids' => NULL, 'source' => '', 'src' => '', 'container_ids' => array(), 'gallery_ids' => array(), 'album_ids' => array(), 'tag_ids' => array(), 'display_type' => '', 'display' => '', 'exclusions' => array(), 'order_by' => $settings->galSort, 'order_direction' => $settings->galSortOrder, 'image_ids' => array(), 'entity_ids' => array(), 'tagcloud' => FALSE, 'returns' => 'included', 'slug' => NULL, 'sortorder' => array());
|
1714 |
$args = shortcode_atts($defaults, $params, 'ngg');
|
1719 |
unset($mapper);
|
1720 |
// no longer needed
|
1721 |
} else {
|
|
|
1722 |
// Galleries?
|
1723 |
if ($args['gallery_ids']) {
|
1724 |
if ($args['source'] != 'albums' and $args['source'] != 'album') {
|
1941 |
$lookup = FALSE;
|
1942 |
}
|
1943 |
// Enqueue any necessary static resources
|
1944 |
+
if ((!defined('NGG_SKIP_LOAD_SCRIPTS') || !constant('NGG_SKIP_LOAD_SCRIPTS')) && !$this->is_rest_request()) {
|
1945 |
$controller->enqueue_frontend_resources($displayed_gallery);
|
1946 |
}
|
1947 |
// Try cache lookup, if we're to do so
|
products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php
CHANGED
@@ -19,7 +19,7 @@ class M_NextGen_Pagination extends C_Base_Module
|
|
19 |
'photocrati-nextgen_pagination',
|
20 |
"Pagination",
|
21 |
"Provides pagination for display types",
|
22 |
-
'3.
|
23 |
"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",
|
24 |
"Imagely",
|
25 |
"https://www.imagely.com"
|
19 |
'photocrati-nextgen_pagination',
|
20 |
"Pagination",
|
21 |
"Provides pagination for display types",
|
22 |
+
'3.7.0',
|
23 |
"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",
|
24 |
"Imagely",
|
25 |
"https://www.imagely.com"
|
products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php
CHANGED
@@ -41,50 +41,78 @@ class Mixin_NextGen_Basic_Pagination extends Mixin
|
|
41 |
$pages = [];
|
42 |
for ($i = 1; $i <= $number_of_pages; $i++) {
|
43 |
if ($selected_page === $i) {
|
44 |
-
$pages[] = "<span class='current'>{$i}</span>";
|
45 |
} else {
|
46 |
-
$
|
47 |
-
|
48 |
-
// However, if the number of pages is created than 4
|
49 |
-
// then an ellipsis will sometimes appear after the first page
|
50 |
-
// or before the last page, depending on what the current page is
|
51 |
-
if ($number_of_pages > 4) {
|
52 |
-
if ($i == 1 || $i == $number_of_pages || $i == $selected_page - 1 || $i == $selected_page + 1) {
|
53 |
-
$add = TRUE;
|
54 |
-
} else {
|
55 |
-
$add = FALSE;
|
56 |
-
if ($ending_ellipsis < 0 && $i > $selected_page) {
|
57 |
-
$pages[] = "<span class='ellipsis'>...</span>";
|
58 |
-
$ending_ellipsis = $i;
|
59 |
-
} else {
|
60 |
-
if ($starting_ellipsis < 0 && $i < $selected_page) {
|
61 |
-
$pages[] = "<span class='ellipsis'>...</span>";
|
62 |
-
$starting_ellipsis = $i;
|
63 |
-
}
|
64 |
-
}
|
65 |
-
}
|
66 |
-
}
|
67 |
-
if ($add) {
|
68 |
-
$link = esc_attr($this->object->set_param_for($current_url, 'nggpage', $i));
|
69 |
-
$pages[] = "<a class='page-numbers' data-pageid='{$i}' href='{$link}'>{$i}</a>";
|
70 |
-
}
|
71 |
}
|
72 |
}
|
73 |
-
|
74 |
-
if ($
|
75 |
-
$
|
76 |
-
$link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $next_page);
|
77 |
-
$pages[] = "<a class='prev' data-pageid={$next_page}>{$next_symbol}</a>";
|
78 |
}
|
79 |
-
|
80 |
-
if ($
|
81 |
-
$
|
82 |
-
|
83 |
-
array_unshift($pages, "<a class='next' data-pageid={$prev_page}>{$prev_symbol}</a>");
|
84 |
}
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
$return['output'] = "<div class='ngg-navigation'>" . implode("\n", $pages) . "</div>";
|
87 |
}
|
88 |
return $return;
|
89 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
}
|
41 |
$pages = [];
|
42 |
for ($i = 1; $i <= $number_of_pages; $i++) {
|
43 |
if ($selected_page === $i) {
|
44 |
+
$pages['current'] = "<span class='current'>{$i}</span>";
|
45 |
} else {
|
46 |
+
$link = esc_attr($this->object->set_param_for($current_url, 'nggpage', $i));
|
47 |
+
$pages[$i] = "<a class='page-numbers' data-pageid='{$i}' href='{$link}'>{$i}</a>";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
}
|
49 |
}
|
50 |
+
$after = $this->array_slice_from('current', $pages);
|
51 |
+
if (count($after) > 3) {
|
52 |
+
$after = array_merge($this->array_take_from_start(2, $after), ["<span class='ellipsis'>...</span>"], $this->array_take_from_end(1, $after));
|
|
|
|
|
53 |
}
|
54 |
+
$before = $this->array_slice_to('current', $pages);
|
55 |
+
if (count($before) > 3) {
|
56 |
+
$before = array_merge($this->array_take_from_start(1, $before), ["<span class='ellipsis'>...</span>"], $this->array_take_from_end(2, $before));
|
57 |
+
array_pop($before);
|
|
|
58 |
}
|
59 |
+
$pages = array_merge($before, $after);
|
60 |
+
if ($pages && count($pages) > 1) {
|
61 |
+
// Next page
|
62 |
+
if ($selected_page + 1 <= $number_of_pages) {
|
63 |
+
$next_page = $selected_page + 1;
|
64 |
+
$link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $next_page);
|
65 |
+
$pages[] = "<a class='prev' href='{$link}' data-pageid={$next_page}>{$next_symbol}</a>";
|
66 |
+
}
|
67 |
+
// Prev page
|
68 |
+
if ($selected_page - 1 > 0) {
|
69 |
+
$prev_page = $selected_page - 1;
|
70 |
+
$link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $prev_page);
|
71 |
+
array_unshift($pages, "<a class='next' href='{$link}' data-pageid={$prev_page}>{$prev_symbol}</a>");
|
72 |
+
}
|
73 |
$return['output'] = "<div class='ngg-navigation'>" . implode("\n", $pages) . "</div>";
|
74 |
}
|
75 |
return $return;
|
76 |
}
|
77 |
+
function array_slice_from($find_key, $arr)
|
78 |
+
{
|
79 |
+
$retval = [];
|
80 |
+
reset($arr);
|
81 |
+
foreach ($arr as $key => $value) {
|
82 |
+
if ($key == $find_key || $retval) {
|
83 |
+
$retval[$key] = $value;
|
84 |
+
}
|
85 |
+
}
|
86 |
+
reset($arr);
|
87 |
+
return $retval;
|
88 |
+
}
|
89 |
+
function array_slice_to($find_key, $arr)
|
90 |
+
{
|
91 |
+
$retval = [];
|
92 |
+
reset($arr);
|
93 |
+
foreach ($arr as $key => $value) {
|
94 |
+
$retval[$key] = $value;
|
95 |
+
if ($key == $find_key) {
|
96 |
+
break;
|
97 |
+
}
|
98 |
+
}
|
99 |
+
reset($arr);
|
100 |
+
return $retval;
|
101 |
+
}
|
102 |
+
function array_take_from_start($number, $arr)
|
103 |
+
{
|
104 |
+
$retval = [];
|
105 |
+
foreach ($arr as $key => $value) {
|
106 |
+
if (count($retval) < $number) {
|
107 |
+
$retval[$key] = $value;
|
108 |
+
} else {
|
109 |
+
break;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
return $retval;
|
113 |
+
}
|
114 |
+
function array_take_from_end($number, $arr)
|
115 |
+
{
|
116 |
+
return array_reverse($this->array_take_from_start($number, array_reverse($arr)));
|
117 |
+
}
|
118 |
}
|
products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php
CHANGED
@@ -18,7 +18,7 @@ class M_NextGen_Settings extends C_Base_Module
|
|
18 |
'photocrati-nextgen_settings',
|
19 |
'NextGEN Gallery Settings',
|
20 |
'Provides central management for NextGEN Gallery settings',
|
21 |
-
'3.3.
|
22 |
'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
|
23 |
'Imagely',
|
24 |
'https://www.imagely.com'
|
@@ -141,6 +141,14 @@ class C_NextGen_Settings_Installer
|
|
141 |
// Duration of caching of 'random' widgets image IDs
|
142 |
'random_widget_cache_ttl' => 30
|
143 |
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
}
|
145 |
|
146 |
function install_global_settings($reset=FALSE)
|
@@ -172,7 +180,7 @@ class C_NextGen_Settings_Installer
|
|
172 |
|
173 |
// a gallerypath setting has already been set, so we explicitly set a default AND set a new value
|
174 |
$this->blog_settings->set_default_value('gallerypath', $gallerypath);
|
175 |
-
$this->blog_settings->set('gallerypath', $gallerypath);
|
176 |
}
|
177 |
}
|
178 |
|
@@ -196,6 +204,7 @@ class C_NextGen_Settings_Installer
|
|
196 |
{
|
197 |
$gallerypath = str_replace('%BLOG_NAME%', get_bloginfo('name'), $gallerypath);
|
198 |
$gallerypath = str_replace('%BLOG_ID%', get_current_blog_id(), $gallerypath);
|
|
|
199 |
return $gallerypath;
|
200 |
}
|
201 |
}
|
18 |
'photocrati-nextgen_settings',
|
19 |
'NextGEN Gallery Settings',
|
20 |
'Provides central management for NextGEN Gallery settings',
|
21 |
+
'3.3.7',
|
22 |
'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
|
23 |
'Imagely',
|
24 |
'https://www.imagely.com'
|
141 |
// Duration of caching of 'random' widgets image IDs
|
142 |
'random_widget_cache_ttl' => 30
|
143 |
]);
|
144 |
+
|
145 |
+
if (is_multisite()) {
|
146 |
+
if ($options = get_site_option('ngg_options'))
|
147 |
+
$gallerypath = $options['gallerypath'];
|
148 |
+
else
|
149 |
+
$gallerypath = $this->_global_settings['gallerypath'];
|
150 |
+
$this->_local_settings['gallerypath'] = $this->gallerypath_replace($gallerypath);
|
151 |
+
}
|
152 |
}
|
153 |
|
154 |
function install_global_settings($reset=FALSE)
|
180 |
|
181 |
// a gallerypath setting has already been set, so we explicitly set a default AND set a new value
|
182 |
$this->blog_settings->set_default_value('gallerypath', $gallerypath);
|
183 |
+
if ($reset) $this->blog_settings->set('gallerypath', $gallerypath);
|
184 |
}
|
185 |
}
|
186 |
|
204 |
{
|
205 |
$gallerypath = str_replace('%BLOG_NAME%', get_bloginfo('name'), $gallerypath);
|
206 |
$gallerypath = str_replace('%BLOG_ID%', get_current_blog_id(), $gallerypath);
|
207 |
+
$gallerypath = str_replace('%SITE_ID%', get_current_blog_id(), $gallerypath);
|
208 |
return $gallerypath;
|
209 |
}
|
210 |
}
|
products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php
CHANGED
@@ -7,48 +7,46 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
|
|
7 |
if ( !is_super_admin() )
|
8 |
die('You are not allowed to call this page.');
|
9 |
|
10 |
-
|
|
|
11 |
|
12 |
-
|
13 |
-
$ngg_options = get_site_option('ngg_options');
|
14 |
|
15 |
if ( isset($_POST['updateoption']) ) {
|
16 |
check_admin_referer('ngg_wpmu_settings');
|
17 |
-
// get the hidden option fields, taken from WP core
|
18 |
-
if ( $_POST['page_options'] )
|
19 |
-
$options = explode(',', stripslashes($_POST['page_options']));
|
20 |
-
if ($options) {
|
21 |
-
foreach ($options as $option) {
|
22 |
-
$option = trim($option);
|
23 |
-
$value = isset($_POST[$option]) ? trim($_POST[$option]) : false;
|
24 |
-
// $value = sanitize_option($option, $value); // This does strip slashes on those that need it
|
25 |
-
$ngg_options[$option] = $value;
|
26 |
-
}
|
27 |
-
}
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
$storage = C_Gallery_Storage::get_instance();
|
38 |
-
$ngg_options['gallerypath'] = implode(DIRECTORY_SEPARATOR, array('wp-content', 'uploads', 'sites', '%BLOG_ID%', 'nggallery')).DIRECTORY_SEPARATOR;
|
39 |
-
unset($storage);
|
40 |
-
}
|
41 |
-
else {
|
42 |
-
$messagetext = __('Updated successfully','nggallery');
|
43 |
-
}
|
44 |
-
update_site_option('ngg_options', $ngg_options);
|
45 |
-
}
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
|
53 |
// message windows
|
54 |
if( !empty($messagetext) ) { echo '<!-- Last Action --><div id="message" class="updated fade"><p>'.$messagetext.'</p></div>'; }
|
@@ -59,66 +57,38 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
|
|
59 |
<h2><?php _e('Network Options','nggallery'); ?></h2>
|
60 |
<form name="generaloptions" method="post">
|
61 |
<?php wp_nonce_field('ngg_wpmu_settings') ?>
|
62 |
-
<input type="hidden" name="page_options" value="gallerypath,wpmuQuotaCheck,wpmuZipUpload,wpmuImportFolder,wpmuStyle,wpmuRoles,wpmuCSSfile" />
|
63 |
<table class="form-table">
|
64 |
<tr valign="top">
|
65 |
<th align="left"><?php _e('Gallery path','nggallery') ?></th>
|
66 |
-
<td><input type="text" size="50" name="gallerypath" value="<?php echo $ngg_options
|
67 |
<?php _e('This is the default path for all blogs. With the placeholder %BLOG_ID% you can organize the folder structure better.','nggallery') ?>
|
68 |
<?php echo str_replace('%s', '<code>wp-content/uploads/sites/%BLOG_ID%/nggallery/</code>', __('The default setting should be %s', 'nggallery')); ?>
|
69 |
</td>
|
70 |
</tr>
|
71 |
<tr>
|
72 |
<th valign="top"><?php _e('Enable upload quota check','nggallery') ?>:</th>
|
73 |
-
<td><input name="wpmuQuotaCheck" type="checkbox" value="1" <?php checked('1', $ngg_options
|
74 |
<?php _e('Should work if the gallery is bellow the blog.dir','nggallery') ?>
|
75 |
</td>
|
76 |
</tr>
|
77 |
<tr>
|
78 |
<th valign="top"><?php _e('Enable zip upload option','nggallery') ?>:</th>
|
79 |
-
<td><input name="wpmuZipUpload" type="checkbox" value="1" <?php checked('1', $ngg_options
|
80 |
<?php _e('Allow users to upload zip folders.','nggallery') ?>
|
81 |
</td>
|
82 |
</tr>
|
83 |
<tr>
|
84 |
<th valign="top"><?php _e('Enable import function','nggallery') ?>:</th>
|
85 |
-
<td><input name="wpmuImportFolder" type="checkbox" value="1" <?php checked('1', $ngg_options
|
86 |
<?php _e('Allow users to import images folders from the server.','nggallery') ?>
|
87 |
</td>
|
88 |
</tr>
|
89 |
-
<tr>
|
90 |
-
<th valign="top"><?php _e('Enable style selection','nggallery') ?>:</th>
|
91 |
-
<td><input name="wpmuStyle" type="checkbox" value="1" <?php checked('1', $ngg_options['wpmuStyle']); ?> />
|
92 |
-
<?php _e('Allow users to choose a style for the gallery.','nggallery') ?>
|
93 |
-
</td>
|
94 |
-
</tr>
|
95 |
<tr>
|
96 |
<th valign="top"><?php _e('Enable roles/capabilities','nggallery') ?>:</th>
|
97 |
-
<td><input name="wpmuRoles" type="checkbox" value="1" <?php checked('1', $ngg_options
|
98 |
<?php _e('Allow users to change the roles for other blog authors.','nggallery') ?>
|
99 |
</td>
|
100 |
</tr>
|
101 |
-
<tr>
|
102 |
-
<th valign="top"><?php _e('Default style','nggallery') ?>:</th>
|
103 |
-
<td>
|
104 |
-
<select name="wpmuCSSfile">
|
105 |
-
<?php
|
106 |
-
// $csslist = ngg_get_cssfiles();
|
107 |
-
$csslist = C_NextGen_Style_Manager::get_instance()->find_all_stylesheets();
|
108 |
-
foreach ($csslist as $key => $a_cssfile) {
|
109 |
-
$css_name = $a_cssfile['name'];
|
110 |
-
if ($key == $ngg_options['wpmuCSSfile']) {
|
111 |
-
$selected = " selected='selected'";
|
112 |
-
}
|
113 |
-
else $selected = '';
|
114 |
-
$css_name = esc_attr($css_name);
|
115 |
-
echo "\n\t<option value=\"{$key}\" {$selected}>{$css_name}</option>";
|
116 |
-
}
|
117 |
-
?>
|
118 |
-
</select><br />
|
119 |
-
<?php _e('Choose the default style for the galleries.','nggallery') ?>
|
120 |
-
</td>
|
121 |
-
</tr>
|
122 |
</table>
|
123 |
<div class="submit"><input type="submit" name="updateoption" value="<?php _e('Update') ;?>"/></div>
|
124 |
</form>
|
7 |
if ( !is_super_admin() )
|
8 |
die('You are not allowed to call this page.');
|
9 |
|
10 |
+
// Get current settings
|
11 |
+
$ngg_options = C_NextGen_Global_Settings::get_instance();
|
12 |
|
13 |
+
$messagetext = [];
|
|
|
14 |
|
15 |
if ( isset($_POST['updateoption']) ) {
|
16 |
check_admin_referer('ngg_wpmu_settings');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
+
// Set all options other than the gallerypath
|
19 |
+
$valid_options = [
|
20 |
+
'wpmuRoles', 'wpmuQuotaCheck', 'wpmuZipUpload', 'wpmuImportFolder', 'wpmuRoles'
|
21 |
+
];
|
22 |
+
foreach ($valid_options as $option_name) {
|
23 |
+
$option_value = isset($_POST[$option_name]) ? intval($_POST[$option_name]) : 0;
|
24 |
+
$ngg_options->set($option_name, $option_value);
|
25 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
27 |
+
if (isset($_POST['gallerypath'])) {
|
28 |
+
$new_gallerypath = trailingslashit($_POST['gallerypath']);
|
29 |
+
$fs = C_Fs::get_instance();
|
30 |
+
$root = $fs->get_document_root('galleries');
|
31 |
+
if ($root[0] != DIRECTORY_SEPARATOR) $root = DIRECTORY_SEPARATOR . $root;
|
32 |
+
$gallery_abspath = $fs->get_absolute_path($fs->join_paths($root, $new_gallerypath));
|
33 |
+
if ($gallery_abspath[0] != DIRECTORY_SEPARATOR) $gallery_abspath = DIRECTORY_SEPARATOR.$gallery_abspath;
|
34 |
+
if (strpos($gallery_abspath, $root) === FALSE) {
|
35 |
+
$messagetext[] = sprintf(__("Gallery path must be located in %s.", 'nggallery'), $root);
|
36 |
+
}
|
37 |
+
else if (preg_match('\.+[/\\]', $new_gallerypath)) {
|
38 |
+
$messagetext[] = __("Gallery path cannot include relative paths.", 'nggallery');
|
39 |
+
}
|
40 |
+
else {
|
41 |
+
$ngg_options->set('gallerypath', $new_gallerypath);
|
42 |
+
$ngg_options->save();
|
43 |
+
}
|
44 |
+
}
|
45 |
+
$ngg_options->save();
|
46 |
+
$messagetext[] = __('Updated successfully.','nggallery');
|
47 |
+
|
48 |
+
$messagetext = implode(" ", $messagetext);
|
49 |
+
}
|
50 |
|
51 |
// message windows
|
52 |
if( !empty($messagetext) ) { echo '<!-- Last Action --><div id="message" class="updated fade"><p>'.$messagetext.'</p></div>'; }
|
57 |
<h2><?php _e('Network Options','nggallery'); ?></h2>
|
58 |
<form name="generaloptions" method="post">
|
59 |
<?php wp_nonce_field('ngg_wpmu_settings') ?>
|
|
|
60 |
<table class="form-table">
|
61 |
<tr valign="top">
|
62 |
<th align="left"><?php _e('Gallery path','nggallery') ?></th>
|
63 |
+
<td><input type="text" size="50" name="gallerypath" value="<?php echo $ngg_options->get('gallerypath'); ?>" /><br />
|
64 |
<?php _e('This is the default path for all blogs. With the placeholder %BLOG_ID% you can organize the folder structure better.','nggallery') ?>
|
65 |
<?php echo str_replace('%s', '<code>wp-content/uploads/sites/%BLOG_ID%/nggallery/</code>', __('The default setting should be %s', 'nggallery')); ?>
|
66 |
</td>
|
67 |
</tr>
|
68 |
<tr>
|
69 |
<th valign="top"><?php _e('Enable upload quota check','nggallery') ?>:</th>
|
70 |
+
<td><input name="wpmuQuotaCheck" type="checkbox" value="1" <?php checked('1', $ngg_options->get('wpmuQuotaCheck')); ?> />
|
71 |
<?php _e('Should work if the gallery is bellow the blog.dir','nggallery') ?>
|
72 |
</td>
|
73 |
</tr>
|
74 |
<tr>
|
75 |
<th valign="top"><?php _e('Enable zip upload option','nggallery') ?>:</th>
|
76 |
+
<td><input name="wpmuZipUpload" type="checkbox" value="1" <?php checked('1', $ngg_options->get('wpmuZipUpload')); ?> />
|
77 |
<?php _e('Allow users to upload zip folders.','nggallery') ?>
|
78 |
</td>
|
79 |
</tr>
|
80 |
<tr>
|
81 |
<th valign="top"><?php _e('Enable import function','nggallery') ?>:</th>
|
82 |
+
<td><input name="wpmuImportFolder" type="checkbox" value="1" <?php checked('1', $ngg_options->get('wpmuImportFolder')); ?> />
|
83 |
<?php _e('Allow users to import images folders from the server.','nggallery') ?>
|
84 |
</td>
|
85 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
<tr>
|
87 |
<th valign="top"><?php _e('Enable roles/capabilities','nggallery') ?>:</th>
|
88 |
+
<td><input name="wpmuRoles" type="checkbox" value="1" <?php checked('1', $ngg_options->get('wpmuRoles')); ?> />
|
89 |
<?php _e('Allow users to change the roles for other blog authors.','nggallery') ?>
|
90 |
</td>
|
91 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
</table>
|
93 |
<div class="submit"><input type="submit" name="updateoption" value="<?php _e('Update') ;?>"/></div>
|
94 |
</form>
|
products/photocrati_nextgen/modules/static_assets/module.static_assets.php
CHANGED
@@ -24,9 +24,16 @@ class M_Static_Assets extends C_Base_Module
|
|
24 |
static function get_static_url($filename, $module=FALSE)
|
25 |
{
|
26 |
$retval = self::get_static_abspath($filename, $module);
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
$retval = str_replace(wp_normalize_path(WP_PLUGIN_DIR), WP_PLUGIN_URL, $retval);
|
|
|
28 |
$retval = is_ssl() ? str_replace('http:', 'https:', $retval) : $retval;
|
29 |
-
|
30 |
return $retval;
|
31 |
}
|
32 |
|
@@ -42,8 +49,6 @@ class M_Static_Assets extends C_Base_Module
|
|
42 |
|
43 |
static function get_computed_static_abspath($filename, $module=FALSE)
|
44 |
{
|
45 |
-
$retval = '';
|
46 |
-
|
47 |
if (strpos($filename, '#') !== FALSE) {
|
48 |
$parts = explode("#", $filename);
|
49 |
if (count($parts) === 2) {
|
@@ -73,7 +78,7 @@ class M_Static_Assets extends C_Base_Module
|
|
73 |
$static_dir = self::trim_preceding_slash(C_NextGen_Settings::get_instance()->mvc_static_dir);
|
74 |
|
75 |
$override_dir = wp_normalize_path(self::get_static_override_dir($module));
|
76 |
-
$override = path_join(
|
77 |
$override_dir,
|
78 |
$filename
|
79 |
);
|
24 |
static function get_static_url($filename, $module=FALSE)
|
25 |
{
|
26 |
$retval = self::get_static_abspath($filename, $module);
|
27 |
+
|
28 |
+
// Allow for overrides from WP_CONTENT/ngg/
|
29 |
+
if (strpos($retval, path_join(WP_CONTENT_DIR, 'ngg')) !== FALSE)
|
30 |
+
$retval = str_replace(wp_normalize_path(WP_CONTENT_DIR), WP_CONTENT_URL, $retval);
|
31 |
+
|
32 |
+
// Normal plugin distributed files
|
33 |
$retval = str_replace(wp_normalize_path(WP_PLUGIN_DIR), WP_PLUGIN_URL, $retval);
|
34 |
+
|
35 |
$retval = is_ssl() ? str_replace('http:', 'https:', $retval) : $retval;
|
36 |
+
|
37 |
return $retval;
|
38 |
}
|
39 |
|
49 |
|
50 |
static function get_computed_static_abspath($filename, $module=FALSE)
|
51 |
{
|
|
|
|
|
52 |
if (strpos($filename, '#') !== FALSE) {
|
53 |
$parts = explode("#", $filename);
|
54 |
if (count($parts) === 2) {
|
78 |
$static_dir = self::trim_preceding_slash(C_NextGen_Settings::get_instance()->mvc_static_dir);
|
79 |
|
80 |
$override_dir = wp_normalize_path(self::get_static_override_dir($module));
|
81 |
+
$retval = $override = path_join(
|
82 |
$override_dir,
|
83 |
$filename
|
84 |
);
|
products/photocrati_nextgen/modules/widget/module.widget.php
CHANGED
@@ -38,6 +38,10 @@ class M_Widget extends C_Base_Module
|
|
38 |
function _register_hooks()
|
39 |
{
|
40 |
add_action('widgets_init', array($this, 'register_widgets'));
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
function register_widgets()
|
38 |
function _register_hooks()
|
39 |
{
|
40 |
add_action('widgets_init', array($this, 'register_widgets'));
|
41 |
+
|
42 |
+
add_action('ngg_delete_image', function() {
|
43 |
+
C_Photocrati_Transient_Manager::flush('random_widget_gallery_ids');
|
44 |
+
});
|
45 |
}
|
46 |
|
47 |
function register_widgets()
|
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.4.0
|
5 |
-
Stable tag: 3.
|
6 |
Tested up to: 5.6.1
|
7 |
License: GPLv3
|
8 |
Requires PHP: 5.6
|
@@ -19,6 +19,8 @@ On the back end, NextGEN offers a complete WordPress gallery management system w
|
|
19 |
|
20 |
On the front end, the free version of NextGEN provides three main gallery styles (slideshow, thumbnail, and imagebrowser galleries) and two album styles (compact and extended), all of which come with a wide array of options for controlling size, style, timing, transitions, controls, lightbox effects, and more. Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN WordPress Gallery Plugin features.</a>
|
21 |
|
|
|
|
|
22 |
https://www.youtube.com/embed/4Phvmm3etnw
|
23 |
|
24 |
**NEXTGEN GALLERY DEMOS**<br>
|
@@ -33,18 +35,15 @@ https://www.youtube.com/embed/4Phvmm3etnw
|
|
33 |
https://www.youtube.com/embed/ePnYGQX0Lf8
|
34 |
|
35 |
**NEXTGEN PRO DEMOS**<br>
|
|
|
|
|
|
|
36 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-mosaic-gallery/" target="_blank">Pro Mosaic Gallery</a><br>
|
37 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-masonry-gallery/" target="_blank">Pro Masonry Gallery</a><br>
|
|
|
38 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-filmstrip-gallery/" target="_blank">Pro Filmstrip Gallery</a><br>
|
39 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-film-gallery/" target="_blank">Pro Film Gallery</a><br>
|
40 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-
|
41 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-thumbnail-gallery/" target="_blank">Pro Thumbnail Gallery</a><br>
|
42 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-blogstyle-gallery/" target="_blank">Pro Blog Style Gallery</a><br>
|
43 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-grid-album/" target="_blank">Pro Grid Albums</a><br>
|
44 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-list-album/" target="_blank">Pro List Album</a><br>
|
45 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-lightbox-demo/" target="_blank">Pro Lightbox Demo</a><br>
|
46 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-proofing-demo/" target="_blank">Pro Proofing Demo</a><br>
|
47 |
-
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-ecommerce-demo/" target="_blank">Pro Ecommerce Demo</a><br>
|
48 |
|
49 |
= About Imagely =
|
50 |
|
@@ -52,8 +51,8 @@ NextGEN Gallery is a WordPress gallery plugin maintained by Imagely. We're the W
|
|
52 |
|
53 |
Learn more or connect with us:<br>
|
54 |
*<a href="https://www.imagely.com/" target="_blank">Imagely Website</a><br>
|
55 |
-
*<a href="https://www.imagely.com/wordpress-photography-themes/" target="_blank">
|
56 |
-
*<a href="https://www.imagely.com/
|
57 |
*<a href="https://www.imagely.com/podcast/" target="_blank">The WordPress Photography Podcast</a><br>
|
58 |
*<a href="https://www.imagely.com/docs/nextgen-gallery/" target="_blank">NextGEN Gallery Documentation</a><br>
|
59 |
*<a href="https://twitter.com/imagely" target="_blank">Imagely on Twitter</a><br>
|
@@ -180,6 +179,13 @@ For more information, feel free to visit the official website for the NextGEN Ga
|
|
180 |
|
181 |
== Changelog ==
|
182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
183 |
= V3.6.0 - 02.10.2020 =
|
184 |
* NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
|
185 |
* NEW: Allow maximum_entity_limit display setting regardless of source (1146)
|
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.4.0
|
5 |
+
Stable tag: 3.7.0
|
6 |
Tested up to: 5.6.1
|
7 |
License: GPLv3
|
8 |
Requires PHP: 5.6
|
19 |
|
20 |
On the front end, the free version of NextGEN provides three main gallery styles (slideshow, thumbnail, and imagebrowser galleries) and two album styles (compact and extended), all of which come with a wide array of options for controlling size, style, timing, transitions, controls, lightbox effects, and more. Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN WordPress Gallery Plugin features.</a>
|
21 |
|
22 |
+
The best gets better with full support for the Gutenberg block editor. Now you can add a gallery or album anywhere on your site, with a page builder type feel directly in the WordPress editor.
|
23 |
+
|
24 |
https://www.youtube.com/embed/4Phvmm3etnw
|
25 |
|
26 |
**NEXTGEN GALLERY DEMOS**<br>
|
35 |
https://www.youtube.com/embed/ePnYGQX0Lf8
|
36 |
|
37 |
**NEXTGEN PRO DEMOS**<br>
|
38 |
+
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-ecommerce-demo/" target="_blank">Photo Print Sales</a><br>
|
39 |
+
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-proofing-demo/" target="_blank">Photo Proofing</a><br>
|
40 |
+
*<a href="https://www.imagely.com/wordpress-gallery-plugin/digital-download-demo/" target="_blank">Digital Downloads</a><br>
|
41 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-mosaic-gallery/" target="_blank">Pro Mosaic Gallery</a><br>
|
42 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-masonry-gallery/" target="_blank">Pro Masonry Gallery</a><br>
|
43 |
+
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-tiled-gallery/" target="_blank">Pro Tiled Gallery</a><br>
|
44 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-filmstrip-gallery/" target="_blank">Pro Filmstrip Gallery</a><br>
|
45 |
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-film-gallery/" target="_blank">Pro Film Gallery</a><br>
|
46 |
+
*<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-lightbox-demo/" target="_blank">Pro Lightbox</a><br>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
|
48 |
= About Imagely =
|
49 |
|
51 |
|
52 |
Learn more or connect with us:<br>
|
53 |
*<a href="https://www.imagely.com/" target="_blank">Imagely Website</a><br>
|
54 |
+
*<a href="https://www.imagely.com/wordpress-photography-themes/" target="_blank">WordPress Themes for Photographers</a><br>
|
55 |
+
*<a href="https://www.imagely.com/sites/" target="_blank">Turnkey Photography Sites</a><br>
|
56 |
*<a href="https://www.imagely.com/podcast/" target="_blank">The WordPress Photography Podcast</a><br>
|
57 |
*<a href="https://www.imagely.com/docs/nextgen-gallery/" target="_blank">NextGEN Gallery Documentation</a><br>
|
58 |
*<a href="https://twitter.com/imagely" target="_blank">Imagely on Twitter</a><br>
|
179 |
|
180 |
== Changelog ==
|
181 |
|
182 |
+
= V3.7.0 - 02.17.2020 =
|
183 |
+
* Fixed: Added ellipsis to pagination to show pages skipped (1099) (1157)
|
184 |
+
* Fixed: Deleted images could still appear in 'random' image galleries (1129)
|
185 |
+
* Fixed: Galleries with only one page were causing pagination links to appear (1156)
|
186 |
+
* Fixed: Inability to change gallerypath on multisite networks (1150)
|
187 |
+
* Fixed: Overriding static resources (CSS & JS) through files in wp-content/ngg/ was not working (1144)
|
188 |
+
|
189 |
= V3.6.0 - 02.10.2020 =
|
190 |
* NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
|
191 |
* NEW: Allow maximum_entity_limit display setting regardless of source (1146)
|