NextGEN Gallery – WordPress Gallery Plugin - Version 3.16

Version Description

  • 09.08.2021
  • Fixed: Links on "Extensions" page were incorrect
  • Fixed: Incompatibility with WP User Manager caused Manage Gallery bulk actions to be unusable
  • Fixed: Images that failed to upload would be treated as a success in the UI if the server HTTP response code is 200
  • Changed: Removed the "Ambassadors" tab from the Overview page
Download this release

Release Info

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

Code changes from version 3.15 to 3.16

changelog.txt CHANGED
@@ -1,6 +1,12 @@
1
  NextGEN Gallery
2
  by Imagely
3
 
 
 
 
 
 
 
4
  = V3.15 - 08.23.2021
5
  * Fixed: A warning was generated on every request for users of PHP 5.6
6
 
1
  NextGEN Gallery
2
  by Imagely
3
 
4
+ = V3.16 - 09.08.2021
5
+ * Fixed: Links on "Extensions" page were incorrect
6
+ * Fixed: Incompatibility with WP User Manager caused Manage Gallery bulk actions to be unusable
7
+ * Fixed: Images that failed to upload would be treated as a success in the UI if the server HTTP response code is 200
8
+ * Changed: Removed the "Ambassadors" tab from the Overview page
9
+
10
  = V3.15 - 08.23.2021
11
  * Fixed: A warning was generated on every request for users of PHP 5.6
12
 
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.15
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.15');
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.16
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.16');
716
 
717
  define(
718
  'NGG_SCRIPT_VERSION',
products/photocrati_nextgen/modules/marketing/module.marketing.php CHANGED
@@ -299,7 +299,7 @@ class M_Marketing extends C_Base_Module
299
  'source' => $source
300
  ]);
301
 
302
- $url = '?utm_source=' . $params['source'];
303
  $url .= '&utm_medium=' . $params['medium'];
304
  $url .= '&utm_campaign=' . $params['campaign'];
305
 
299
  'source' => $source
300
  ]);
301
 
302
+ $url .= '?utm_source=' . $params['source'];
303
  $url .= '&utm_medium=' . $params['medium'];
304
  $url .= '&utm_campaign=' . $params['campaign'];
305
 
products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php CHANGED
@@ -116,14 +116,18 @@
116
  ...NggXHRSettings,
117
  endpoint: set_ngg_upload_url(0, ''),
118
  getResponseError: (text, response) => {
119
- if ('string' === typeof text) {
120
- text = JSON.parse(text);
 
 
 
 
 
121
  }
122
- return text.error;
123
- }
124
- }
125
 
126
- const uppy = Uppy.Core(uppyCoreSettings)
127
  .use(Uppy.Dashboard, NggUppyDashboardSettings)
128
  .use(Uppy.XHRUpload, uppyXHRSettings)
129
  .use(Uppy.DropTarget, {
@@ -148,9 +152,10 @@
148
  }
149
  })
150
  .on('complete', (result) => {
151
- // There was at least one error: remove the successful images so users can find out what went wrong
152
- if (result.failed.length > 0) {
153
  uppy.getFiles().forEach((file) => {
 
154
  if ('undefined' === typeof file.error) {
155
  uppy.removeFile(file.id);
156
  }
@@ -244,10 +249,22 @@
244
  if (!chosen_name) {
245
  chosen_name = parseInt(gallery_select.value) === 0 ? gallery_name.value : gallery_select.selectedOptions[0].dataset.originalValue;
246
  }
 
247
  const endpoint = set_ngg_upload_url(gallery_select.value, chosen_name)
 
248
  uppy.getPlugin('XHRUpload').setOptions({
249
- endpoint: endpoint
250
- });
 
 
 
 
 
 
 
 
 
 
251
  }
252
 
253
  gallery_select.addEventListener('change', function() {
116
  ...NggXHRSettings,
117
  endpoint: set_ngg_upload_url(0, ''),
118
  getResponseError: (text, response) => {
119
+ try {
120
+ if ('string' === typeof text) {
121
+ text = JSON.parse(text);
122
+ }
123
+ return text.error;
124
+ } catch (error) {
125
+ return error;
126
  }
127
+ }
128
+ }
 
129
 
130
+ const uppy = Uppy.Core(uppyCoreSettings)
131
  .use(Uppy.Dashboard, NggUppyDashboardSettings)
132
  .use(Uppy.XHRUpload, uppyXHRSettings)
133
  .use(Uppy.DropTarget, {
152
  }
153
  })
154
  .on('complete', (result) => {
155
+ // There was at least one error: remove the successful images so users can find out what went wrong
156
+ if (result.failed.length > 0) {
157
  uppy.getFiles().forEach((file) => {
158
+ console.log("FILE", file);
159
  if ('undefined' === typeof file.error) {
160
  uppy.removeFile(file.id);
161
  }
249
  if (!chosen_name) {
250
  chosen_name = parseInt(gallery_select.value) === 0 ? gallery_name.value : gallery_select.selectedOptions[0].dataset.originalValue;
251
  }
252
+
253
  const endpoint = set_ngg_upload_url(gallery_select.value, chosen_name)
254
+
255
  uppy.getPlugin('XHRUpload').setOptions({
256
+ endpoint: endpoint,
257
+ // It's possible that the server may fail to upload any images but still return an HTTP 200 code,
258
+ // this method will ensure that the response contains a JSON object with the gallery_id attribute.
259
+ validateStatus: (status, responseText, response) => {
260
+ try {
261
+ const result = JSON.parse(responseText);
262
+ return 'undefined' !== typeof result.gallery_id;
263
+ } catch (error) {
264
+ return false;
265
+ }
266
+ }
267
+ });
268
  }
269
 
270
  gallery_select.addEventListener('change', function() {
products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php CHANGED
@@ -4789,10 +4789,10 @@ class C_NggLegacy_Thumbnail
4789
  if (is_resource($this->newImage) || $this->newImage instanceof GdImage) {
4790
  @imagedestroy($this->newImage);
4791
  }
4792
- if (is_resource($this->oldImage) || $this->newImage instanceof GdImage) {
4793
  @imagedestroy($this->oldImage);
4794
  }
4795
- if (is_resource($this->workingImage) || $this->newImage instanceof GdImage) {
4796
  @imagedestroy($this->workingImage);
4797
  }
4798
  }
4789
  if (is_resource($this->newImage) || $this->newImage instanceof GdImage) {
4790
  @imagedestroy($this->newImage);
4791
  }
4792
+ if (is_resource($this->oldImage) || $this->oldImage instanceof GdImage) {
4793
  @imagedestroy($this->oldImage);
4794
  }
4795
+ if (is_resource($this->workingImage) || $this->workingImage instanceof GdImage) {
4796
  @imagedestroy($this->workingImage);
4797
  }
4798
  }
products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php CHANGED
@@ -88,71 +88,8 @@ function nggallery_picturelist($controller)
88
  ?>
89
 
90
  <script type="text/javascript">
91
- var $ = jQuery;
92
-
93
- function showDialog(windowId, title) {
94
- var form = document.getElementById('updategallery');
95
- var elementlist = "";
96
-
97
- for (var i = 0, n = form.elements.length; i < n; i++) {
98
- if (form.elements[i].type === "checkbox") {
99
- if (form.elements[i].name === "doaction[]") {
100
- if (form.elements[i].checked === true) {
101
- if (elementlist === "") {
102
- elementlist = form.elements[i].value;
103
- } else {
104
- elementlist += "," + form.elements[i].value;
105
- }
106
- }
107
- }
108
- }
109
- }
110
-
111
- $("#" + windowId + "_bulkaction").val($("#bulkaction").val());
112
- $("#" + windowId + "_imagelist").val(elementlist);
113
-
114
- // now show the dialog
115
- $("#" + windowId).dialog({
116
- width: 640,
117
- resizable: false,
118
- modal: true,
119
- title: title,
120
- position: {
121
- my: 'center',
122
- at: 'center',
123
- of: window.parent
124
- }
125
- });
126
-
127
- $("#" + windowId + ' .dialog-cancel').on('click', function() {
128
- $("#" + windowId).dialog("close");
129
- });
130
- }
131
-
132
- function setURLParam(param, paramVal) {
133
- var url = window.location.href;
134
- var params = "";
135
- var tmp = "";
136
- var tmpArray = url.split("?");
137
- var base = tmpArray[0];
138
- var additional = tmpArray[1];
139
-
140
- if (additional) {
141
- tmpArray = additional.split("&");
142
- for (i = 0; i < tmpArray.length; i++) {
143
- if (tmpArray[i].split('=')[0] !== param) {
144
- params += tmp + tmpArray[i];
145
- tmp = "&";
146
- }
147
- }
148
- }
149
-
150
- return base + "?" + params + tmp + "" + param + "=" + paramVal;
151
- }
152
-
153
- $(function() {
154
-
155
- $('span.tooltip, label.tooltip').tooltip();
156
 
157
  $('#ngg-manage-images-items-per-page').on('change', function() {
158
  window.location.href = setURLParam('items', $(this).val());
@@ -224,103 +161,164 @@ function nggallery_picturelist($controller)
224
  Frame_Event_Publisher.delete_cookie("X-Frame-Events_" + data.id);
225
  }, 400);
226
  });
227
- });
228
-
229
- function checkAll(form) {
230
- for (var i = 0, n = form.elements.length; i < n; i++) {
231
- if (form.elements[i].type === "checkbox") {
232
- if (form.elements[i].name === "doaction[]") {
233
- if (form.elements[i].checked == true) {
234
- form.elements[i].checked = false;
235
- } else {
236
- form.elements[i].checked = true;
237
- }
238
- }
239
- }
240
- }
241
- }
242
-
243
- function getNumChecked(form) {
244
- var num = 0;
245
- for (var i = 0, n = form.elements.length; i < n; i++) {
246
- if (form.elements[i].type === "checkbox") {
247
- if (form.elements[i].name === "doaction[]") {
248
- if (form.elements[i].checked === true) {
249
- num++;
250
- }
251
- }
252
- }
253
- }
254
- return num;
255
- }
256
-
257
- // this function check for a the number of selected images, sumbmit false when no one selected
258
- function checkSelected() {
259
-
260
- var numchecked = getNumChecked(document.getElementById('updategallery'));
261
 
262
- if (typeof document.activeElement == "undefined" && document.addEventListener) {
263
- document.addEventListener("focus", function (e) {
264
- document.activeElement = e.target;
265
- }, true);
266
- }
267
-
268
- if (document.activeElement.name === 'post_paged')
269
- return true;
270
-
271
- if (numchecked < 1) {
272
- alert('<?php echo esc_js(__('No images selected', 'nggallery')); ?>');
273
- return false;
274
- }
275
-
276
- var actionId = $('#bulkaction').val();
277
-
278
- switch (actionId) {
279
- case "copy_to":
280
- showDialog('selectgallery', '<?php echo esc_js(__('Copy image to...','nggallery')); ?>');
281
- return false;
282
- break;
283
- case "move_to":
284
- showDialog('selectgallery', '<?php echo esc_js(__('Move image to...','nggallery')); ?>');
285
- return false;
286
- break;
287
- case "add_tags":
288
- showDialog('entertags', '<?php echo esc_js(__('Add new tags','nggallery')); ?>');
289
- return false;
290
- break;
291
- case "delete_tags":
292
- showDialog('entertags', '<?php echo esc_js(__('Delete tags','nggallery')); ?>');
293
- return false;
294
- break;
295
- case "overwrite_tags":
296
- showDialog('entertags', '<?php echo esc_js(__('Overwrite','nggallery')); ?>');
297
- return false;
298
- break;
299
- case "resize_images":
300
- showDialog('resize_images', '<?php echo esc_js(__('Resize images','nggallery')); ?>');
301
- return false;
302
- break;
303
- case "new_thumbnail":
304
- showDialog('new_thumbnail', '<?php echo esc_js(__('Create new thumbnails','nggallery')); ?>');
305
- return false;
306
- break;
307
- }
308
-
309
- return confirm('<?php echo sprintf(esc_js(__("You are about to start the bulk edit for %s images \n \n 'Cancel' to stop, 'OK' to proceed.",'nggallery')), "' + numchecked + '") ; ?>');
310
- }
311
-
312
- $(function() {
313
- if ($(this).data('ready')) {
314
- return;
315
- }
316
-
317
- // close postboxes that should be closed
318
- $('.if-js-closed').removeClass('if-js-closed')
319
- .addClass('closed');
320
- postboxes.add_postbox_toggles('ngg-manage-gallery');
321
-
322
- $(this).data('ready', true);
323
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
324
  </script>
325
 
326
  <?php if ($action_status['message'] != '') { ?>
88
  ?>
89
 
90
  <script type="text/javascript">
91
+ (function($) {
92
+ // $('span.tooltip, label.tooltip').tooltip();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
  $('#ngg-manage-images-items-per-page').on('change', function() {
95
  window.location.href = setURLParam('items', $(this).val());
161
  Frame_Event_Publisher.delete_cookie("X-Frame-Events_" + data.id);
162
  }, 400);
163
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
+ window.showDialog = function(windowId, title) {
166
+ var form = document.getElementById('updategallery');
167
+ var elementlist = "";
168
+
169
+ for (var i = 0, n = form.elements.length; i < n; i++) {
170
+ if (form.elements[i].type === "checkbox") {
171
+ if (form.elements[i].name === "doaction[]") {
172
+ if (form.elements[i].checked === true) {
173
+ if (elementlist === "") {
174
+ elementlist = form.elements[i].value;
175
+ } else {
176
+ elementlist += "," + form.elements[i].value;
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+
183
+ $("#" + windowId + "_bulkaction").val($("#bulkaction").val());
184
+ $("#" + windowId + "_imagelist").val(elementlist);
185
+
186
+ // now show the dialog
187
+ $("#" + windowId).dialog({
188
+ width: 640,
189
+ resizable: false,
190
+ modal: true,
191
+ title: title,
192
+ position: {
193
+ my: 'center',
194
+ at: 'center',
195
+ of: window.parent
196
+ }
197
+ });
198
+
199
+ $("#" + windowId + ' .dialog-cancel').on('click', function() {
200
+ $("#" + windowId).dialog("close");
201
+ });
202
+ }
203
+
204
+ window.setURLParam = function(param, paramVal) {
205
+ var url = window.location.href;
206
+ var params = "";
207
+ var tmp = "";
208
+ var tmpArray = url.split("?");
209
+ var base = tmpArray[0];
210
+ var additional = tmpArray[1];
211
+
212
+ if (additional) {
213
+ tmpArray = additional.split("&");
214
+ for (i = 0; i < tmpArray.length; i++) {
215
+ if (tmpArray[i].split('=')[0] !== param) {
216
+ params += tmp + tmpArray[i];
217
+ tmp = "&";
218
+ }
219
+ }
220
+ }
221
+
222
+ return base + "?" + params + tmp + "" + param + "=" + paramVal;
223
+ }
224
+
225
+ window.checkAll = function(form) {
226
+ for (var i = 0, n = form.elements.length; i < n; i++) {
227
+ if (form.elements[i].type === "checkbox") {
228
+ if (form.elements[i].name === "doaction[]") {
229
+ if (form.elements[i].checked == true) {
230
+ form.elements[i].checked = false;
231
+ } else {
232
+ form.elements[i].checked = true;
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+
239
+ window.getNumChecked = function(form) {
240
+ var num = 0;
241
+ for (var i = 0, n = form.elements.length; i < n; i++) {
242
+ if (form.elements[i].type === "checkbox") {
243
+ if (form.elements[i].name === "doaction[]") {
244
+ if (form.elements[i].checked === true) {
245
+ num++;
246
+ }
247
+ }
248
+ }
249
+ }
250
+ return num;
251
+ }
252
+
253
+ // this function check for a the number of selected images, sumbmit false when no one selected
254
+ window.checkSelected = function() {
255
+
256
+ var numchecked = getNumChecked(document.getElementById('updategallery'));
257
+
258
+ if (typeof document.activeElement == "undefined" && document.addEventListener) {
259
+ document.addEventListener("focus", function (e) {
260
+ document.activeElement = e.target;
261
+ }, true);
262
+ }
263
+
264
+ if (document.activeElement.name === 'post_paged')
265
+ return true;
266
+
267
+ if (numchecked < 1) {
268
+ alert('<?php echo esc_js(__('No images selected', 'nggallery')); ?>');
269
+ return false;
270
+ }
271
+
272
+ var actionId = document.getElementById('bulkaction').value;
273
+
274
+ switch (actionId) {
275
+ case "copy_to":
276
+ showDialog('selectgallery', '<?php echo esc_js(__('Copy image to...','nggallery')); ?>');
277
+ return false;
278
+ break;
279
+ case "move_to":
280
+ showDialog('selectgallery', '<?php echo esc_js(__('Move image to...','nggallery')); ?>');
281
+ return false;
282
+ break;
283
+ case "add_tags":
284
+ showDialog('entertags', '<?php echo esc_js(__('Add new tags','nggallery')); ?>');
285
+ return false;
286
+ break;
287
+ case "delete_tags":
288
+ showDialog('entertags', '<?php echo esc_js(__('Delete tags','nggallery')); ?>');
289
+ return false;
290
+ break;
291
+ case "overwrite_tags":
292
+ showDialog('entertags', '<?php echo esc_js(__('Overwrite','nggallery')); ?>');
293
+ return false;
294
+ break;
295
+ case "resize_images":
296
+ showDialog('resize_images', '<?php echo esc_js(__('Resize images','nggallery')); ?>');
297
+ return false;
298
+ break;
299
+ case "new_thumbnail":
300
+ showDialog('new_thumbnail', '<?php echo esc_js(__('Create new thumbnails','nggallery')); ?>');
301
+ return false;
302
+ break;
303
+ }
304
+
305
+ return confirm('<?php echo sprintf(esc_js(__("You are about to start the bulk edit for %s images \n \n 'Cancel' to stop, 'OK' to proceed.",'nggallery')), "' + numchecked + '") ; ?>');
306
+ }
307
+
308
+ if ($(this).data('ready')) {
309
+ return;
310
+ }
311
+
312
+ // close postboxes that should be closed
313
+ $('.if-js-closed').removeClass('if-js-closed').addClass('closed');
314
+
315
+ // Some third party plugins alter when postboxes are enqueued, so give this line a second to wait for it to be available
316
+ setTimeout(function() {
317
+ postboxes.add_postbox_toggles('ngg-manage-gallery');
318
+ }, 1000);
319
+
320
+ $(this).data('ready', true);
321
+ })(jQuery);
322
  </script>
323
 
324
  <?php if ($action_status['message'] != '') { ?>
products/photocrati_nextgen/modules/ngglegacy/admin/overview.php CHANGED
@@ -45,10 +45,10 @@ function nggallery_admin_overview()
45
  if (!$found) { ?>
46
  <a href="javascript:void(0)" data-id="ngg-vs-pro-link"><?php _e( 'NextGEN Basic vs Pro', 'nggallery'); ?></a>
47
  <?php } ?>
 
48
  <?php if (wp_get_theme() != "Imagely"): ?>
49
  <a href="javascript:void(0)" data-id="genesis-link"><?php _e( 'Imagely Themes', 'nggallery'); ?></a>
50
  <?php endif ?>
51
- <a href="javascript:void(0)" data-id="ambassador-link"><?php _e( 'Ambassadors', 'nggallery'); ?></a>
52
  <?php if (!$found) { ?>
53
  <a href="javascript:void(0)" data-id="pro-link"><?php _e('Unlock More', 'nggallery'); ?></a>
54
  <?php } ?>
@@ -377,59 +377,6 @@ function nggallery_admin_overview()
377
  </div>
378
  <?php endif ?>
379
 
380
- <div data-id="ambassador-link">
381
-
382
- <div class="feature-section three-col">
383
- <h2><?php _e( 'Meet the Imagely Product Ambassadors', 'nggallery' ); ?></h2>
384
- <p class="about-text"><?php _e( "NextGEN Gallery and other Imagely products are used by some of the best photographers in the world. Meet some of the Imagely Ambassadors who are putting Imagely and NextGEN Gallery to work professionally.", 'nggallery' ); ?>
385
- </p>
386
- <div class="col">
387
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/the-youngrens/', 'ambassador', 'theyoungrens')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/theyoungrens-ngg.jpg" alt="The Youngrens"/></a>
388
- <h3><?php _e( 'The Youngrens' ); ?></h3>
389
- <p><?php _e( 'Jeff and Erin are a luxury husband and wife photography team who deeply love each other and their photography clients. They shoot weddings and engagements all over the U.S. and beyond. With three photography businesses that serve different clientele, they have unique insights into business strategies and are passionate about improving the day to day lives of other photographers.', 'nggallery' ); ?></p>
390
- </div>
391
- <div class="col">
392
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/tamara-lackey/', 'ambassador', 'tamaralackey')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/TamaraLackey-ngg.jpg" alt="Tamara Lackey" /></a>
393
- <h3><?php _e( 'Tamara Lackey' ); ?></h3>
394
- <p><?php _e( 'Tamara Lackey is a renowned professional photographer, speaker, and author. Her authentic lifestyle photography, from children’s portraits to celebrity portraits, is praised within her industry and published internationally. She is a Nikon USA Ambassador, the host of The reDefine Show web series, and the co-founder of the non-profit charitable organization, Beautiful Together, in support of children waiting for families.', 'nggallery' ); ?></p>
395
- </div>
396
- <div class="col">
397
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/colby-brown/', 'ambassador', 'colbybrown')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/colby-brown-ngg.jpg" alt="Colby Brown" /></a>
398
- <h3><?php _e( 'Colby Brown' ); ?></h3>
399
- <p><?php _e( 'Colby is a photographer, photo educator, and author specializing in landscape, travel and humanitarian photography. With an audience reaching millions, Colby partners on social influencer marketing campaigns with some of the biggest companies and destinations in the world, including Sony, Samsung, Toshiba, Iceland Naturally, Jordan Tourism Board, Australia.com, Visit California and more.', 'nggallery' ); ?></p>
400
- </div>
401
- </div>
402
-
403
- <div class="feature-section three-col">
404
- <div class="col">
405
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/jared-platt/', 'ambassador', 'jaredplatt')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/jared-platt-ngg.jpg" alt="Jared Platt" /></a>
406
- <h3><?php _e( 'Jared Platt' ); ?></h3>
407
- <p><?php _e( 'Jared is a professional wedding and lifestyle photographer. He also travels the world giving lectures and workshops on photography, lighting, and post-production efficiency and workflow. His interactive style, and attention to detail and craft make him an entertaining and demanding photography instructor.', 'nggallery' ); ?></p>
408
- </div>
409
- <div class="col">
410
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/brian-matiash/', 'ambassador', 'brianmatiash')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/brian-matiash-ngg.jpeg" alt="" /></a>
411
- <h3><?php _e( 'Brian Matiash' ); ?></h3>
412
- <p><?php _e( 'Brian is a professional photographer, author, and educator. He fuses landscape & travel photography with experiential storytelling and practical instructing to help others grow creatively. He is also a Sony Artisan of Imagery, a Zeiss Lens Ambassador, a Formatt-Hitech Featured Photographer, and a member of G-Technology’s G-Team.', 'nggallery' ); ?></p>
413
- </div>
414
- <div class="col">
415
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/christine-tremoulet/', 'ambassador', 'christinetremoulet')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/Christine-Tremoulet-ngg.jpg" alt="" /></a>
416
- <h3><?php _e( 'Christine Tremoulet' ); ?></h3>
417
- <p><?php _e( 'Christine famously coined the term WordPress. She is an author, speaker, business coach, and story strategist who specializes in helping creatives celebrate their story online through blogging and social media. When not offering actionable know-how to businesses, she can be found taking long road trips across North America in her Mini Cooper.', 'nggallery' ); ?></p>
418
- </div>
419
- </div>
420
-
421
- <div class="feature-section three-col">
422
- <div class="col">
423
- <a href="<?php print esc_attr(M_Marketing::get_utm_link('https://www.imagely.com/team-member/david-beckstead/', 'ambassador', 'davidbeckstead')); ?>" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/david-beckstead-ngg.jpg" alt="David Beckstead" /></a>
424
- <h3><?php _e( 'David Beckstead' ); ?></h3>
425
- <p><?php _e( 'Named one of the Top 10 Wedding Photographers in the World by American Photo magazine, David is a celebrated photographer and educator. He is also a mountain man with a enviable lifestyle: from his base in rural Washington, he travels all over the world teaching workshops, while sharing lessons with 16,000 photographers in the Abstract Canvas Facebook group.', 'nggallery' ); ?></p>
426
- </div>
427
- <div class="col"></div>
428
- <div class="col"></div>
429
- </div>
430
-
431
- </div>
432
-
433
  </div> <!-- /.ngg_page_content_main -->
434
 
435
  </div> <!-- /.wrap -->
45
  if (!$found) { ?>
46
  <a href="javascript:void(0)" data-id="ngg-vs-pro-link"><?php _e( 'NextGEN Basic vs Pro', 'nggallery'); ?></a>
47
  <?php } ?>
48
+
49
  <?php if (wp_get_theme() != "Imagely"): ?>
50
  <a href="javascript:void(0)" data-id="genesis-link"><?php _e( 'Imagely Themes', 'nggallery'); ?></a>
51
  <?php endif ?>
 
52
  <?php if (!$found) { ?>
53
  <a href="javascript:void(0)" data-id="pro-link"><?php _e('Unlock More', 'nggallery'); ?></a>
54
  <?php } ?>
377
  </div>
378
  <?php endif ?>
379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
380
  </div> <!-- /.ngg_page_content_main -->
381
 
382
  </div> <!-- /.wrap -->
products/photocrati_nextgen/modules/ngglegacy/lib/gd.thumbnail.inc.php CHANGED
@@ -275,10 +275,10 @@ class ngg_Thumbnail {
275
  if (is_resource($this->newImage) || $this->newImage instanceof GdImage)
276
  @imagedestroy($this->newImage);
277
 
278
- if (is_resource($this->oldImage) || $this->newImage instanceof GdImage)
279
  @imagedestroy($this->oldImage);
280
 
281
- if (is_resource($this->workingImage) || $this->newImage instanceof GdImage)
282
  @imagedestroy($this->workingImage);
283
  }
284
 
275
  if (is_resource($this->newImage) || $this->newImage instanceof GdImage)
276
  @imagedestroy($this->newImage);
277
 
278
+ if (is_resource($this->oldImage) || $this->oldImage instanceof GdImage)
279
  @imagedestroy($this->oldImage);
280
 
281
+ if (is_resource($this->workingImage) || $this->workingImage instanceof GdImage)
282
  @imagedestroy($this->workingImage);
283
  }
284
 
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.15
6
  Tested up to: 5.8
7
  License: GPLv3
8
  Requires PHP: 5.6
@@ -179,6 +179,12 @@ For more information, feel free to visit the official website for the NextGEN Ga
179
 
180
  == Changelog ==
181
 
 
 
 
 
 
 
182
  = V3.15 - 08.23.2021
183
  * Fixed: A warning was generated on every request for users of PHP 5.6
184
 
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.16
6
  Tested up to: 5.8
7
  License: GPLv3
8
  Requires PHP: 5.6
179
 
180
  == Changelog ==
181
 
182
+ = V3.16 - 09.08.2021
183
+ * Fixed: Links on "Extensions" page were incorrect
184
+ * Fixed: Incompatibility with WP User Manager caused Manage Gallery bulk actions to be unusable
185
+ * Fixed: Images that failed to upload would be treated as a success in the UI if the server HTTP response code is 200
186
+ * Changed: Removed the "Ambassadors" tab from the Overview page
187
+
188
  = V3.15 - 08.23.2021
189
  * Fixed: A warning was generated on every request for users of PHP 5.6
190