ShortPixel Image Optimizer - Version 3.3.8

Version Description

  • Handle malformed image metadata.
  • Go directly to settings after activating if the API Key is not set up.
Download this release

Release Info

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

Code changes from version 3.3.7 to 3.3.8

readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: image optimizer, image optimization, compress pdf, compress jpeg, compress
5
 
6
  Requires at least: 3.2.0
7
  Tested up to: 4.6
8
- Stable tag: 3.3.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -193,6 +193,11 @@ The ShortPixel team is here to help. <a href="https://shortpixel.com/contact">Co
193
 
194
  == Changelog ==
195
 
 
 
 
 
 
196
  = 3.3.7 =
197
 
198
  * Solve CSS compatibility issue with WPEstate
5
 
6
  Requires at least: 3.2.0
7
  Tested up to: 4.6
8
+ Stable tag: 3.3.8
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
193
 
194
  == Changelog ==
195
 
196
+ = 3.3.8 =
197
+
198
+ * Handle malformed image metadata.
199
+ * Go directly to settings after activating if the API Key is not set up.
200
+
201
  = 3.3.7 =
202
 
203
  * Solve CSS compatibility issue with WPEstate
shortpixel_api.php CHANGED
@@ -405,7 +405,7 @@ class ShortPixelAPI {
405
  $meta['ShortPixel']['thumbsOpt'] = (isset($meta['ShortPixel']['thumbsTodo']) || $this->_settings->processThumbnails) && isset($meta['sizes']) ? count($meta['sizes']) : 0;
406
  //if thumbsTodo - this means there was an explicit request to process thumbs for an image that was previously processed without
407
  // don't update the ShortPixelImprovement ratio as this is only calculated based on main image
408
- if(isset($meta['ShortPixel']['thumbsTodo'])) {
409
  unset($meta['ShortPixel']['thumbsTodo']);
410
  $percentImprovement = $meta['ShortPixelImprovement'];
411
  } else {
405
  $meta['ShortPixel']['thumbsOpt'] = (isset($meta['ShortPixel']['thumbsTodo']) || $this->_settings->processThumbnails) && isset($meta['sizes']) ? count($meta['sizes']) : 0;
406
  //if thumbsTodo - this means there was an explicit request to process thumbs for an image that was previously processed without
407
  // don't update the ShortPixelImprovement ratio as this is only calculated based on main image
408
+ if(isset($meta['ShortPixel']['thumbsTodo']) && is_numeric($meta['ShortPixelImprovement'])) {
409
  unset($meta['ShortPixel']['thumbsTodo']);
410
  $percentImprovement = $meta['ShortPixelImprovement'];
411
  } else {
shortpixel_view.php CHANGED
@@ -126,7 +126,7 @@ class ShortPixelView {
126
  <div class="bulk-text-container">
127
  <h3>What are Thumbnails?</h3>
128
  <p>Thumbnails are smaller images generated by your WP theme. Most themes generate between 3 and 6 thumbnails for each Media Library image.</p>
129
- <p>The thumbnails also generate trafic on your website pages and they influence your website's speed.</p>
130
  <p>It's highly recommended that you include thumbnails in the optimization as well.</p>
131
  </div>
132
  <div class="bulk-text-container" style="padding-right:0">
@@ -470,7 +470,7 @@ class ShortPixelView {
470
  <th scope="row"><label for="backupImages">Image backup</label></th>
471
  <td>
472
  <input name="backupImages" type="checkbox" id="backupImages" <?php echo( $checkedBackupImages );?>> Save and keep a backup of your original images in a separate folder.
473
- <p class="settings-info">Usually recommended for safety.</p>
474
  </td>
475
  </tr>
476
  <tr>
126
  <div class="bulk-text-container">
127
  <h3>What are Thumbnails?</h3>
128
  <p>Thumbnails are smaller images generated by your WP theme. Most themes generate between 3 and 6 thumbnails for each Media Library image.</p>
129
+ <p>The thumbnails also generate traffic on your website pages and they influence your website's speed.</p>
130
  <p>It's highly recommended that you include thumbnails in the optimization as well.</p>
131
  </div>
132
  <div class="bulk-text-container" style="padding-right:0">
470
  <th scope="row"><label for="backupImages">Image backup</label></th>
471
  <td>
472
  <input name="backupImages" type="checkbox" id="backupImages" <?php echo( $checkedBackupImages );?>> Save and keep a backup of your original images in a separate folder.
473
+ <p class="settings-info">You need to have backup active in order to be able to restore images to originals or to convert from Lossy to Lossless and back.</p>
474
  </td>
475
  </tr>
476
  <tr>
wp-shortpixel-settings.php CHANGED
@@ -39,6 +39,7 @@ class WPShortPixelSettings {
39
  'siteAuthUser' => 'wp-short-pixel-site-auth-user',
40
  'siteAuthPass' => 'wp-short-pixel-site-auth-pass',
41
  'prioritySkip' => 'wp-short-pixel-prioritySkip',
 
42
  '' => '',
43
  );
44
 
@@ -95,6 +96,7 @@ class WPShortPixelSettings {
95
  delete_option( 'wp-short-pixel-resize-width');
96
  delete_option( 'wp-short-pixel-resize-height');
97
  delete_option( 'wp-short-pixel-dismissed-notices');
 
98
  if(isset($_SESSION["wp-short-pixel-priorityQueue"])) {
99
  unset($_SESSION["wp-short-pixel-priorityQueue"]);
100
  }
39
  'siteAuthUser' => 'wp-short-pixel-site-auth-user',
40
  'siteAuthPass' => 'wp-short-pixel-site-auth-pass',
41
  'prioritySkip' => 'wp-short-pixel-prioritySkip',
42
+ 'redirectedSettings' => 'wp-short-pixel-redirected-settings',
43
  '' => '',
44
  );
45
 
96
  delete_option( 'wp-short-pixel-resize-width');
97
  delete_option( 'wp-short-pixel-resize-height');
98
  delete_option( 'wp-short-pixel-dismissed-notices');
99
+ delete_option( 'wp-short-pixel-redirected-settings');
100
  if(isset($_SESSION["wp-short-pixel-priorityQueue"])) {
101
  unset($_SESSION["wp-short-pixel-priorityQueue"]);
102
  }
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: 3.3.7
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  */
@@ -14,15 +14,17 @@ require_once('shortpixel_queue.php');
14
  require_once('shortpixel_view.php');
15
  require_once( ABSPATH . 'wp-admin/includes/image.php' );
16
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
17
- if ( !is_plugin_active( 'wpmandrill/wpmandrill.php' ) && !is_plugin_active( 'wp-ses/wp-ses.php' ) ) {
 
18
  require_once( ABSPATH . 'wp-includes/pluggable.php' );//to avoid conflict with wpmandrill plugin
19
  }
 
20
 
21
  define('SP_RESET_ON_ACTIVATE', false); //if true TODO set false
22
 
23
  define('SP_AFFILIATE_CODE', '');
24
 
25
- define('PLUGIN_VERSION', "3.3.7");
26
  define('SP_MAX_TIMEOUT', 10);
27
  define('SP_VALIDATE_MAX_TIMEOUT', 15);
28
  define('SP_BACKUP', 'ShortpixelBackups');
@@ -116,6 +118,12 @@ class WPShortPixel {
116
  add_action('admin_notices', array( &$this, 'displayAdminNotices'));
117
 
118
  $this->migrateBackupFolder();
 
 
 
 
 
 
119
  }
120
 
121
  //handling older
@@ -153,7 +161,7 @@ class WPShortPixel {
153
  $dismissed = $this->_settings->getOpt( 'wp-short-pixel-dismissed-notices', array());
154
  $now = time();
155
  $act = $this->_settings->getOpt( 'wp-short-pixel-activation-date', $now);
156
- if($this->_settings->getOpt( 'wp-short-pixel-activation-notice', false)) {
157
  ShortPixelView::displayActivationNotice();
158
  delete_option('wp-short-pixel-activation-notice');
159
  }
@@ -219,7 +227,7 @@ class WPShortPixel {
219
  STATUS_NO_KEY: <?php echo ShortPixelAPI::STATUS_NO_KEY; ?>,
220
  STATUS_RETRY: <?php echo ShortPixelAPI::STATUS_RETRY; ?>,
221
  WP_PLUGIN_URL: '<?php echo plugins_url( '', __FILE__ ); ?>',
222
- WP_ADMIN_URL: '<?php echo admin_url(); ?>',
223
  API_KEY: "<?php echo $this->_settings->apiKey; ?>",
224
  MEDIA_ALERT: '<?php echo $this->_settings->mediaAlert ? "done" : "todo"; ?>'
225
  });
@@ -606,6 +614,9 @@ class WPShortPixel {
606
  $URLsAndPATHs = $this->getURLsAndPATHs($ID, NULL, $onlyThumbs);
607
  $this->_apiInterface->doRequests($URLsAndPATHs['URLs'], false, $ID, $compressionType === false ? $this->_settings->compressionType : $compressionType);//send a request, do NOT wait for response
608
  $meta = wp_get_attachment_metadata($ID);
 
 
 
609
  $meta['ShortPixel']['WaitingProcessing'] = true;
610
  wp_update_attachment_metadata($ID, $meta);
611
  return $URLsAndPATHs;
@@ -679,9 +690,11 @@ class WPShortPixel {
679
  $thumbsPaths = array();
680
  if( !empty($meta['file']) && is_array($meta["sizes"]) ) {
681
  foreach($meta["sizes"] as $size => $imageData) {
682
- $source = $bkFolder . $imageData['file'];
683
- $thumbsPaths[$source] = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $imageData['file'];
684
- if(! $this->setFilePerms($source)) return false;
 
 
685
  }
686
  }
687
 
@@ -796,7 +809,9 @@ class WPShortPixel {
796
  //remove thumbs thumbnails
797
  if(isset($meta["sizes"])) {
798
  foreach($meta["sizes"] as $size => $imageData) {
799
- @unlink($filesPath . ShortPixelAPI::MB_basename($imageData['file']));//remove thumbs
 
 
800
  }
801
  }
802
  }
@@ -969,6 +984,8 @@ class WPShortPixel {
969
  $noticeHTML = "";
970
  $notice = null;
971
 
 
 
972
  //by default we try to fetch the API Key from wp-config.php (if defined)
973
  if ( defined("SHORTPIXEL_API_KEY") && strlen(SHORTPIXEL_API_KEY) == 20)
974
  {
@@ -1387,11 +1404,12 @@ class WPShortPixel {
1387
  && ($this->_settings->processThumbnails || $onlyThumbs)
1388
  && isset($meta['sizes']) && is_array($meta['sizes']))
1389
  {
1390
- foreach( $meta['sizes'] as $thumbnailInfo )
1391
- {
1392
  $urlList[] = str_replace(ShortPixelAPI::MB_basename($urlList[0]), $thumbnailInfo['file'], $url);
1393
  $filePath[] = str_replace(ShortPixelAPI::MB_basename($filePath[0]), $thumbnailInfo['file'], $path);
1394
- }
 
1395
  }
1396
  if(!isset($meta['sizes']) || !is_array($meta['sizes'])) {
1397
  self::log("getURLsAndPATHs: no meta sizes for ID $ID : " . json_encode($meta));
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: 3.3.8
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  */
14
  require_once('shortpixel_view.php');
15
  require_once( ABSPATH . 'wp-admin/includes/image.php' );
16
  include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
17
+
18
+ /*if ( !is_plugin_active( 'wpmandrill/wpmandrill.php' ) && !is_plugin_active( 'wp-ses/wp-ses.php' ) ) {
19
  require_once( ABSPATH . 'wp-includes/pluggable.php' );//to avoid conflict with wpmandrill plugin
20
  }
21
+ */
22
 
23
  define('SP_RESET_ON_ACTIVATE', false); //if true TODO set false
24
 
25
  define('SP_AFFILIATE_CODE', '');
26
 
27
+ define('PLUGIN_VERSION', "3.3.8");
28
  define('SP_MAX_TIMEOUT', 10);
29
  define('SP_VALIDATE_MAX_TIMEOUT', 15);
30
  define('SP_BACKUP', 'ShortpixelBackups');
118
  add_action('admin_notices', array( &$this, 'displayAdminNotices'));
119
 
120
  $this->migrateBackupFolder();
121
+
122
+ if(!$this->_settings->redirectedSettings && !$this->_settings->verifiedKey && (!function_exists("is_multisite") || !is_multisite())) {
123
+ $this->_settings->redirectedSettings = 1;
124
+ wp_redirect(admin_url("options-general.php?page=wp-shortpixel"));
125
+ exit();
126
+ }
127
  }
128
 
129
  //handling older
161
  $dismissed = $this->_settings->getOpt( 'wp-short-pixel-dismissed-notices', array());
162
  $now = time();
163
  $act = $this->_settings->getOpt( 'wp-short-pixel-activation-date', $now);
164
+ if($this->_settings->getOpt( 'wp-short-pixel-activation-notice', false) && $this->_settings->redirectedSettings >= 2) {
165
  ShortPixelView::displayActivationNotice();
166
  delete_option('wp-short-pixel-activation-notice');
167
  }
227
  STATUS_NO_KEY: <?php echo ShortPixelAPI::STATUS_NO_KEY; ?>,
228
  STATUS_RETRY: <?php echo ShortPixelAPI::STATUS_RETRY; ?>,
229
  WP_PLUGIN_URL: '<?php echo plugins_url( '', __FILE__ ); ?>',
230
+ WP_ADMIN_URL: '<?php echo strtolower(admin_url()); ?>',
231
  API_KEY: "<?php echo $this->_settings->apiKey; ?>",
232
  MEDIA_ALERT: '<?php echo $this->_settings->mediaAlert ? "done" : "todo"; ?>'
233
  });
614
  $URLsAndPATHs = $this->getURLsAndPATHs($ID, NULL, $onlyThumbs);
615
  $this->_apiInterface->doRequests($URLsAndPATHs['URLs'], false, $ID, $compressionType === false ? $this->_settings->compressionType : $compressionType);//send a request, do NOT wait for response
616
  $meta = wp_get_attachment_metadata($ID);
617
+ if(!is_array($meta)) {
618
+ $meta = array("previous_meta" => $meta, 'ShortPixel' => array());
619
+ }
620
  $meta['ShortPixel']['WaitingProcessing'] = true;
621
  wp_update_attachment_metadata($ID, $meta);
622
  return $URLsAndPATHs;
690
  $thumbsPaths = array();
691
  if( !empty($meta['file']) && is_array($meta["sizes"]) ) {
692
  foreach($meta["sizes"] as $size => $imageData) {
693
+ if(isset($imageData['file'])) {
694
+ $source = $bkFolder . $imageData['file'];
695
+ $thumbsPaths[$source] = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $imageData['file'];
696
+ if(! $this->setFilePerms($source)) return false;
697
+ }
698
  }
699
  }
700
 
809
  //remove thumbs thumbnails
810
  if(isset($meta["sizes"])) {
811
  foreach($meta["sizes"] as $size => $imageData) {
812
+ if(isset($imageData['file'])) {
813
+ @unlink($filesPath . ShortPixelAPI::MB_basename($imageData['file']));//remove thumbs
814
+ }
815
  }
816
  }
817
  }
984
  $noticeHTML = "";
985
  $notice = null;
986
 
987
+ $this->_settings->redirectedSettings = 2;
988
+
989
  //by default we try to fetch the API Key from wp-config.php (if defined)
990
  if ( defined("SHORTPIXEL_API_KEY") && strlen(SHORTPIXEL_API_KEY) == 20)
991
  {
1404
  && ($this->_settings->processThumbnails || $onlyThumbs)
1405
  && isset($meta['sizes']) && is_array($meta['sizes']))
1406
  {
1407
+ foreach( $meta['sizes'] as $thumbnailInfo ) {
1408
+ if(isset($thumbnailInfo['file'])) {
1409
  $urlList[] = str_replace(ShortPixelAPI::MB_basename($urlList[0]), $thumbnailInfo['file'], $url);
1410
  $filePath[] = str_replace(ShortPixelAPI::MB_basename($filePath[0]), $thumbnailInfo['file'], $path);
1411
+ }
1412
+ }
1413
  }
1414
  if(!isset($meta['sizes']) || !is_array($meta['sizes'])) {
1415
  self::log("getURLsAndPATHs: no meta sizes for ID $ID : " . json_encode($meta));