ShortPixel Image Optimizer - Version 4.10.4

Version Description

  • replace back the PNG links when restoring a PNG converted to JPG
  • fix incompatibility with Dynamics 365 Integration plugin
  • improve restore capabilities after certain types of PNG to JPG errors which left the media item in an unconsistent state.
  • remove AUTH credentials on server too, if removed in plugin's settings.
  • more performance improvements to PNG 2 JPG conversion
  • fix replacing PNG urls having http:// instead of https:// for a SSL site. (and viceversa)
  • fix string not appearing in translations
Download this release

Release Info

Developer ShortPixel
Plugin Icon 128x128 ShortPixel Image Optimizer
Version 4.10.4
Comparing to
See all releases

Code changes from version 4.10.3 to 4.10.4

class/db/shortpixel-meta-facade.php CHANGED
@@ -330,7 +330,7 @@ class ShortPixelMetaFacade {
330
 
331
  if($this->type == self::CUSTOM_TYPE) {
332
  $meta = $this->getMeta();
333
-
334
  //fix for situations where site_url is lala.com/en and home_url is lala.com - if using the site_url will get a duplicated /en in the URL
335
  $homeUrl = self::getHomeUrl();
336
  $urlList[] = self::replaceHomePath($meta->getPath(), $homeUrl);
@@ -363,7 +363,7 @@ class ShortPixelMetaFacade {
363
  $TmpCount = count($Tmp);
364
  $StichString = $Tmp[$TmpCount-2] . "/" . $Tmp[$TmpCount-1];
365
 
366
- $count = 0;
367
  foreach( $sizes as $thumbnailName => $thumbnailInfo ) {
368
 
369
  if(!isset($thumbnailInfo['file'])) { //cases when $thumbnailInfo is NULL
330
 
331
  if($this->type == self::CUSTOM_TYPE) {
332
  $meta = $this->getMeta();
333
+
334
  //fix for situations where site_url is lala.com/en and home_url is lala.com - if using the site_url will get a duplicated /en in the URL
335
  $homeUrl = self::getHomeUrl();
336
  $urlList[] = self::replaceHomePath($meta->getPath(), $homeUrl);
363
  $TmpCount = count($Tmp);
364
  $StichString = $Tmp[$TmpCount-2] . "/" . $Tmp[$TmpCount-1];
365
 
366
+ $count = 1;
367
  foreach( $sizes as $thumbnailName => $thumbnailInfo ) {
368
 
369
  if(!isset($thumbnailInfo['file'])) { //cases when $thumbnailInfo is NULL
class/shortpixel-png2jpg.php CHANGED
@@ -113,6 +113,7 @@ class ShortPixelPng2Jpg {
113
  //backup?
114
  if($backup) {
115
  $imageForBk = trailingslashit(dirname($image)) . ShortPixelAPI::MB_basename($newPath, '.jpg') . '.png';
 
116
  if($image != $imageForBk) {
117
  WPShortPixel::log("PNG2JPG doConvert rename $image to $imageForBk");
118
  @rename($image, $imageForBk);
@@ -130,6 +131,7 @@ class ShortPixelPng2Jpg {
130
  }
131
  //unlink($image);
132
  $params['file'] = $newPath;
 
133
  $params['original_file'] = $image;
134
  $params['url'] = $newUrl;
135
  $params['type'] = 'image/jpeg';
@@ -195,7 +197,7 @@ class ShortPixelPng2Jpg {
195
  $imagePath = get_attached_file($ID);
196
  $basePath = trailingslashit(str_replace($image, "", $imagePath));
197
  $imageUrl = wp_get_attachment_url($ID);
198
- $baseUrl = trailingslashit(str_replace($image, "", $imageUrl));
199
 
200
  // set a temporary error in order to make sure user gets something if the image failed from memory limit.
201
  if( isset($meta['ShortPixel']['Retries']) && $meta['ShortPixel']['Retries'] > 3
@@ -217,7 +219,9 @@ class ShortPixelPng2Jpg {
217
  return $meta; //cannot convert it
218
  }
219
 
 
220
  $retMain = $this->doConvertPng2Jpg(array('file' => $imagePath, 'url' => false, 'type' => 'image/png'), $this->_settings->backupImages, false, $retC['img']);
 
221
  WPShortPixel::log("PNG2JPG doConvert Main RETURNED " . json_encode($retMain));
222
  $ret = $retMain->params;
223
  $toUnlink = array();
@@ -233,11 +237,12 @@ class ShortPixelPng2Jpg {
233
  $toUnlink[] = $retMain->unlink;
234
  //convert to the new URLs the urls in the existing posts.
235
  $baseRelPath = trailingslashit(dirname($image));
236
- $toReplace[$imageUrl] = $baseUrl . $baseRelPath . wp_basename($ret['file']);
237
- //$this->png2JpgUpdateUrls(array(), $imageUrl, $baseUrl . $baseRelPath . wp_basename($ret['file']));
238
  $pngSize = $ret['png_size'];
239
  $jpgSize = $ret['jpg_size'];
 
240
  $imagePath = isset($ret['original_file']) ? $ret['original_file'] : $imagePath;
 
241
 
242
  //conversion succeeded for the main image, update meta and proceed to thumbs. (It could also not succeed if the converted file is not smaller)
243
  $meta['file'] = str_replace($basePath, '', $ret['file']);
@@ -261,18 +266,19 @@ class ShortPixelPng2Jpg {
261
  $jpgSize += $rett['jpg_size'];
262
  WPShortPixel::log("PNG2JPG total PNG size: $pngSize total JPG size: $jpgSize");
263
  $originalSizes[$size]['file'] = wp_basename($rett['file'], '.jpg') . '.png';
 
264
  $toReplace[$baseUrl . $baseRelPath . $info['file']] = $baseUrl . $baseRelPath . wp_basename($rett['file']);
265
- //$this->png2JpgUpdateUrls(array(), $baseUrl . $baseRelPath . $info['file'], $baseUrl . $baseRelPath . wp_basename($rett['file']));
266
  wp_update_attachment_metadata($ID, $meta);
267
  }
268
  }
269
- $meta['ShortPixelPng2Jpg'] = array('originalFile' => $imagePath, 'originalSizes' => $originalSizes,
 
270
  'backup' => $this->_settings->backupImages,
271
  'optimizationPercent' => round(100.0 * (1.00 - $jpgSize / $pngSize)));
272
  wp_update_attachment_metadata($ID, $meta);
273
  }
274
 
275
- $this->png2JpgUpdateUrls(array(), $toReplace);
276
  foreach($toUnlink as $unlink) {
277
  if($unlink) {
278
  WPShortPixel::log("PNG2JPG unlink $unlink");
@@ -291,7 +297,7 @@ class ShortPixelPng2Jpg {
291
  * @param $newurl
292
  * @return array
293
  */
294
- protected function png2JpgUpdateUrls($options, $map){
295
  global $wpdb;
296
  WPShortPixel::log("PNG2JPG update URLS " . json_encode($map));
297
  $results = array();
@@ -316,9 +322,9 @@ class ShortPixelPng2Jpg {
316
 
317
  for( $page = 0; $page < $pages; $page++ ) {
318
  $start = $page * $page_size;
319
- $pmquery = "SELECT * FROM $wpdb->postmeta WHERE meta_value <> '' AND meta_value <> '_wp_attachment_metadata' AND meta_value <> '_wp_attached_file' LIMIT $start, $page_size";
320
  $items = $wpdb->get_results( $pmquery );
321
- foreach( $items as $item ){
322
  $value = $item->meta_value;
323
  if( trim($value) == '' )
324
  continue;
@@ -326,7 +332,7 @@ class ShortPixelPng2Jpg {
326
  $edited = (object)array('data' => $value, 'replaced' => false);
327
  foreach($map as $oldurl => $newurl) {
328
  if (strlen($newurl)) {
329
- $editedOne = $this->png2JpgUnserializeReplace($oldurl, $newurl, $edited->data);
330
  $edited->data = $editedOne->data;
331
  $edited->replaced = $edited->replaced || $editedOne->replaced;
332
  }
@@ -352,6 +358,10 @@ class ShortPixelPng2Jpg {
352
  return $results;
353
  }
354
 
 
 
 
 
355
  /**
356
  * taken from Velvet Blues Update URLs plugin
357
  * @param string $from
@@ -360,7 +370,7 @@ class ShortPixelPng2Jpg {
360
  * @param bool|false $serialised
361
  * @return array|mixed|string
362
  */
363
- function png2JpgUnserializeReplace( $from = '', $to = '', $data = '', $serialised = false ) {
364
  $replaced = false;
365
  try {
366
  if ( false !== is_serialized( $data ) ) {
@@ -370,14 +380,14 @@ class ShortPixelPng2Jpg {
370
  }
371
 
372
  $unserialized = unserialize( $data );
373
- $ret = $this->png2JpgUnserializeReplace( $from, $to, $unserialized, true );
374
  $data = $ret->data;
375
  $replaced = $replaced || $ret->replaced;
376
  }
377
  elseif ( is_array( $data ) ) {
378
  $_tmp = array( );
379
  foreach ( $data as $key => $value ) {
380
- $ret = $this->png2JpgUnserializeReplace( $from, $to, $value, false );
381
  $_tmp[ $key ] = $ret->data;
382
  $replaced = $replaced || $ret->replaced;
383
  }
@@ -386,7 +396,7 @@ class ShortPixelPng2Jpg {
386
  }
387
  elseif(is_object( $data )) {
388
  foreach(get_object_vars($data) as $key => $value) {
389
- $ret = $this->png2JpgUnserializeReplace( $from, $to, $value, false );
390
  $_tmp[ $key ] = $ret->data;
391
  $replaced = $replaced || $ret->replaced;
392
  }
113
  //backup?
114
  if($backup) {
115
  $imageForBk = trailingslashit(dirname($image)) . ShortPixelAPI::MB_basename($newPath, '.jpg') . '.png';
116
+ WPShortPixel::log("imageForBk should be PNG: $imageForBk");
117
  if($image != $imageForBk) {
118
  WPShortPixel::log("PNG2JPG doConvert rename $image to $imageForBk");
119
  @rename($image, $imageForBk);
131
  }
132
  //unlink($image);
133
  $params['file'] = $newPath;
134
+ WPShortPixel::log("original_file should be PNG: $image");
135
  $params['original_file'] = $image;
136
  $params['url'] = $newUrl;
137
  $params['type'] = 'image/jpeg';
197
  $imagePath = get_attached_file($ID);
198
  $basePath = trailingslashit(str_replace($image, "", $imagePath));
199
  $imageUrl = wp_get_attachment_url($ID);
200
+ $baseUrl = self::removeUrlProtocol(trailingslashit(str_replace($image, "", $imageUrl))); //make the base url protocol agnostic if it's not already
201
 
202
  // set a temporary error in order to make sure user gets something if the image failed from memory limit.
203
  if( isset($meta['ShortPixel']['Retries']) && $meta['ShortPixel']['Retries'] > 3
219
  return $meta; //cannot convert it
220
  }
221
 
222
+ WPShortPixel::log(" CONVERTING MAIN: $imagePath");
223
  $retMain = $this->doConvertPng2Jpg(array('file' => $imagePath, 'url' => false, 'type' => 'image/png'), $this->_settings->backupImages, false, $retC['img']);
224
+ WPShortPixel::log(" CONVERTED MAIN: " . json_encode($retMain));
225
  WPShortPixel::log("PNG2JPG doConvert Main RETURNED " . json_encode($retMain));
226
  $ret = $retMain->params;
227
  $toUnlink = array();
237
  $toUnlink[] = $retMain->unlink;
238
  //convert to the new URLs the urls in the existing posts.
239
  $baseRelPath = trailingslashit(dirname($image));
240
+ $toReplace[self::removeUrlProtocol($imageUrl)] = $baseUrl . $baseRelPath . wp_basename($ret['file']);
 
241
  $pngSize = $ret['png_size'];
242
  $jpgSize = $ret['jpg_size'];
243
+ WPShortPixel::log(" IMAGE PATH: $imagePath");
244
  $imagePath = isset($ret['original_file']) ? $ret['original_file'] : $imagePath;
245
+ WPShortPixel::log(" SET IMAGE PATH: $imagePath");
246
 
247
  //conversion succeeded for the main image, update meta and proceed to thumbs. (It could also not succeed if the converted file is not smaller)
248
  $meta['file'] = str_replace($basePath, '', $ret['file']);
266
  $jpgSize += $rett['jpg_size'];
267
  WPShortPixel::log("PNG2JPG total PNG size: $pngSize total JPG size: $jpgSize");
268
  $originalSizes[$size]['file'] = wp_basename($rett['file'], '.jpg') . '.png';
269
+ WPShortPixel::log("PNG2JPG thumb original: " . $originalSizes[$size]['file']);
270
  $toReplace[$baseUrl . $baseRelPath . $info['file']] = $baseUrl . $baseRelPath . wp_basename($rett['file']);
 
271
  wp_update_attachment_metadata($ID, $meta);
272
  }
273
  }
274
+ WPShortPixel::log("ORIGINAL SIZESSSS: " . json_encode($originalSizes));
275
+ $meta['ShortPixelPng2Jpg'] = array('originalFile' => $imagePath, 'originalSizes' => $originalSizes, 'originalSizes2' => $originalSizes,
276
  'backup' => $this->_settings->backupImages,
277
  'optimizationPercent' => round(100.0 * (1.00 - $jpgSize / $pngSize)));
278
  wp_update_attachment_metadata($ID, $meta);
279
  }
280
 
281
+ self::png2JpgUpdateUrls(array(), $toReplace);
282
  foreach($toUnlink as $unlink) {
283
  if($unlink) {
284
  WPShortPixel::log("PNG2JPG unlink $unlink");
297
  * @param $newurl
298
  * @return array
299
  */
300
+ public static function png2JpgUpdateUrls($options, $map){
301
  global $wpdb;
302
  WPShortPixel::log("PNG2JPG update URLS " . json_encode($map));
303
  $results = array();
322
 
323
  for( $page = 0; $page < $pages; $page++ ) {
324
  $start = $page * $page_size;
325
+ $pmquery = "SELECT * FROM $wpdb->postmeta WHERE meta_value <> '' AND meta_key <> '_wp_attachment_metadata' AND meta_key <> '_wp_attached_file' LIMIT $start, $page_size";
326
  $items = $wpdb->get_results( $pmquery );
327
+ foreach( $items as $item ) {
328
  $value = $item->meta_value;
329
  if( trim($value) == '' )
330
  continue;
332
  $edited = (object)array('data' => $value, 'replaced' => false);
333
  foreach($map as $oldurl => $newurl) {
334
  if (strlen($newurl)) {
335
+ $editedOne = self::png2JpgUnserializeReplace($oldurl, $newurl, $edited->data);
336
  $edited->data = $editedOne->data;
337
  $edited->replaced = $edited->replaced || $editedOne->replaced;
338
  }
358
  return $results;
359
  }
360
 
361
+ public static function removeUrlProtocol($url) {
362
+ return preg_replace("/^http[s]{0,1}:\/\//", "//", $url);
363
+ }
364
+
365
  /**
366
  * taken from Velvet Blues Update URLs plugin
367
  * @param string $from
370
  * @param bool|false $serialised
371
  * @return array|mixed|string
372
  */
373
+ static function png2JpgUnserializeReplace( $from = '', $to = '', $data = '', $serialised = false ) {
374
  $replaced = false;
375
  try {
376
  if ( false !== is_serialized( $data ) ) {
380
  }
381
 
382
  $unserialized = unserialize( $data );
383
+ $ret = self::png2JpgUnserializeReplace( $from, $to, $unserialized, true );
384
  $data = $ret->data;
385
  $replaced = $replaced || $ret->replaced;
386
  }
387
  elseif ( is_array( $data ) ) {
388
  $_tmp = array( );
389
  foreach ( $data as $key => $value ) {
390
+ $ret = self::png2JpgUnserializeReplace( $from, $to, $value, false );
391
  $_tmp[ $key ] = $ret->data;
392
  $replaced = $replaced || $ret->replaced;
393
  }
396
  }
397
  elseif(is_object( $data )) {
398
  foreach(get_object_vars($data) as $key => $value) {
399
+ $ret = self::png2JpgUnserializeReplace( $from, $to, $value, false );
400
  $_tmp[ $key ] = $ret->data;
401
  $replaced = $replaced || $ret->replaced;
402
  }
class/view/shortpixel_view.php CHANGED
@@ -1181,7 +1181,7 @@ class ShortPixelView {
1181
  _e('name:keepbig, path:/ignore_regex/i, size:1000x2000','shortpixel-image-optimiser');?>">
1182
  <?php _e('Exclude certain images from being optimized, based on patterns.','shortpixel-image-optimiser');?>
1183
  <p class="settings-info">
1184
- <?php _e('Add patterns separated by comma. A pattern consists of a <strong>type:value</strong> pair; the accepted types are
1185
  <strong>"name"</strong>, <strong>"path"</strong> and <strong>"size"</strong>.
1186
  A file will be excluded if it matches any of the patterns.
1187
  <br>For a <strong>"name"</strong> pattern only the filename will be matched but for a <strong>"path"</strong>,
@@ -1191,6 +1191,9 @@ class ShortPixelView {
1191
  <br>For the <strong>"size"</strong> type,
1192
  which applies only to Media Library images, <strong>the main images (not thumbnails)</strong> that have the size in the specified range will be excluded.
1193
  The format for the "size" exclude is: <strong>minWidth</strong>-<strong>maxWidth</strong>x<strong>minHeight</strong>-<strong>maxHeight</strong>, for example <strong>size:1000-1100x2000-2200</strong>. You can also specify a precise size, as <strong>1000x2000</strong>.','shortpixel-image-optimiser');?>
 
 
 
1194
  </p>
1195
  </td>
1196
  </tr>
1181
  _e('name:keepbig, path:/ignore_regex/i, size:1000x2000','shortpixel-image-optimiser');?>">
1182
  <?php _e('Exclude certain images from being optimized, based on patterns.','shortpixel-image-optimiser');?>
1183
  <p class="settings-info">
1184
+ <?php _e('Add patterns separated by comma. A pattern consist of a <strong>type:value</strong> pair; the accepted types are
1185
  <strong>"name"</strong>, <strong>"path"</strong> and <strong>"size"</strong>.
1186
  A file will be excluded if it matches any of the patterns.
1187
  <br>For a <strong>"name"</strong> pattern only the filename will be matched but for a <strong>"path"</strong>,
1191
  <br>For the <strong>"size"</strong> type,
1192
  which applies only to Media Library images, <strong>the main images (not thumbnails)</strong> that have the size in the specified range will be excluded.
1193
  The format for the "size" exclude is: <strong>minWidth</strong>-<strong>maxWidth</strong>x<strong>minHeight</strong>-<strong>maxHeight</strong>, for example <strong>size:1000-1100x2000-2200</strong>. You can also specify a precise size, as <strong>1000x2000</strong>.','shortpixel-image-optimiser');?>
1194
+ <a href="http://blog.shortpixel.com/shortpixel-how-to-exclude-images-and-folders-from-optimization/" target="_blank" class="shortpixel-help-link">
1195
+ <span class="dashicons dashicons-editor-help"></span><?php _e('More info','shortpixel-image-optimiser');?>
1196
+ </a>
1197
  </p>
1198
  </td>
1199
  </tr>
class/wp-short-pixel.php CHANGED
@@ -1409,23 +1409,36 @@ class WPShortPixel {
1409
  }
1410
 
1411
  //TODO specific to Media Lib., move accordingly
1412
- protected function doRestore($attachmentID, $meta = null) {
1413
  $file = $origFile = get_attached_file($attachmentID);
1414
- if(!$meta) {
1415
- $meta = wp_get_attachment_metadata($attachmentID);
 
 
 
 
 
1416
  }
 
 
1417
  $pathInfo = pathinfo($file);
1418
- $sizes = isset($meta["sizes"]) ? $meta["sizes"] : array();
1419
 
1420
  //check if the images were converted from PNG
1421
- $png2jpgMain = isset($meta['ShortPixelPng2Jpg']['originalFile']) ? $meta['ShortPixelPng2Jpg']['originalFile'] : false;
1422
- $jpgFile = false; $jpgSizes = array();
1423
- $png2jpgSizes = $png2jpgMain ? $meta['ShortPixelPng2Jpg']['originalSizes'] : array();
1424
  $bkFolder = $this->getBackupFolderAny($file, $sizes);
1425
- if($png2jpgMain) {
1426
- $jpgFile = $file;
1427
- $file = $png2jpgMain;
1428
- $jpgSizes = $sizes;
 
 
 
 
 
 
 
 
1429
  $sizes = $png2jpgSizes;
1430
  }
1431
  $bkFile = trailingslashit($bkFolder) . ShortPixelAPI::MB_basename($file);
@@ -1433,44 +1446,43 @@ class WPShortPixel {
1433
  //first check if the file is readable by the current user - otherwise it will be unaccessible for the web browser
1434
  // - collect the thumbs paths in the process
1435
  $bkCount = 0;
1436
- if(isset($meta["ShortPixel"]['ErrCode'])) {
1437
  $lastStatus = $this->_settings->bulkLastStatus;
1438
- if($lastStatus['ImageID'] == $attachmentID) {
1439
  $this->_settings->bulkLastStatus = null;
1440
  }
1441
- } else {
1442
- if(file_exists($bkFile)) {
1443
- if(!is_readable($bkFile) || (file_exists($file) && !$this->setFilePerms($file)) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1444
  $this->throwNotice('generic-err',
1445
  sprintf(__("File %s cannot be restored due to lack of permissions, please contact your hosting provider to assist you in fixing this.",'shortpixel-image-optimiser'),
1446
- (is_readable($bkFile) ? "" : "$bkFile and ") . "$file"));
1447
  return false;
1448
  }
1449
  $bkCount++;
1450
- $main = true;
1451
- }
1452
- $thumbsPaths = array();
1453
- if($bkFolder && !empty($meta['file']) && count($sizes) ) {
1454
- foreach($sizes as $size => $imageData) {
1455
- $dest = $pathInfo['dirname'] . '/' . $imageData['file'];
1456
- $source = trailingslashit($bkFolder) . $imageData['file'];
1457
- if(!file_exists($source)) continue; // if thumbs were not optimized, then the backups will not be there.
1458
- if(!$this->setFilePerms($source) || (file_exists($dest) && !$this->setFilePerms($dest))) {
1459
- $failedFile = ($this->setFilePerms($bkFile) ? $file : $bkFile);
1460
- $this->throwNotice('generic-err',
1461
- sprintf(__("File %s cannot be restored due to lack of permissions, please contact your hosting provider to assist you in fixing this.",'shortpixel-image-optimiser'),
1462
- "$failedFile (current permissions: " . sprintf("%o", fileperms($failedFile)) . ")"));
1463
- return false;
1464
- }
1465
- $bkCount++;
1466
- $thumbsPaths[$source] = $dest;
1467
- }
1468
- }
1469
- if(!$bkCount) {
1470
- $this->throwNotice('generic-err', __("No backup files found. Restore not performed.",'shortpixel-image-optimiser'));
1471
- return false;
1472
  }
1473
  }
 
 
 
 
1474
  //either backups exist, or it was error so it's normal no backup is present
1475
  try {
1476
  $width = false;
@@ -1494,7 +1506,7 @@ class WPShortPixel {
1494
 
1495
  $duplicates = ShortPixelMetaFacade::getWPMLDuplicates($attachmentID);
1496
  foreach($duplicates as $ID) {
1497
- $crtMeta = $attachmentID == $ID ? $meta : wp_get_attachment_metadata($ID);
1498
  if( isset($crtMeta["ShortPixelImprovement"]) && is_numeric($crtMeta["ShortPixelImprovement"])
1499
  && 0 + $crtMeta["ShortPixelImprovement"] < 5 && $this->_settings->under5Percent > 0) {
1500
  $this->_settings->under5Percent = $this->_settings->under5Percent - 1; // - (isset($crtMeta["ShortPixel"]["thumbsOpt"]) ? $crtMeta["ShortPixel"]["thumbsOpt"] : 0);
@@ -1520,15 +1532,29 @@ class WPShortPixel {
1520
  }
1521
  wp_update_attachment_metadata($ID, $crtMeta);
1522
  }
1523
- unset($meta["ShortPixelImprovement"]);
1524
- unset($meta['ShortPixel']);
1525
- unset($meta['ShortPixelPng2Jpg']);
1526
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1527
  } catch(Exception $e) {
1528
  $this->throwNotice('generic-err', $e->getMessage());
1529
  return false;
1530
  }
1531
- return $meta;
1532
  }
1533
 
1534
  /**
@@ -1552,11 +1578,15 @@ class WPShortPixel {
1552
 
1553
  protected function renameWithRetina($bkFile, $file) {
1554
  @rename($bkFile, $file);
1555
- $ext = pathinfo($file, PATHINFO_EXTENSION);
1556
- @rename(substr($bkFile, 0, strlen($bkFile) - 1 - strlen($ext)) . "@2x." . $ext, substr($file, 0, strlen($file) - 1 - strlen($ext)) . "@2x." . $ext);
1557
 
1558
  }
1559
 
 
 
 
 
 
1560
  public function doCustomRestore($ID) {
1561
  $meta = $this->spMetaDao->getMeta($ID);
1562
  if(!$meta || $meta->getStatus() != 2) return false;
@@ -1915,7 +1945,7 @@ class WPShortPixel {
1915
  $qry_left = "SELECT count(*) FilesLeftToBeProcessed FROM " . $wpdb->prefix . "postmeta
1916
  WHERE meta_key = '_wp_attached_file' AND post_id <= " . (0 + $this->prioQ->getStartBulkId());
1917
  $filesLeft = $wpdb->get_results($qry_left);
1918
-
1919
  //check the custom bulk
1920
  $pendingMeta = $this->_settings->hasCustomFolders ? $this->spMetaDao->getPendingMetaCount() : 0;
1921
 
@@ -2286,6 +2316,12 @@ class WPShortPixel {
2286
  }
2287
  else
2288
  {
 
 
 
 
 
 
2289
  $validityData = $this->getQuotaInformation($_POST['key'], true, isset($_POST['validate']) && $_POST['validate'] == "validate");
2290
 
2291
  $this->_settings->apiKey = $_POST['key'];
@@ -2335,9 +2371,6 @@ class WPShortPixel {
2335
  $this->_settings->resizeType = (isset($_POST['resize_type']) ? $_POST['resize_type']: false);
2336
  $this->_settings->resizeWidth = (isset($_POST['width']) ? $_POST['width']: $this->_settings->resizeWidth);
2337
  $this->_settings->resizeHeight = (isset($_POST['height']) ? $_POST['height']: $this->_settings->resizeHeight);
2338
- $this->_settings->siteAuthUser = (isset($_POST['siteAuthUser']) ? $_POST['siteAuthUser']: $this->_settings->siteAuthUser);
2339
- $this->_settings->siteAuthPass = (isset($_POST['siteAuthPass']) ? $_POST['siteAuthPass']: $this->_settings->siteAuthPass);
2340
-
2341
  $uploadDir = wp_upload_dir();
2342
  $uploadPath = realpath($uploadDir["basedir"]);
2343
 
@@ -2518,11 +2551,12 @@ class WPShortPixel {
2518
  $args['body']['ThumbsCount'] = $imageCount['totalFiles'] - $imageCount['mainFiles'];
2519
  $argsStr .= "&DomainCheck={$args['body']['DomainCheck']}&Info={$args['body']['Info']}&ImagesCount={$imageCount['mainFiles']}&ThumbsCount={$args['body']['ThumbsCount']}";
2520
  }
2521
- if(strlen($this->_settings->siteAuthUser)) {
2522
- $args['body']['url'] = parse_url(get_site_url(),PHP_URL_HOST);
2523
- $args['body']['user'] = $this->_settings->siteAuthUser;
 
2524
  $args['body']['pass'] = urlencode($this->_settings->siteAuthPass);
2525
- $argsStr .= "&url={$args['body']['url']}&user={$args['body']['user']}&pass={$args['body']['pass']}";
2526
  }
2527
 
2528
  $comm = array();
@@ -2767,7 +2801,6 @@ class WPShortPixel {
2767
  . ' (<a href="https://shortpixel.com/image-compression-test?site-url=' . urlencode(ShortPixelMetaFacade::safeGetAttachmentUrl($id)) . '" target="_blank">'
2768
  . __('Test&nbsp;for&nbsp;free','shortpixel-image-optimiser') . '</a>)';
2769
  }
2770
-
2771
  $this->view->renderCustomColumn($id, $renderData, $extended);
2772
  }
2773
  }
1409
  }
1410
 
1411
  //TODO specific to Media Lib., move accordingly
1412
+ protected function doRestore($attachmentID, $rawMeta = null) {
1413
  $file = $origFile = get_attached_file($attachmentID);
1414
+
1415
+ $itemHandler = new ShortPixelMetaFacade($attachmentID);
1416
+ if($rawMeta) {
1417
+ $itemHandler->setRawMeta($rawMeta); //prevent another database trip
1418
+ } else {
1419
+ $itemHandler->getMeta();
1420
+ $rawMeta = $itemHandler->getRawMeta();
1421
  }
1422
+ $toUnlink = $itemHandler->getURLsAndPATHs(true, false, true, array(), true);
1423
+
1424
  $pathInfo = pathinfo($file);
1425
+ $sizes = isset($rawMeta["sizes"]) ? $rawMeta["sizes"] : array();
1426
 
1427
  //check if the images were converted from PNG
1428
+ $png2jpgMain = isset($rawMeta['ShortPixelPng2Jpg']['originalFile']) ? $rawMeta['ShortPixelPng2Jpg']['originalFile'] : false;
 
 
1429
  $bkFolder = $this->getBackupFolderAny($file, $sizes);
1430
+ $toReplace = array();
1431
+ if($png2jpgMain) {
1432
+ $png2jpgSizes = $png2jpgMain ? $rawMeta['ShortPixelPng2Jpg']['originalSizes'] : array();
1433
+ $image = $rawMeta['file'];
1434
+ $imageUrl = wp_get_attachment_url($attachmentID);
1435
+ $baseUrl = ShortPixelPng2Jpg::removeUrlProtocol(trailingslashit(str_replace($image, "", $imageUrl))); //make the base url protocol agnostic if it's not already
1436
+ $baseRelPath = trailingslashit(dirname($image));
1437
+ $toReplace[ShortPixelPng2Jpg::removeUrlProtocol($imageUrl)] = $baseUrl . $baseRelPath . wp_basename($png2jpgMain);
1438
+ foreach($sizes as $key => $size) {
1439
+ $toReplace[$baseUrl . $baseRelPath . $size['file']] = $baseUrl . $baseRelPath . wp_basename($png2jpgSizes[$key]['file']);
1440
+ }
1441
+ $file = $png2jpgMain;
1442
  $sizes = $png2jpgSizes;
1443
  }
1444
  $bkFile = trailingslashit($bkFolder) . ShortPixelAPI::MB_basename($file);
1446
  //first check if the file is readable by the current user - otherwise it will be unaccessible for the web browser
1447
  // - collect the thumbs paths in the process
1448
  $bkCount = 0;
1449
+ if(isset($rawMeta["ShortPixel"]['ErrCode'])) {
1450
  $lastStatus = $this->_settings->bulkLastStatus;
1451
+ if(isset($lastStatus['ImageID']) && $lastStatus['ImageID'] == $attachmentID) {
1452
  $this->_settings->bulkLastStatus = null;
1453
  }
1454
+ }
1455
+ if(file_exists($bkFile)) {
1456
+ if(!is_readable($bkFile) || (file_exists($file) && !$this->setFilePerms($file)) ) {
1457
+ $this->throwNotice('generic-err',
1458
+ sprintf(__("File %s cannot be restored due to lack of permissions, please contact your hosting provider to assist you in fixing this.",'shortpixel-image-optimiser'),
1459
+ (is_readable($bkFile) ? "" : "$bkFile and ") . "$file"));
1460
+ return false;
1461
+ }
1462
+ $bkCount++;
1463
+ $main = true;
1464
+ }
1465
+ $thumbsPaths = array();
1466
+ if($bkFolder && !empty($rawMeta['file']) && count($sizes) ) {
1467
+ foreach($sizes as $size => $imageData) {
1468
+ $dest = $pathInfo['dirname'] . '/' . $imageData['file'];
1469
+ $source = trailingslashit($bkFolder) . $imageData['file'];
1470
+ if(!file_exists($source)) continue; // if thumbs were not optimized, then the backups will not be there.
1471
+ if(!$this->setFilePerms($source) || (file_exists($dest) && !$this->setFilePerms($dest))) {
1472
+ $failedFile = ($this->setFilePerms($bkFile) ? $file : $bkFile);
1473
  $this->throwNotice('generic-err',
1474
  sprintf(__("File %s cannot be restored due to lack of permissions, please contact your hosting provider to assist you in fixing this.",'shortpixel-image-optimiser'),
1475
+ "$failedFile (current permissions: " . sprintf("%o", fileperms($failedFile)) . ")"));
1476
  return false;
1477
  }
1478
  $bkCount++;
1479
+ $thumbsPaths[$source] = $dest;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1480
  }
1481
  }
1482
+ if(!$bkCount) {
1483
+ $this->throwNotice('generic-err', __("No backup files found. Restore not performed.",'shortpixel-image-optimiser'));
1484
+ return false;
1485
+ }
1486
  //either backups exist, or it was error so it's normal no backup is present
1487
  try {
1488
  $width = false;
1506
 
1507
  $duplicates = ShortPixelMetaFacade::getWPMLDuplicates($attachmentID);
1508
  foreach($duplicates as $ID) {
1509
+ $crtMeta = $attachmentID == $ID ? $rawMeta : wp_get_attachment_metadata($ID);
1510
  if( isset($crtMeta["ShortPixelImprovement"]) && is_numeric($crtMeta["ShortPixelImprovement"])
1511
  && 0 + $crtMeta["ShortPixelImprovement"] < 5 && $this->_settings->under5Percent > 0) {
1512
  $this->_settings->under5Percent = $this->_settings->under5Percent - 1; // - (isset($crtMeta["ShortPixel"]["thumbsOpt"]) ? $crtMeta["ShortPixel"]["thumbsOpt"] : 0);
1532
  }
1533
  wp_update_attachment_metadata($ID, $crtMeta);
1534
  }
1535
+ unset($rawMeta["ShortPixelImprovement"]);
1536
+ unset($rawMeta['ShortPixel']);
1537
+ unset($rawMeta['ShortPixelPng2Jpg']);
1538
 
1539
+ if($png2jpgMain) {
1540
+ $spPng2Jpg = new ShortPixelPng2Jpg($this->_settings);
1541
+ $spPng2Jpg->png2JpgUpdateUrls(array(), $toReplace);
1542
+ }
1543
+ if(isset($toUnlink['PATHs'])) foreach($toUnlink['PATHs'] as $unlink) {
1544
+ if($png2jpgMain) {
1545
+ WPShortPixel::log("PNG2JPG unlink $unlink");
1546
+ @unlink($unlink);
1547
+ }
1548
+ //try also the .webp
1549
+ $unlinkWebp = trailingslashit(dirname($unlink)) . wp_basename($unlink, '.' . pathinfo($unlink, PATHINFO_EXTENSION)) . '.webp';
1550
+ WPShortPixel::log("PNG2JPG unlink $unlinkWebp");
1551
+ @unlink($unlinkWebp);
1552
+ }
1553
  } catch(Exception $e) {
1554
  $this->throwNotice('generic-err', $e->getMessage());
1555
  return false;
1556
  }
1557
+ return $rawMeta;
1558
  }
1559
 
1560
  /**
1578
 
1579
  protected function renameWithRetina($bkFile, $file) {
1580
  @rename($bkFile, $file);
1581
+ @rename($this->retinaName($bkFile), $this->retinaName($file));
 
1582
 
1583
  }
1584
 
1585
+ protected function retinaName($file) {
1586
+ $ext = pathinfo($file, PATHINFO_EXTENSION);
1587
+ return substr($file, 0, strlen($file) - 1 - strlen($ext)) . "@2x." . $ext;
1588
+ }
1589
+
1590
  public function doCustomRestore($ID) {
1591
  $meta = $this->spMetaDao->getMeta($ID);
1592
  if(!$meta || $meta->getStatus() != 2) return false;
1945
  $qry_left = "SELECT count(*) FilesLeftToBeProcessed FROM " . $wpdb->prefix . "postmeta
1946
  WHERE meta_key = '_wp_attached_file' AND post_id <= " . (0 + $this->prioQ->getStartBulkId());
1947
  $filesLeft = $wpdb->get_results($qry_left);
1948
+
1949
  //check the custom bulk
1950
  $pendingMeta = $this->_settings->hasCustomFolders ? $this->spMetaDao->getPendingMetaCount() : 0;
1951
 
2316
  }
2317
  else
2318
  {
2319
+ if(isset($_POST['save']) || isset($_POST['saveAdv'])) {
2320
+ //these are needed for the call to api-status, set them first.
2321
+ $this->_settings->siteAuthUser = (isset($_POST['siteAuthUser']) ? $_POST['siteAuthUser'] : $this->_settings->siteAuthUser);
2322
+ $this->_settings->siteAuthPass = (isset($_POST['siteAuthPass']) ? $_POST['siteAuthPass'] : $this->_settings->siteAuthPass);
2323
+ }
2324
+
2325
  $validityData = $this->getQuotaInformation($_POST['key'], true, isset($_POST['validate']) && $_POST['validate'] == "validate");
2326
 
2327
  $this->_settings->apiKey = $_POST['key'];
2371
  $this->_settings->resizeType = (isset($_POST['resize_type']) ? $_POST['resize_type']: false);
2372
  $this->_settings->resizeWidth = (isset($_POST['width']) ? $_POST['width']: $this->_settings->resizeWidth);
2373
  $this->_settings->resizeHeight = (isset($_POST['height']) ? $_POST['height']: $this->_settings->resizeHeight);
 
 
 
2374
  $uploadDir = wp_upload_dir();
2375
  $uploadPath = realpath($uploadDir["basedir"]);
2376
 
2551
  $args['body']['ThumbsCount'] = $imageCount['totalFiles'] - $imageCount['mainFiles'];
2552
  $argsStr .= "&DomainCheck={$args['body']['DomainCheck']}&Info={$args['body']['Info']}&ImagesCount={$imageCount['mainFiles']}&ThumbsCount={$args['body']['ThumbsCount']}";
2553
  }
2554
+ $args['body']['host'] = parse_url(get_site_url(),PHP_URL_HOST);
2555
+ $argsStr .= "&url={$args['body']['host']}";
2556
+ if(strlen($this->_settings->siteAuthUser)) {
2557
+ $args['body']['user'] = $this->_settings->siteAuthUser;
2558
  $args['body']['pass'] = urlencode($this->_settings->siteAuthPass);
2559
+ $argsStr .= "&user={$args['body']['user']}&pass={$args['body']['pass']}";
2560
  }
2561
 
2562
  $comm = array();
2801
  . ' (<a href="https://shortpixel.com/image-compression-test?site-url=' . urlencode(ShortPixelMetaFacade::safeGetAttachmentUrl($id)) . '" target="_blank">'
2802
  . __('Test&nbsp;for&nbsp;free','shortpixel-image-optimiser') . '</a>)';
2803
  }
 
2804
  $this->view->renderCustomColumn($id, $renderData, $extended);
2805
  }
2806
  }
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: compress, image, compression, optimize, image optimizer, image optimiser,
4
  Requires at least: 3.2.0
5
  Tested up to: 4.9
6
  Requires PHP: 5.2
7
- Stable tag: 4.10.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -228,6 +228,15 @@ The ShortPixel team is here to help. <a href="https://shortpixel.com/contact">Co
228
 
229
  == Changelog ==
230
 
 
 
 
 
 
 
 
 
 
231
  = 4.10.3 =
232
  * improvements to context help beacon
233
  * performance improvements to PNG to JPG conversion
4
  Requires at least: 3.2.0
5
  Tested up to: 4.9
6
  Requires PHP: 5.2
7
+ Stable tag: 4.10.4
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
228
 
229
  == Changelog ==
230
 
231
+ = 4.10.4 =
232
+ * replace back the PNG links when restoring a PNG converted to JPG
233
+ * fix incompatibility with Dynamics 365 Integration plugin
234
+ * improve restore capabilities after certain types of PNG to JPG errors which left the media item in an unconsistent state.
235
+ * remove AUTH credentials on server too, if removed in plugin's settings.
236
+ * more performance improvements to PNG 2 JPG conversion
237
+ * fix replacing PNG urls having http:// instead of https:// for a SSL site. (and viceversa)
238
+ * fix string not appearing in translations
239
+
240
  = 4.10.3 =
241
  * improvements to context help beacon
242
  * performance improvements to PNG to JPG conversion
wp-shortpixel.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="options-general.php?page=wp-shortpixel" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
- * Version: 4.10.3
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * Text Domain: shortpixel-image-optimiser
@@ -18,7 +18,7 @@ define('SHORTPIXEL_PLUGIN_FILE', __FILE__);
18
 
19
  //define('SHORTPIXEL_AFFILIATE_CODE', '');
20
 
21
- define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "4.10.3");
22
  define('SHORTPIXEL_MAX_TIMEOUT', 10);
23
  define('SHORTPIXEL_VALIDATE_MAX_TIMEOUT', 15);
24
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
@@ -54,19 +54,19 @@ define('SHORTPIXEL_MAX_EXECUTION_TIME2', 2 );
54
  define("SHORTPIXEL_MAX_RESULTS_QUERY", 30);
55
 
56
  function shortpixelInit() {
57
- global $pluginInstance;
58
  //limit to certain admin pages if function available
59
  $loadOnThisPage = !function_exists('get_current_screen');
60
  if(!$loadOnThisPage) {
61
  $screen = get_current_screen();
62
- if(is_object($screen) && in_array($screen->id, array('upload', 'edit', 'edit-tags', 'post-new', 'post'))) {
63
-
64
  }
65
  }
66
  require_once('class/shortpixel_queue.php');
67
  $prio = ShortPixelQueue::get();
68
  $isAjaxButNotSP = defined( 'DOING_AJAX' ) && DOING_AJAX && !(isset($_REQUEST['action']) && (strpos($_REQUEST['action'], 'shortpixel_') === 0));
69
- if (!isset($pluginInstance)
70
  && ( ($prio && is_array($prio) && count($prio) && get_option('wp-short-pixel-front-bootstrap'))
71
  || is_admin() && !$isAjaxButNotSP
72
  && (function_exists("is_user_logged_in") && is_user_logged_in()) //is admin, is logged in - :) seems funny but it's not, ajax scripts are admin even if no admin is logged in.
@@ -78,47 +78,47 @@ function shortpixelInit() {
78
  )
79
  {
80
  require_once('wp-shortpixel-req.php');
81
- $pluginInstance = new WPShortPixel;
82
  }
83
  }
84
 
85
  function shortPixelHandleImageUploadHook($meta, $ID = null) {
86
- global $pluginInstance;
87
- if(!isset($pluginInstance)) {
88
  require_once('wp-shortpixel-req.php');
89
- $pluginInstance = new WPShortPixel;
90
  }
91
- return $pluginInstance->handleMediaLibraryImageUpload($meta, $ID);
92
  }
93
 
94
  function shortPixelReplaceHook($params) {
95
  if(isset($params['post_id'])) { //integration with EnableMediaReplace - that's an upload for replacing an existing ID
96
- global $pluginInstance;
97
- if (!isset($pluginInstance)) {
98
  require_once('wp-shortpixel-req.php');
99
- $pluginInstance = new WPShortPixel;
100
  }
101
- $itemHandler = $pluginInstance->onDeleteImage($params['post_id']);
102
  $itemHandler->deleteAllSPMeta();
103
  }
104
  }
105
 
106
  function shortPixelPng2JpgHook($params) {
107
- global $pluginInstance;
108
- if(!isset($pluginInstance)) {
109
  require_once('wp-shortpixel-req.php');
110
- $pluginInstance = new WPShortPixel;
111
  }
112
- return $pluginInstance->convertPng2Jpg($params);
113
  }
114
 
115
  function shortPixelNggAdd($image) {
116
- global $pluginInstance;
117
- if(!isset($pluginInstance)) {
118
  require_once('wp-shortpixel-req.php');
119
- $pluginInstance = new WPShortPixel;
120
  }
121
- $pluginInstance->handleNextGenImageUpload($image);
122
  }
123
 
124
  function shortPixelActivatePlugin () {
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="options-general.php?page=wp-shortpixel" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
+ * Version: 4.10.4
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * Text Domain: shortpixel-image-optimiser
18
 
19
  //define('SHORTPIXEL_AFFILIATE_CODE', '');
20
 
21
+ define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "4.10.4");
22
  define('SHORTPIXEL_MAX_TIMEOUT', 10);
23
  define('SHORTPIXEL_VALIDATE_MAX_TIMEOUT', 15);
24
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
54
  define("SHORTPIXEL_MAX_RESULTS_QUERY", 30);
55
 
56
  function shortpixelInit() {
57
+ global $shortPixelPluginInstance;
58
  //limit to certain admin pages if function available
59
  $loadOnThisPage = !function_exists('get_current_screen');
60
  if(!$loadOnThisPage) {
61
  $screen = get_current_screen();
62
+ if(is_object($screen) && !in_array($screen->id, array('upload', 'edit', 'edit-tags', 'post-new', 'post'))) {
63
+ return;
64
  }
65
  }
66
  require_once('class/shortpixel_queue.php');
67
  $prio = ShortPixelQueue::get();
68
  $isAjaxButNotSP = defined( 'DOING_AJAX' ) && DOING_AJAX && !(isset($_REQUEST['action']) && (strpos($_REQUEST['action'], 'shortpixel_') === 0));
69
+ if (!isset($shortPixelPluginInstance)
70
  && ( ($prio && is_array($prio) && count($prio) && get_option('wp-short-pixel-front-bootstrap'))
71
  || is_admin() && !$isAjaxButNotSP
72
  && (function_exists("is_user_logged_in") && is_user_logged_in()) //is admin, is logged in - :) seems funny but it's not, ajax scripts are admin even if no admin is logged in.
78
  )
79
  {
80
  require_once('wp-shortpixel-req.php');
81
+ $shortPixelPluginInstance = new WPShortPixel;
82
  }
83
  }
84
 
85
  function shortPixelHandleImageUploadHook($meta, $ID = null) {
86
+ global $shortPixelPluginInstance;
87
+ if(!isset($shortPixelPluginInstance)) {
88
  require_once('wp-shortpixel-req.php');
89
+ $shortPixelPluginInstance = new WPShortPixel;
90
  }
91
+ return $shortPixelPluginInstance->handleMediaLibraryImageUpload($meta, $ID);
92
  }
93
 
94
  function shortPixelReplaceHook($params) {
95
  if(isset($params['post_id'])) { //integration with EnableMediaReplace - that's an upload for replacing an existing ID
96
+ global $shortPixelPluginInstance;
97
+ if (!isset($shortPixelPluginInstance)) {
98
  require_once('wp-shortpixel-req.php');
99
+ $shortPixelPluginInstance = new WPShortPixel;
100
  }
101
+ $itemHandler = $shortPixelPluginInstance->onDeleteImage($params['post_id']);
102
  $itemHandler->deleteAllSPMeta();
103
  }
104
  }
105
 
106
  function shortPixelPng2JpgHook($params) {
107
+ global $shortPixelPluginInstance;
108
+ if(!isset($shortPixelPluginInstance)) {
109
  require_once('wp-shortpixel-req.php');
110
+ $shortPixelPluginInstance = new WPShortPixel;
111
  }
112
+ return $shortPixelPluginInstance->convertPng2Jpg($params);
113
  }
114
 
115
  function shortPixelNggAdd($image) {
116
+ global $shortPixelPluginInstance;
117
+ if(!isset($shortPixelPluginInstance)) {
118
  require_once('wp-shortpixel-req.php');
119
+ $shortPixelPluginInstance = new WPShortPixel;
120
  }
121
+ $shortPixelPluginInstance->handleNextGenImageUpload($image);
122
  }
123
 
124
  function shortPixelActivatePlugin () {