ShortPixel Image Optimizer - Version 4.1.4

Version Description

  • fix path problems on multisite on Windows
Download this release

Release Info

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

Code changes from version 4.1.3 to 4.1.4

class/db/shortpixel-custom-meta-dao.php CHANGED
@@ -278,7 +278,7 @@ class ShortPixelCustomMetaDao {
278
  $values = ''; $inserted = 0;
279
  $sql = "INSERT IGNORE INTO {$this->db->getPrefix()}shortpixel_meta(folder_id, path, name, path_md5, status) VALUES ";
280
  for ($i = 0; ($path = fgets($pathsFileHandle)) !== false; $i++) {
281
- $pathParts = explode(DIRECTORY_SEPARATOR, trim($path));
282
  $namePrep = $this->db->prepare("%s",$pathParts[count($pathParts) - 1]);
283
  $values .= (strlen($values) ? ", ": "") . "(" . $folderId . ", ". $this->db->prepare("%s", trim($path)) . ", ". $namePrep .", '". md5($path) ."', 0)";
284
  if($i % 1000 == 999) {
278
  $values = ''; $inserted = 0;
279
  $sql = "INSERT IGNORE INTO {$this->db->getPrefix()}shortpixel_meta(folder_id, path, name, path_md5, status) VALUES ";
280
  for ($i = 0; ($path = fgets($pathsFileHandle)) !== false; $i++) {
281
+ $pathParts = explode('/', trim($path));
282
  $namePrep = $this->db->prepare("%s",$pathParts[count($pathParts) - 1]);
283
  $values .= (strlen($values) ? ", ": "") . "(" . $folderId . ", ". $this->db->prepare("%s", trim($path)) . ", ". $namePrep .", '". md5($path) ."', 0)";
284
  if($i % 1000 == 999) {
class/db/shortpixel-meta-facade.php CHANGED
@@ -261,9 +261,9 @@ class ShortPixelMetaFacade {
261
 
262
  public static function pathToRootRelative($path) {
263
  //$upl = wp_upload_dir();
264
- $pathParts = explode(DIRECTORY_SEPARATOR, $path);
265
  unset($pathParts[count($pathParts) - 1]);
266
- $path = implode(DIRECTORY_SEPARATOR, $pathParts);
267
  return str_replace(get_home_path(), "", $path);
268
  }
269
 
@@ -334,9 +334,9 @@ class ShortPixelMetaFacade {
334
  } else {
335
  $path = (substr($file, 1));
336
  }
337
- $pathArr = explode(DIRECTORY_SEPARATOR, $path);
338
  unset($pathArr[count($pathArr) - 1]);
339
- return implode(DIRECTORY_SEPARATOR, $pathArr) . DIRECTORY_SEPARATOR;
340
  }
341
 
342
  public static function isMediaSubfolder($path) {
@@ -349,7 +349,7 @@ class ShortPixelMetaFacade {
349
  }
350
  //contains one of the year subfolders of the media library
351
  if(strpos($path, $uploadPath) == 0) {
352
- $pathArr = explode(DIRECTORY_SEPARATOR, str_replace($uploadBase . DIRECTORY_SEPARATOR, "", $path));
353
  if( count($pathArr) >= 1
354
  && is_numeric($pathArr[0]) && $pathArr[0] > 1900 && $pathArr[0] < 2100 //contains the year subfolder
355
  && ( count($pathArr) == 1 //if there is another subfolder then it's the month subfolder
261
 
262
  public static function pathToRootRelative($path) {
263
  //$upl = wp_upload_dir();
264
+ $pathParts = explode('/', $path);
265
  unset($pathParts[count($pathParts) - 1]);
266
+ $path = implode('/', $pathParts);
267
  return str_replace(get_home_path(), "", $path);
268
  }
269
 
334
  } else {
335
  $path = (substr($file, 1));
336
  }
337
+ $pathArr = explode('/', $path);
338
  unset($pathArr[count($pathArr) - 1]);
339
+ return implode('/', $pathArr) . '/';
340
  }
341
 
342
  public static function isMediaSubfolder($path) {
349
  }
350
  //contains one of the year subfolders of the media library
351
  if(strpos($path, $uploadPath) == 0) {
352
+ $pathArr = explode('/', str_replace($uploadBase . '/', "", $path));
353
  if( count($pathArr) >= 1
354
  && is_numeric($pathArr[0]) && $pathArr[0] > 1900 && $pathArr[0] < 2100 //contains the year subfolder
355
  && ( count($pathArr) == 1 //if there is another subfolder then it's the month subfolder
class/db/shortpixel-nextgen-adapter.php CHANGED
@@ -31,7 +31,7 @@ class ShortPixelNextGenAdapter {
31
  }
32
 
33
  public static function pathToAbsolute($item) {
34
- return str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, get_home_path() . $item);
35
  }
36
 
37
  public static function path($item) {
31
  }
32
 
33
  public static function pathToAbsolute($item) {
34
+ return str_replace('//', '/', get_home_path() . $item);
35
  }
36
 
37
  public static function path($item) {
class/model/shortpixel-folder.php CHANGED
@@ -18,8 +18,8 @@ class ShortPixelFolder extends ShortPixelEntity{
18
  }
19
 
20
  public static function checkFolder($folder, $base) {
21
- if(substr($folder, 0, 1) !== DIRECTORY_SEPARATOR) {
22
- $folder = DIRECTORY_SEPARATOR . $folder;
23
  }
24
  if(is_dir($folder)) {
25
  return realpath($folder);
@@ -40,7 +40,7 @@ class ShortPixelFolder extends ShortPixelEntity{
40
  $parents = array($parents);
41
  }
42
  foreach($parents as $parent) {
43
- if(strpos($folder, $parent) === 0 && (strlen($parent) == strlen($folder) || substr($folder, strlen($parent), 1) == DIRECTORY_SEPARATOR)) {
44
  return $parent;
45
  }
46
  }
@@ -58,7 +58,7 @@ class ShortPixelFolder extends ShortPixelEntity{
58
  $subfolders[] = $subfolders;
59
  }
60
  foreach($subfolders as $sub) {
61
- if(strpos($sub, $folder) === 0 && (strlen($folder) == strlen($sub) || substr($sub, strlen($folder) - 1, 1) == DIRECTORY_SEPARATOR)) {
62
  return $sub;
63
  }
64
  }
@@ -77,7 +77,7 @@ class ShortPixelFolder extends ShortPixelEntity{
77
  }
78
  $files = scandir($path);
79
  foreach($files as $t) {
80
- $tpath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $t;
81
  if(in_array($t, $ignore)) continue;
82
  if (is_dir($tpath)) {
83
  $size += $this->countFiles($tpath);
@@ -90,7 +90,7 @@ class ShortPixelFolder extends ShortPixelEntity{
90
 
91
  public function getFileList($onlyNewerThan = 0) {
92
  $upl = wp_upload_dir();
93
- $fileListPath = tempnam($upl["basedir"] . DIRECTORY_SEPARATOR, 'sp_');
94
  $fileHandle = fopen($fileListPath, 'w+');
95
  self::getFileListRecursive($this->getPath(), $fileHandle, $onlyNewerThan);
96
  fclose($fileHandle);
@@ -108,7 +108,7 @@ class ShortPixelFolder extends ShortPixelEntity{
108
  */
109
  foreach($files as $t) {
110
  if(in_array($t, $ignore)) continue;
111
- $tpath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $t;
112
  if (is_dir($tpath)) {
113
  self::getFileListRecursive($tpath, $fileHandle, $onlyNewerThan);
114
  } elseif($add && in_array(pathinfo($t, PATHINFO_EXTENSION), WPShortPixel::$PROCESSABLE_EXTENSIONS)) {
@@ -130,7 +130,7 @@ class ShortPixelFolder extends ShortPixelEntity{
130
  $mtime = max($mtime, filemtime($path));
131
  foreach($files as $t) {
132
  if(in_array($t, $ignore)) continue;
133
- $tpath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $t;
134
  if (is_dir($tpath)) {
135
  $mtime = max($mtime, filemtime($tpath));
136
  self::getFolderContentsChangeDateRecursive($tpath, $mtime, $refMtime);
18
  }
19
 
20
  public static function checkFolder($folder, $base) {
21
+ if(substr($folder, 0, 1) !== '/') {
22
+ $folder = '/' . $folder;
23
  }
24
  if(is_dir($folder)) {
25
  return realpath($folder);
40
  $parents = array($parents);
41
  }
42
  foreach($parents as $parent) {
43
+ if(strpos($folder, $parent) === 0 && (strlen($parent) == strlen($folder) || substr($folder, strlen($parent), 1) == '/')) {
44
  return $parent;
45
  }
46
  }
58
  $subfolders[] = $subfolders;
59
  }
60
  foreach($subfolders as $sub) {
61
+ if(strpos($sub, $folder) === 0 && (strlen($folder) == strlen($sub) || substr($sub, strlen($folder) - 1, 1) == '/')) {
62
  return $sub;
63
  }
64
  }
77
  }
78
  $files = scandir($path);
79
  foreach($files as $t) {
80
+ $tpath = rtrim($path, '/') . '/' . $t;
81
  if(in_array($t, $ignore)) continue;
82
  if (is_dir($tpath)) {
83
  $size += $this->countFiles($tpath);
90
 
91
  public function getFileList($onlyNewerThan = 0) {
92
  $upl = wp_upload_dir();
93
+ $fileListPath = tempnam($upl["basedir"] . '/', 'sp_');
94
  $fileHandle = fopen($fileListPath, 'w+');
95
  self::getFileListRecursive($this->getPath(), $fileHandle, $onlyNewerThan);
96
  fclose($fileHandle);
108
  */
109
  foreach($files as $t) {
110
  if(in_array($t, $ignore)) continue;
111
+ $tpath = rtrim($path, '/') . '/' . $t;
112
  if (is_dir($tpath)) {
113
  self::getFileListRecursive($tpath, $fileHandle, $onlyNewerThan);
114
  } elseif($add && in_array(pathinfo($t, PATHINFO_EXTENSION), WPShortPixel::$PROCESSABLE_EXTENSIONS)) {
130
  $mtime = max($mtime, filemtime($path));
131
  foreach($files as $t) {
132
  if(in_array($t, $ignore)) continue;
133
+ $tpath = rtrim($path, '/') . '/' . $t;
134
  if (is_dir($tpath)) {
135
  $mtime = max($mtime, filemtime($tpath));
136
  self::getFolderContentsChangeDateRecursive($tpath, $mtime, $refMtime);
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: 4.1.3
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -62,8 +62,7 @@ Check out <a rel="friend" href="https://shortpixel.com/pricing" target="_blank">
62
  > ★★★★★ **The secret sauce for a WordPress website.** [mark1mark](https://wordpress.org/support/topic/the-secret-sauce-for-a-wordpress-website/)
63
  > ★★★★★ **A must have plugin, great support!** [ElColo13](https://wordpress.org/support/topic/a-must-have-plugin-great-support/)
64
  > ★★★★★ **Excellent Plugin! Even Better Customer Service!** [scaliendo](https://wordpress.org/support/topic/great-plugin-great-support-508/)
65
- > ★★★★★ **Great image compression, solid plugin, equally great support.** [matters1959](https://wordpress.org/support/topic/support-shortpixel-image-optimizer/)
66
- >
67
  > [more testimonials](https://wordpress.org/support/plugin/shortpixel-image-optimiser/reviews/?filter=5)
68
 
69
 
@@ -179,6 +178,10 @@ The ShortPixel team is here to help. <a href="https://shortpixel.com/contact">Co
179
 
180
  == Changelog ==
181
 
 
 
 
 
182
  = 4.1.3 =
183
 
184
  * fix debug mode too intrusive
5
 
6
  Requires at least: 3.2.0
7
  Tested up to: 4.6
8
+ Stable tag: 4.1.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
62
  > ★★★★★ **The secret sauce for a WordPress website.** [mark1mark](https://wordpress.org/support/topic/the-secret-sauce-for-a-wordpress-website/)
63
  > ★★★★★ **A must have plugin, great support!** [ElColo13](https://wordpress.org/support/topic/a-must-have-plugin-great-support/)
64
  > ★★★★★ **Excellent Plugin! Even Better Customer Service!** [scaliendo](https://wordpress.org/support/topic/great-plugin-great-support-508/)
65
+ > ★★★★★ **Great image compression, solid plugin, equally great support.** [matters1959](https://wordpress.org/support/topic/support-shortpixel-image-optimizer/)
 
66
  > [more testimonials](https://wordpress.org/support/plugin/shortpixel-image-optimiser/reviews/?filter=5)
67
 
68
 
178
 
179
  == Changelog ==
180
 
181
+ = 4.1.4 =
182
+
183
+ * fix path problems on multisite on Windows
184
+
185
  = 4.1.3 =
186
 
187
  * fix debug mode too intrusive
shortpixel_api.php CHANGED
@@ -233,7 +233,7 @@ class ShortPixelAPI {
233
  if($meta->getRetries() >= MAX_FAIL_RETRIES) {
234
  $meta->setStatus($APIresponse[0]->Status->Code);
235
  $meta->setMessage($APIresponse[0]->Status->Message);
236
- $itemHandler->updateMeta();
237
  }
238
  return $err;
239
  }
@@ -396,7 +396,7 @@ class ShortPixelAPI {
396
 
397
  //figure out in what SubDir files should land
398
  //#$SubDir = $this->returnSubDir(get_attached_file($ID));
399
- $fullSubDir = str_replace(get_home_path(), "", dirname($itemHandler->getMeta()->getPath())) . DIRECTORY_SEPARATOR;
400
  //die("Uploads base: " . SP_UPLOADS_BASE . " FullSubDir: ". $fullSubDir . " PATH: " . dirname($itemHandler->getMeta()->getPath()));
401
  $SubDir = ShortPixelMetaFacade::returnSubDir($itemHandler->getMeta()->getPath(), $itemHandler->getType());
402
 
@@ -409,13 +409,13 @@ class ShortPixelAPI {
409
  return array("Status" => self::STATUS_FAIL, "Message" => "Backup folder does not exist and it cannot be created");
410
  }
411
  //create subdir in backup folder if needed
412
- @mkdir( SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $fullSubDir, 0777, true);
413
 
414
  foreach ( $source as $fileID => $filePATH )//create destination files array
415
  {
416
- $destination[$fileID] = SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $fullSubDir . self::MB_basename($source[$fileID]);
417
  }
418
- //die("IZ BACKUP: " . SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir . var_dump($destination));
419
 
420
  //now that we have original files and where we should back them up we attempt to do just that
421
  if(is_writable(SP_BACKUP_FOLDER))
@@ -462,7 +462,7 @@ class ShortPixelAPI {
462
  $targetFile = $PATHs[$tempFileID];
463
  copy($tempFilePATH, $targetFile);
464
  if(file_exists($tempWebpFilePATH)) {
465
- $targetWebPFile = dirname($targetFile) . DIRECTORY_SEPARATOR . basename($targetFile, '.' . pathinfo($targetFile, PATHINFO_EXTENSION)) . ".webp";
466
  copy($tempWebpFilePATH, $targetWebPFile);
467
  }
468
  if($firstImage) { //this is the main image
233
  if($meta->getRetries() >= MAX_FAIL_RETRIES) {
234
  $meta->setStatus($APIresponse[0]->Status->Code);
235
  $meta->setMessage($APIresponse[0]->Status->Message);
236
+ $itemHandler->updateMeta($meta);
237
  }
238
  return $err;
239
  }
396
 
397
  //figure out in what SubDir files should land
398
  //#$SubDir = $this->returnSubDir(get_attached_file($ID));
399
+ $fullSubDir = str_replace(wp_normalize_path(get_home_path()), "", wp_normalize_path(dirname($itemHandler->getMeta()->getPath()))) . '/';
400
  //die("Uploads base: " . SP_UPLOADS_BASE . " FullSubDir: ". $fullSubDir . " PATH: " . dirname($itemHandler->getMeta()->getPath()));
401
  $SubDir = ShortPixelMetaFacade::returnSubDir($itemHandler->getMeta()->getPath(), $itemHandler->getType());
402
 
409
  return array("Status" => self::STATUS_FAIL, "Message" => "Backup folder does not exist and it cannot be created");
410
  }
411
  //create subdir in backup folder if needed
412
+ @mkdir( SP_BACKUP_FOLDER . '/' . $fullSubDir, 0777, true);
413
 
414
  foreach ( $source as $fileID => $filePATH )//create destination files array
415
  {
416
+ $destination[$fileID] = SP_BACKUP_FOLDER . '/' . $fullSubDir . self::MB_basename($source[$fileID]);
417
  }
418
+ //die("IZ BACKUP: " . SP_BACKUP_FOLDER . '/' . $SubDir . var_dump($destination));
419
 
420
  //now that we have original files and where we should back them up we attempt to do just that
421
  if(is_writable(SP_BACKUP_FOLDER))
462
  $targetFile = $PATHs[$tempFileID];
463
  copy($tempFilePATH, $targetFile);
464
  if(file_exists($tempWebpFilePATH)) {
465
+ $targetWebPFile = dirname($targetFile) . '/' . basename($targetFile, '.' . pathinfo($targetFile, PATHINFO_EXTENSION)) . ".webp";
466
  copy($tempWebpFilePATH, $targetWebPFile);
467
  }
468
  if($firstImage) { //this is the main image
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.1.3
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  */
@@ -12,7 +12,7 @@ define('SP_RESET_ON_ACTIVATE', false); //if true TODO set false
12
 
13
  define('SP_AFFILIATE_CODE', '');
14
 
15
- define('PLUGIN_VERSION', "4.1.3");
16
  define('SP_MAX_TIMEOUT', 10);
17
  define('SP_VALIDATE_MAX_TIMEOUT', 15);
18
  define('SP_BACKUP', 'ShortpixelBackups');
@@ -28,7 +28,7 @@ define('SP_UPLOADS_BASE', $sp__uploads['basedir']);
28
  define('SP_UPLOADS_NAME', basename(is_main_site() ? SP_UPLOADS_BASE : dirname(dirname(SP_UPLOADS_BASE))));
29
  define('SP_UPLOADS_BASE_REL', str_replace(get_home_path(),"", $sp__uploads['basedir']));
30
  $sp__backupBase = is_main_site() ? SP_UPLOADS_BASE : dirname(dirname(SP_UPLOADS_BASE));
31
- define('SP_BACKUP_FOLDER', $sp__backupBase . DIRECTORY_SEPARATOR . SP_BACKUP);
32
 
33
  /*
34
  if ( is_numeric($MAX_EXECUTION_TIME) && $MAX_EXECUTION_TIME > 10 )
@@ -386,7 +386,7 @@ class WPShortPixel {
386
  $folderId = $folder->getId();
387
  self::log("NG Image Upload: created folder from path $galleryPath : Folder info: " . json_encode($folder));
388
  }
389
- $pathParts = explode(DIRECTORY_SEPARATOR, trim($imageFsPath));
390
  //Add the main image
391
  $meta = new ShortPixelMeta();
392
  $meta->setPath($imageFsPath);
@@ -405,7 +405,7 @@ class WPShortPixel {
405
  //add the thumb image if exists
406
  $pathParts[] = "thumbs_" . $pathParts[count($pathParts) - 1];
407
  $pathParts[count($pathParts) - 2] = "thumbs";
408
- $thumbPath = implode(DIRECTORY_SEPARATOR, $pathParts);
409
  if(file_exists($thumbPath)) {
410
  $metaThumb = new ShortPixelMeta();
411
  $metaThumb->setPath($thumbPath);
@@ -856,13 +856,13 @@ class WPShortPixel {
856
  $SubDir = ShortPixelMetaFacade::returnSubDir($file, ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE);
857
 
858
  //sometimes the month of original file and backup can differ
859
- if ( !file_exists(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir . ShortPixelAPI::MB_basename($file)) ) {
860
  $SubDir = date("Y") . "/" . date("m") . "/";
861
- if( !file_exists(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir . ShortPixelAPI::MB_basename($file)) ) {
862
  return false;
863
  }
864
  }
865
- return SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir;
866
  }
867
 
868
  protected function setFilePerms($file) {
@@ -899,7 +899,7 @@ class WPShortPixel {
899
  foreach($meta["sizes"] as $size => $imageData) {
900
  $source = $bkFolder . $imageData['file'];
901
  if(!file_exists($source)) continue; // if thumbs were not optimized, then the backups will not be there.
902
- $thumbsPaths[$source] = $pathInfo['dirname'] . DIRECTORY_SEPARATOR . $imageData['file'];
903
  if(! $this->setFilePerms($source)) return false;
904
  }
905
  }
@@ -948,8 +948,8 @@ class WPShortPixel {
948
  if(!$meta || $meta->getStatus() != 2) return false;
949
 
950
  $file = $meta->getPath();
951
- $fullSubDir = str_replace(get_home_path(), "", dirname($file)) . DIRECTORY_SEPARATOR;
952
- $bkFile = SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $fullSubDir . ShortPixelAPI::MB_basename($file);
953
 
954
  if(file_exists($bkFile)) {
955
  @rename($bkFile, $file);
@@ -1047,11 +1047,11 @@ class WPShortPixel {
1047
  try {
1048
  $SubDir = ShortPixelMetaFacade::returnSubDir($file, ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE);
1049
 
1050
- @unlink(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir . ShortPixelAPI::MB_basename($file));
1051
 
1052
  if ( !empty($meta['file']) )
1053
  {
1054
- $filesPath = SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . $SubDir;//base BACKUP path
1055
  //remove thumbs thumbnails
1056
  if(isset($meta["sizes"])) {
1057
  foreach($meta["sizes"] as $size => $imageData) {
@@ -1353,7 +1353,7 @@ class WPShortPixel {
1353
  public function getCustomFolderBase() {
1354
  if(is_main_site()) {
1355
  $base = get_home_path();
1356
- return rtrim($base, DIRECTORY_SEPARATOR);
1357
  } else {
1358
  $up = wp_upload_dir();
1359
  return $up['basedir'];
@@ -1461,7 +1461,7 @@ class WPShortPixel {
1461
  //test that the "uploads" have the right rights and also we can create the backup dir for ShortPixel
1462
  if ( !file_exists(SP_BACKUP_FOLDER) && !@mkdir(SP_BACKUP_FOLDER, 0777, true) )
1463
  $notice = array("status" => "error", "msg" => "There is something preventing us to create a new folder for backing up your original files.<BR>
1464
- Please make sure that folder <b>" . WP_CONTENT_DIR . DIRECTORY_SEPARATOR . SP_UPLOADS_NAME . "</b> has the necessary write and read rights.");
1465
  } else {
1466
  if(isset($_POST['validate'])) {
1467
  //display notification
@@ -1911,8 +1911,8 @@ class WPShortPixel {
1911
 
1912
 
1913
  public static function deleteDir($dirPath) {
1914
- if (substr($dirPath, strlen($dirPath) - 1, 1) != DIRECTORY_SEPARATOR) {
1915
- $dirPath .= DIRECTORY_SEPARATOR;
1916
  }
1917
  $files = glob($dirPath . '*', GLOB_MARK);
1918
  foreach ($files as $file) {
@@ -1932,7 +1932,7 @@ class WPShortPixel {
1932
  } else {
1933
  return $total_size;
1934
  }
1935
- $cleanPath = rtrim($path, DIRECTORY_SEPARATOR). DIRECTORY_SEPARATOR;
1936
  foreach($files as $t) {
1937
  if ($t<>"." && $t<>"..")
1938
  {
@@ -1951,7 +1951,7 @@ class WPShortPixel {
1951
  }
1952
 
1953
  public function migrateBackupFolder() {
1954
- $oldBackupFolder = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . SP_BACKUP;
1955
 
1956
  if(file_exists($oldBackupFolder)) { //if old backup folder does not exist then there is nothing to do
1957
 
@@ -1962,7 +1962,7 @@ class WPShortPixel {
1962
 
1963
  $scannedDirectory = array_diff(scandir($oldBackupFolder), array('..', '.'));
1964
  foreach($scannedDirectory as $file) {
1965
- @rename($oldBackupFolder.DIRECTORY_SEPARATOR.$file, SP_BACKUP_FOLDER.DIRECTORY_SEPARATOR.$file);
1966
  }
1967
  $scannedDirectory = array_diff(scandir($oldBackupFolder), array('..', '.'));
1968
  if(empty($scannedDirectory)) {
@@ -1970,20 +1970,20 @@ class WPShortPixel {
1970
  }
1971
  }
1972
  //now if the backup folder does not contain the uploads level, create it
1973
- if( !is_dir(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . SP_UPLOADS_NAME )
1974
- && !is_dir(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . basename(WP_CONTENT_DIR))) {
1975
  @rename(SP_BACKUP_FOLDER, SP_BACKUP_FOLDER."_tmp");
1976
  @mkdir(SP_BACKUP_FOLDER);
1977
- @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER.DIRECTORY_SEPARATOR.SP_UPLOADS_NAME);
1978
  if(!file_exists(SP_BACKUP_FOLDER)) {//just in case..
1979
  @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER);
1980
  }
1981
  }
1982
  //then create the wp-content level if not present
1983
- if(!is_dir(SP_BACKUP_FOLDER . DIRECTORY_SEPARATOR . basename(WP_CONTENT_DIR))) {
1984
  @rename(SP_BACKUP_FOLDER, SP_BACKUP_FOLDER."_tmp");
1985
  @mkdir(SP_BACKUP_FOLDER);
1986
- @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER.DIRECTORY_SEPARATOR . basename(WP_CONTENT_DIR));
1987
  if(!file_exists(SP_BACKUP_FOLDER)) {//just in case..
1988
  @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER);
1989
  }
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.1.4
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  */
12
 
13
  define('SP_AFFILIATE_CODE', '');
14
 
15
+ define('PLUGIN_VERSION', "4.1.4");
16
  define('SP_MAX_TIMEOUT', 10);
17
  define('SP_VALIDATE_MAX_TIMEOUT', 15);
18
  define('SP_BACKUP', 'ShortpixelBackups');
28
  define('SP_UPLOADS_NAME', basename(is_main_site() ? SP_UPLOADS_BASE : dirname(dirname(SP_UPLOADS_BASE))));
29
  define('SP_UPLOADS_BASE_REL', str_replace(get_home_path(),"", $sp__uploads['basedir']));
30
  $sp__backupBase = is_main_site() ? SP_UPLOADS_BASE : dirname(dirname(SP_UPLOADS_BASE));
31
+ define('SP_BACKUP_FOLDER', $sp__backupBase . '/' . SP_BACKUP);
32
 
33
  /*
34
  if ( is_numeric($MAX_EXECUTION_TIME) && $MAX_EXECUTION_TIME > 10 )
386
  $folderId = $folder->getId();
387
  self::log("NG Image Upload: created folder from path $galleryPath : Folder info: " . json_encode($folder));
388
  }
389
+ $pathParts = explode('/', trim($imageFsPath));
390
  //Add the main image
391
  $meta = new ShortPixelMeta();
392
  $meta->setPath($imageFsPath);
405
  //add the thumb image if exists
406
  $pathParts[] = "thumbs_" . $pathParts[count($pathParts) - 1];
407
  $pathParts[count($pathParts) - 2] = "thumbs";
408
+ $thumbPath = implode('/', $pathParts);
409
  if(file_exists($thumbPath)) {
410
  $metaThumb = new ShortPixelMeta();
411
  $metaThumb->setPath($thumbPath);
856
  $SubDir = ShortPixelMetaFacade::returnSubDir($file, ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE);
857
 
858
  //sometimes the month of original file and backup can differ
859
+ if ( !file_exists(SP_BACKUP_FOLDER . '/' . $SubDir . ShortPixelAPI::MB_basename($file)) ) {
860
  $SubDir = date("Y") . "/" . date("m") . "/";
861
+ if( !file_exists(SP_BACKUP_FOLDER . '/' . $SubDir . ShortPixelAPI::MB_basename($file)) ) {
862
  return false;
863
  }
864
  }
865
+ return SP_BACKUP_FOLDER . '/' . $SubDir;
866
  }
867
 
868
  protected function setFilePerms($file) {
899
  foreach($meta["sizes"] as $size => $imageData) {
900
  $source = $bkFolder . $imageData['file'];
901
  if(!file_exists($source)) continue; // if thumbs were not optimized, then the backups will not be there.
902
+ $thumbsPaths[$source] = $pathInfo['dirname'] . '/' . $imageData['file'];
903
  if(! $this->setFilePerms($source)) return false;
904
  }
905
  }
948
  if(!$meta || $meta->getStatus() != 2) return false;
949
 
950
  $file = $meta->getPath();
951
+ $fullSubDir = str_replace(get_home_path(), "", dirname($file)) . '/';
952
+ $bkFile = SP_BACKUP_FOLDER . '/' . $fullSubDir . ShortPixelAPI::MB_basename($file);
953
 
954
  if(file_exists($bkFile)) {
955
  @rename($bkFile, $file);
1047
  try {
1048
  $SubDir = ShortPixelMetaFacade::returnSubDir($file, ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE);
1049
 
1050
+ @unlink(SP_BACKUP_FOLDER . '/' . $SubDir . ShortPixelAPI::MB_basename($file));
1051
 
1052
  if ( !empty($meta['file']) )
1053
  {
1054
+ $filesPath = SP_BACKUP_FOLDER . '/' . $SubDir;//base BACKUP path
1055
  //remove thumbs thumbnails
1056
  if(isset($meta["sizes"])) {
1057
  foreach($meta["sizes"] as $size => $imageData) {
1353
  public function getCustomFolderBase() {
1354
  if(is_main_site()) {
1355
  $base = get_home_path();
1356
+ return rtrim($base, '/');
1357
  } else {
1358
  $up = wp_upload_dir();
1359
  return $up['basedir'];
1461
  //test that the "uploads" have the right rights and also we can create the backup dir for ShortPixel
1462
  if ( !file_exists(SP_BACKUP_FOLDER) && !@mkdir(SP_BACKUP_FOLDER, 0777, true) )
1463
  $notice = array("status" => "error", "msg" => "There is something preventing us to create a new folder for backing up your original files.<BR>
1464
+ Please make sure that folder <b>" . WP_CONTENT_DIR . '/' . SP_UPLOADS_NAME . "</b> has the necessary write and read rights.");
1465
  } else {
1466
  if(isset($_POST['validate'])) {
1467
  //display notification
1911
 
1912
 
1913
  public static function deleteDir($dirPath) {
1914
+ if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
1915
+ $dirPath .= '/';
1916
  }
1917
  $files = glob($dirPath . '*', GLOB_MARK);
1918
  foreach ($files as $file) {
1932
  } else {
1933
  return $total_size;
1934
  }
1935
+ $cleanPath = rtrim($path, '/'). '/';
1936
  foreach($files as $t) {
1937
  if ($t<>"." && $t<>"..")
1938
  {
1951
  }
1952
 
1953
  public function migrateBackupFolder() {
1954
+ $oldBackupFolder = WP_CONTENT_DIR . '/' . SP_BACKUP;
1955
 
1956
  if(file_exists($oldBackupFolder)) { //if old backup folder does not exist then there is nothing to do
1957
 
1962
 
1963
  $scannedDirectory = array_diff(scandir($oldBackupFolder), array('..', '.'));
1964
  foreach($scannedDirectory as $file) {
1965
+ @rename($oldBackupFolder.'/'.$file, SP_BACKUP_FOLDER.'/'.$file);
1966
  }
1967
  $scannedDirectory = array_diff(scandir($oldBackupFolder), array('..', '.'));
1968
  if(empty($scannedDirectory)) {
1970
  }
1971
  }
1972
  //now if the backup folder does not contain the uploads level, create it
1973
+ if( !is_dir(SP_BACKUP_FOLDER . '/' . SP_UPLOADS_NAME )
1974
+ && !is_dir(SP_BACKUP_FOLDER . '/' . basename(WP_CONTENT_DIR))) {
1975
  @rename(SP_BACKUP_FOLDER, SP_BACKUP_FOLDER."_tmp");
1976
  @mkdir(SP_BACKUP_FOLDER);
1977
+ @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER.'/'.SP_UPLOADS_NAME);
1978
  if(!file_exists(SP_BACKUP_FOLDER)) {//just in case..
1979
  @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER);
1980
  }
1981
  }
1982
  //then create the wp-content level if not present
1983
+ if(!is_dir(SP_BACKUP_FOLDER . '/' . basename(WP_CONTENT_DIR))) {
1984
  @rename(SP_BACKUP_FOLDER, SP_BACKUP_FOLDER."_tmp");
1985
  @mkdir(SP_BACKUP_FOLDER);
1986
+ @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER.'/' . basename(WP_CONTENT_DIR));
1987
  if(!file_exists(SP_BACKUP_FOLDER)) {//just in case..
1988
  @rename(SP_BACKUP_FOLDER."_tmp", SP_BACKUP_FOLDER);
1989
  }