NextGEN Gallery – WordPress Gallery Plugin - Version 3.7.0

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 Icon 128x128 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 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.6.0
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.6.0');
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
- echo json_encode($retval);
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.3.21',
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
- foreach ($form_manager->get_forms($this->object->get_form_type()) as $form) {
1120
- $forms[] = $this->object->get_registry()->get_utility('I_Form', $form);
1121
- }
1122
- return $forms;
 
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.4.8',
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
- $add = TRUE;
47
- // We always show the first and last pages
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
- // Next page
74
- if ($selected_page + 1 <= $number_of_pages) {
75
- $next_page = $selected_page + 1;
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
- // Prev page
80
- if ($selected_page - 1 > 0) {
81
- $prev_page = $selected_page - 1;
82
- $link = $return['next'] = $this->object->set_param_for($current_url, 'nggpage', $prev_page);
83
- array_unshift($pages, "<a class='next' data-pageid={$prev_page}>{$prev_symbol}</a>");
84
  }
85
- if ($pages) {
 
 
 
 
 
 
 
 
 
 
 
 
 
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.6',
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
- $messagetext = '';
 
11
 
12
- // get the options
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
- // the path should always end with a slash
30
- $ngg_options['gallerypath'] = trailingslashit($ngg_options['gallerypath']);
31
- $fs = C_Fs::get_instance();
32
- $root = $fs->get_document_root('galleries');
33
- $gallery_abspath = $fs->get_absolute_path($fs->join_paths($root, $ngg_options['gallerypath']));
34
- if ($gallery_abspath[0] != DIRECTORY_SEPARATOR) $gallery_abspath = DIRECTORY_SEPARATOR.$gallery_abspath;
35
- if (strpos($gallery_abspath, $root) === FALSE) {
36
- $messagetext = sprintf(__("Gallery path must be located in %s", 'nggallery'), $root);
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
- // Show donation message only one time.
48
- if (isset ( $_GET['hideSupportInfo']) ) {
49
- $ngg_options['hideSupportInfo'] = true;
50
- update_site_option('ngg_options', $ngg_options);
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['gallerypath']; ?>" /><br />
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['wpmuQuotaCheck']); ?> />
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['wpmuZipUpload']); ?> />
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['wpmuImportFolder']); ?> />
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['wpmuRoles']); ?> />
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.0
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-slideshow-gallery/" target="_blank">Pro Slideshow Gallery</a><br>
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">Genesis WordPress Themes for Photographers</a><br>
56
- *<a href="https://www.imagely.com/hosting/" target="_blank">Managed WordPress Hosting for Photographers</a><br>
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)