Image Optimizer by 10web – Image Optimizer and Compression plugin - Version 1.0.2

Version Description

  • Change: Require PHP 5.5
  • Change: Using AJAX for getting optimizer scan info
Download this release

Release Info

Developer webdorado
Plugin Icon 128x128 Image Optimizer by 10web – Image Optimizer and Compression plugin
Version 1.0.2
Comparing to
See all releases

Code changes from version 1.0.1 to 1.0.2

.gitignore DELETED
@@ -1,3 +0,0 @@
1
- # Created by .ignore support plugin (hsz.mobi)
2
- /vendor/
3
- .idea/*
 
 
 
assets/js/admin_main.js CHANGED
@@ -85,7 +85,7 @@ jQuery(document).ready(function () {
85
  jQuery.post(iowd.ajaxURL, data, function () {
86
  }).done(function (response) {
87
  response = JSON.parse(response);
88
- if(response.status == "error"){
89
  window.location.href = "admin.php?page=iowd_settings";
90
  return false;
91
  }
85
  jQuery.post(iowd.ajaxURL, data, function () {
86
  }).done(function (response) {
87
  response = JSON.parse(response);
88
+ if(response.status == "error" || response.data_count == 0){
89
  window.location.href = "admin.php?page=iowd_settings";
90
  return false;
91
  }
assets/js/api.js CHANGED
@@ -4,6 +4,8 @@ var iowdAPI = (function () {
4
  // constructor
5
  var api = function () {
6
  this._apiURL = null;
 
 
7
  this._postData = null;
8
  this.error = {
9
  error_number: null,
@@ -45,10 +47,21 @@ var iowdAPI = (function () {
45
  }
46
 
47
  }).fail(function() {
48
- console.log('Something went wrong. IO will retry.');
49
- setTimeout(function(){
50
- thisAPI.ajaxCall(data, callback);
51
- }, 1000);
 
 
 
 
 
 
 
 
 
 
 
52
  });
53
  };
54
 
4
  // constructor
5
  var api = function () {
6
  this._apiURL = null;
7
+ this._triesCount = 25;
8
+ this._triesIteration = 0;
9
  this._postData = null;
10
  this.error = {
11
  error_number: null,
47
  }
48
 
49
  }).fail(function() {
50
+ if (thisAPI._triesIteration < thisAPI._triesCount) {
51
+ console.log('Something went wrong. IO will retry.');
52
+ setTimeout(function () {
53
+ thisAPI.ajaxCall(data, callback);
54
+ }, 1000);
55
+ thisAPI._triesIteration++;
56
+ } else {
57
+ var abortedData = {
58
+ action: "abort",
59
+ nonce_iowd: data.nonce_iowd
60
+ };
61
+ jQuery.post(thisAPI._apiURL, abortedData, function () {
62
+ window.location.href = "admin.php?page=iowd_settings";
63
+ });
64
+ }
65
  });
66
  };
67
 
assets/js/settings.js CHANGED
@@ -349,6 +349,8 @@ jQuery(document).ready(function () {
349
  window.location.href = "admin.php?page=iowd_settings";
350
  });
351
  });
 
 
352
 
353
  });
354
 
@@ -470,5 +472,71 @@ function iowdDisable(changedElem, disabledElem) {
470
  }
471
  }
472
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
 
474
 
349
  window.location.href = "admin.php?page=iowd_settings";
350
  });
351
  });
352
+ jQuery(".iowd-butn-ajax-container").closest(".iowd-main").append('<img src="http://devops.web-dorado.info/Sergey/wp4/wp-content/plugins/image-optimizer-wd/assets/img/spinner.gif" class="iowd-spinner iowd-loading-spinner-ajax" style="display:inline-block; vertical-align:sub;">');
353
+ iowdScan(0);
354
 
355
  });
356
 
472
  }
473
  }
474
 
475
+ function iowdScan(limit) {
476
+ var data = {
477
+ action: "scan",
478
+ nonce_iowd: iowd.nonce,
479
+ limit: limit
480
+ };
481
+
482
+ jQuery.post(iowd.ajaxURL, data, function (response) {
483
+ response = JSON.parse(response);
484
+ if(response["status"] != "done"){
485
+ limit = limit + 2000;
486
+ iowdScan(limit);
487
+ } else{
488
+ var data = {
489
+ action: "scan_all",
490
+ nonce_iowd: iowd.nonce,
491
+ limit : limit
492
+ };
493
+
494
+ jQuery.post(iowd.ajaxURL, data, function (response) {
495
+ response = JSON.parse(response);
496
+ iowdLoadBlocks(response);
497
+ });
498
+ }
499
+
500
+ });
501
+ }
502
+
503
+ function iowdLoadBlocks(scan) {
504
+ jQuery(".iowd-loading-spinner-ajax").remove();
505
+ if(scan["not_optimized_data"] > 0 || scan["not_optimized_data_sizes"] > 0){
506
+ jQuery(".iowd-stat-ajax span b").html("There are " + scan["not_optimized_data_media"] + " full-size ( totally " + scan["not_optimized_data_media_sizes"] + " ) images from media library and " + scan["not_optimized_data_other"] + " from other directories ready for optimize");
507
+ }
508
+
509
+ dataAttachments = jQuery(".iowd-butn-ajax-container").attr("data-attachments");
510
+ if(dataAttachments == "1" || scan["not_optimized_data"] > 0 || scan["not_optimized_data_sizes"] > 0){
511
+ jQuery(".iowd-butn-ajax-container").show();
512
+ } else{
513
+ if (scan["optimized_data"]) {
514
+ jQuery(".iowd-optimized-ajax-text").html('<strong class="iowd-up-to-date">All images are optimized and up to date.</strong>');
515
+ } else {
516
+ jQuery(".iowd-optimized-ajax-text").html('<strong>There are no images for optimizing.</strong>');
517
+ }
518
+ jQuery(".iowd-optimized-ajax-text").show();
519
+ }
520
+
521
+ //statistics
522
+
523
+ if (scan["not_optimized_data"] > 0 || scan["not_optimized_data_sizes"] > 0) {
524
+ ratio = "<span class='iowd_opt_data'>" + scan["optimized_data_sizes"] + "</span>/<span class='iowd_all_data'>" + scan["all_data_sizes"] + "</span>";
525
+ width = (scan["optimized_data_sizes"] / scan["all_data_sizes"]) * 100;
526
+ style = 'width:' + width + '%';
527
+ } else {
528
+ ratio = "<span class='iowd_opt_data'>" + scan["optimized_data_sizes"] + "</span>/<span class='iowd_all_data'>" + scan["optimized_data_sizes"] + "</span>";
529
+ if (scan["optimized_data_sizes"] == 0) {
530
+ style = 'width:0%';
531
+ } else {
532
+ style = 'width:100%';
533
+ }
534
+ }
535
+
536
+ jQuery(".iowd-stat-ratio").html(ratio);
537
+ jQuery(".iowd-stat-progress-bar-inner").attr("style", style);
538
+
539
+ }
540
+
541
 
542
 
includes/iowd-ajax.php CHANGED
@@ -285,6 +285,61 @@ class IOWD_Ajax
285
  //wp_die();
286
  }
287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  }
289
 
290
 
285
  //wp_die();
286
  }
287
 
288
+ public static function scan()
289
+ {
290
+ $optimizer = new IOWD_Optimize();
291
+ $limit = isset($_POST["limit"]) ? $_POST["limit"] : 0;
292
+
293
+ $data = $optimizer->get_attachments(array(), false, array(), null, $limit);
294
+ if ($data) {
295
+ $response = array("status" => "pending");
296
+ } else {
297
+ $data = $optimizer->get_attachments(array(), true, array(), null, $limit);
298
+ $response = array("status" => "done");
299
+ }
300
+
301
+ echo json_encode($response);
302
+ wp_die();
303
+
304
+ }
305
+
306
+ public static function scan_all()
307
+ {
308
+ $optimizer = new IOWD_Optimize();
309
+ $limit = isset($_POST["limit"]) ? $_POST["limit"] : 0;
310
+
311
+ $media = array();
312
+ $other = array();
313
+ $media_sizes = array();
314
+ $attachments = array();
315
+ for($i=0; $i <= $limit; $i+=2000){
316
+ $db_attachments = get_site_transient("iowd_temp_scan_data_".$i);
317
+ $media_attachments = isset($db_attachments["media"]) ? $db_attachments["media"] : array();
318
+ $media_sizes_attachments = isset($db_attachments["media_sizes"]) ? $db_attachments["media_sizes"] : array();
319
+ $other_attachments = isset($db_attachments["other"]) ? $db_attachments["other"] : array();
320
+ $u_attachments = isset($db_attachments["attachments"]) ? $db_attachments["attachments"] : array();
321
+
322
+ $media = $media + $media_attachments;
323
+ $other = $other + $other_attachments;
324
+ $media_sizes = $media_sizes + $media_sizes_attachments;
325
+ $attachments = $attachments + $u_attachments;
326
+
327
+ delete_site_transient("iowd_temp_scan_data_".$i);
328
+ }
329
+ $all_attachments = array(
330
+ "media" => $media,
331
+ "media_sizes" => $media_sizes,
332
+ "other" => $other,
333
+ "attachments" => $attachments,
334
+ );
335
+
336
+
337
+ $data = $optimizer->scan($all_attachments);
338
+ echo json_encode($data);
339
+ wp_die();
340
+
341
+ }
342
+
343
  }
344
 
345
 
includes/iowd-amazon-s3.php CHANGED
@@ -9,8 +9,7 @@ use Aws\S3\S3Client;
9
 
10
  class IOWD_Amazon_S3
11
  {
12
- const CACERT_PATH = IOWD_DIR . '/cacert-2017-06-07.pem';
13
- const S3_CREDENTIALS_PATH = IOWD_API_URL . '/s3credentials';
14
 
15
  public $errors = array();
16
  public $sub_folder_name = null;
@@ -22,16 +21,18 @@ class IOWD_Amazon_S3
22
 
23
  public function __construct($id = '')
24
  {
 
 
25
  $this->sub_folder_name = md5("TWlop45&&Kn1)@" . time());
26
  $this->folder_name = md5(site_url());
27
-
28
  $credentials = get_option("iowd_crd_" . $id);
29
  $config = array(
30
  'version' => 'latest',
31
  'region' => $this->region,
32
  'credentials' => $credentials,
33
  'http' => array(
34
- 'verify' => self::CACERT_PATH,
35
  ),
36
  );
37
  $this->credentials = $credentials;
9
 
10
  class IOWD_Amazon_S3
11
  {
12
+ private $cacert_path = null;
 
13
 
14
  public $errors = array();
15
  public $sub_folder_name = null;
21
 
22
  public function __construct($id = '')
23
  {
24
+ $this->cacert_path = IOWD_DIR . '/cacert-2017-06-07.pem';
25
+
26
  $this->sub_folder_name = md5("TWlop45&&Kn1)@" . time());
27
  $this->folder_name = md5(site_url());
28
+
29
  $credentials = get_option("iowd_crd_" . $id);
30
  $config = array(
31
  'version' => 'latest',
32
  'region' => $this->region,
33
  'credentials' => $credentials,
34
  'http' => array(
35
+ 'verify' => $this->cacert_path,
36
  ),
37
  );
38
  $this->credentials = $credentials;
includes/iowd-optimize.php CHANGED
@@ -65,14 +65,13 @@ class IOWD_Optimize
65
  return array("status" => "error", "error" => __("Empty credentials, please try again.", IOWD_PREFIX));
66
  }
67
 
68
- if (empty($ids) === false) {
69
- $images_data = $this->get_attachments($ids, false, $meta, $response["remained"]);
70
- } else {
71
- $images_data = $this->scan($ids, $other, $response["remained"]);
72
- $images_data = $images_data["attachments_data"];
73
- }
74
 
75
  $data_count = count($images_data);
 
 
 
 
76
  // add temp data
77
  add_option("iowd_image_temp_data_" . $id, $images_data);
78
  add_option("iowd_data_count_" . $id, $data_count);
@@ -80,85 +79,125 @@ class IOWD_Optimize
80
  return array("status" => "ok", "data_count" => $data_count);
81
  }
82
 
83
- public function get_attachments($ids = array(), $include_others = false, $meta = array(), $remained = null)
84
  {
85
- ini_set('memory_limit', '-1');
 
86
  clearstatcache();
87
  $options = $this->options;
88
  $image_data = array();
89
 
 
 
90
 
91
  $optimize_thumbs = explode(",", $options["optimize_thumbs"]);
92
- // if isset ids, get attachments
 
 
 
 
 
 
 
 
 
 
93
 
94
- $args = array(
95
- 'post_type' => 'attachment',
96
- 'post__in' => $ids,
97
- 'numberposts' => -1
98
- );
99
- $attachments = get_posts($args);
100
 
 
101
  if (empty($attachments) === false) {
102
  foreach ($attachments as $attachment) {
103
- if (!file_exists(get_attached_file($attachment->ID))) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  continue;
105
  }
106
- $file_name = get_attached_file($attachment->ID);
107
  $type = pathinfo($file_name, PATHINFO_EXTENSION);
108
  $size = filesize($file_name);
109
- $path = wp_get_attachment_url($attachment->ID);
110
  // check type
111
  if (!in_array(strtolower($type), $this->allowed_types) || $this->check_optimization_level($type) === false) {
112
  continue;
113
  }
114
 
115
  if (($this->skip_small_images($size) === true && $this->skip_large_images($size) === true && $options["exclude_full_size"] == 0) || $this->is_single == true) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
- $image = array();
118
- $image["path"] = $path;
119
- $image["file"] = $file_name;
120
- $image["post_id"] = $attachment->ID;
121
- $image["size"] = "full";
122
- $image["image_size"] = $size;
123
- $image["media"] = 1;
124
- $image["converted"] = 0;
125
- $image["resized"] = 0;
126
- $image["single"] = $this->is_single;
127
- $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($file_name) ? 1 : 0;
128
-
129
- $image_data[] = $image;
130
  }
131
  $attachment_root_url = str_replace(basename($path), "", $path);
132
- $attachment_root_dir = str_replace(basename(get_attached_file($attachment->ID)), "", get_attached_file($attachment->ID));
133
-
134
- $meta = wp_get_attachment_metadata($attachment->ID) ? wp_get_attachment_metadata($attachment->ID) : $meta;
135
- $sizes = isset($meta["sizes"]) ? $meta["sizes"] : array();
136
 
137
  foreach ($sizes as $size => $file) {
138
  if (in_array($size, $optimize_thumbs)) {
 
 
 
 
 
 
 
 
139
  $image_size = filesize($attachment_root_dir . $file["file"]);
140
  if (($this->skip_small_images($image_size) === true && $this->skip_large_images($image_size) === true) || $this->is_single == true) {
141
- $image = array();
142
- $image["path"] = $attachment_root_url . $file["file"];
143
- $image["file"] = $attachment_root_dir . $file["file"];
144
- $image["post_id"] = $attachment->ID;
145
- $image["size"] = $size;
146
- $image["image_size"] = $image_size;
147
- $image["media"] = 1;
148
- $image["converted"] = 0;
149
- $image["resized"] = 0;
150
- $image["single"] = $this->is_single;
151
- $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($attachment_root_dir . $file["file"]) ? 1 : 0;
152
-
153
-
154
- $image_data[] = $image;
 
 
 
 
155
  }
156
  }
157
  }
158
  }
159
  }
 
 
160
 
161
- if ($include_others == true) {
162
 
163
  $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
164
 
@@ -183,6 +222,13 @@ class IOWD_Optimize
183
  $max_iowd_post = $max_iowd_post ? substr($max_iowd_post->post_id, 5) + 1 : 1;
184
 
185
  foreach ($other_images as $other_image) {
 
 
 
 
 
 
 
186
  $other_path = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
187
 
188
  if (!file_exists($other_path)) {
@@ -194,43 +240,206 @@ class IOWD_Optimize
194
  if ($this->check_optimization_level($type) === false || $this->skip_small_images($size) === false || $this->skip_large_images($size) === false || !in_array(strtolower($type), $this->allowed_types)) {
195
  continue;
196
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
 
198
- $image = array();
199
- $image["path"] = $other_image;
200
- $image["file"] = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
201
- $image["post_id"] = "iowd_" . $max_iowd_post;
202
- $image["size"] = "full";
203
-
204
- $image["image_size"] = $size;
205
- $image["media"] = 0;
206
- $image["converted"] = 0;
207
- $image["resized"] = 0;
208
- $image["single"] = $this->is_single;
209
- $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($image["file"]) ? 1 : 0;
210
-
211
- $image_data[] = $image;
212
  $i++;
213
  $max_iowd_post++;
214
  }
215
  }
216
  }
217
 
218
- if (!is_null($remained)) {
219
- $image_data = array_slice($image_data, 0, $remained);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  }
221
 
222
- $images_count = count($image_data);
223
- $attachments_data = array();
224
- if ($images_count > $this->images_count) {
225
- for ($i = 0; $i < ceil($images_count / $this->images_count); $i++) {
226
- $attachments_data[$i] = array_slice($image_data, $i * $this->images_count, $this->images_count);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  }
 
228
  } else {
229
- $attachments_data[0] = $image_data;
230
  }
231
 
232
- return $attachments_data;
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  }
235
 
236
  private function check_optimization_level($mime_type)
@@ -287,112 +496,6 @@ class IOWD_Optimize
287
  return true;
288
  }
289
 
290
- public function scan($ids = array(), $include_others = false, $remained = null)
291
- {
292
- $options = $this->options;
293
- $attachments = $this->get_attachments($ids, $include_others);
294
-
295
- global $wpdb;
296
- $where = "";
297
- $rows = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "iowd_images " . $where);
298
- $optimized_data = array();
299
-
300
- $all_data_count = array();
301
- $optimized_data_count = array();
302
- $all_data = array();
303
-
304
- $for_checking = array();
305
- for ($i = 0; $i < count($attachments); $i++) {
306
- foreach ($attachments[$i] as $attachment) {
307
- if (!in_array($attachment["path"], $for_checking)) {
308
- if ($attachment["media"] == 1) {
309
- $all_data[$attachment["post_id"] . ":" . $attachment["size"]] = $attachment["post_id"] . ":" . $attachment["size"];
310
- $all_data_count[$attachment["post_id"]] = $attachment["post_id"];
311
- } else {
312
- $all_data["iowd_" . $attachment["path"]] = "iowd_" . $attachment["path"];
313
- $all_data_count[$attachment["path"]] = $attachment["path"];
314
- }
315
- }
316
- $for_checking[] = $attachment["path"];
317
- }
318
- }
319
-
320
- foreach ($rows as $row) {
321
- $optimization_type = $this->get_current_opt_level($row->path);
322
- $already_optimized = explode(",", $row->already_optimized);
323
- $already_optimized = array_unique($already_optimized);
324
-
325
- if ($options["optimize_once_more"] == "1" && (($optimization_type == "losselss" && empty($already_optimized) == true) || ($optimization_type == "lossy40" && ($already_optimized == array("lossless") || empty($already_optimized) == true)) || ($optimization_type == "lossy" && !in_array("lossy", $already_optimized)))) {
326
- continue;
327
- }
328
-
329
- if ($row->media == 1) {
330
- $optimized_data[$row->post_id . ":" . $row->size] = $row->post_id . ":" . $row->size;
331
- $optimized_data_count[$row->post_id] = $row->post_id;
332
- } else {
333
- $optimized_data["iowd_" . $row->path] = "iowd_" . $row->path;
334
- $optimized_data_count[$row->path] = $row->path;
335
- }
336
- }
337
-
338
- $optimize_all_diff = array_diff($optimized_data, $all_data);
339
- $not_optimized_data = array_diff($all_data, $optimized_data);
340
- $all_data = $all_data + $optimize_all_diff;
341
-
342
-
343
- $optimize_all_diff_count = array_diff($optimized_data_count, $all_data_count);
344
- $not_optimized_data_count = array_diff($all_data_count, $optimized_data_count);
345
- $all_data_count = $all_data_count + $optimize_all_diff_count;
346
-
347
-
348
- $not_optimized_data_other = array_filter($not_optimized_data, function ($elem) {
349
- if (strpos($elem, "iowd_") !== false) {
350
- return $elem;
351
- }
352
- });
353
-
354
- $not_optimized_data_media_count = count($not_optimized_data_count) - count($not_optimized_data_other);
355
- $not_optimized_data_media = count($not_optimized_data) - count($not_optimized_data_other);
356
-
357
- $image_data = array();
358
-
359
- for ($i = 0; $i < count($attachments); $i++) {
360
- foreach ($attachments[$i] as $attachment) {
361
- if (in_array($attachment["post_id"] . ":" . $attachment["size"], $not_optimized_data) || in_array("iowd_" . $attachment["path"], $not_optimized_data)) {
362
- $image_data[] = $attachment;
363
- }
364
- }
365
- }
366
-
367
- if (!is_null($remained)) {
368
- $image_data = array_slice($image_data, 0, $remained);
369
- }
370
-
371
- $images_count = count($image_data);
372
- $attachments_data = array();
373
- if ($images_count > $this->images_count) {
374
- for ($i = 0; $i < ceil($images_count / $this->images_count); $i++) {
375
- $attachments_data[$i] = array_slice($image_data, $i * $this->images_count, $this->images_count);
376
- }
377
- } else {
378
- $attachments_data[0] = $image_data;
379
- }
380
-
381
-
382
- return array(
383
- "optimized_data" => count($optimized_data_count),
384
- "optimized_data_sizes" => count($optimized_data),
385
- "not_optimized_data" => count($not_optimized_data_count),
386
- "not_optimized_data_sizes" => count($not_optimized_data),
387
- "not_optimized_data_media" => $not_optimized_data_media_count,
388
- "not_optimized_data_media_sizes" => $not_optimized_data_media,
389
- "not_optimized_data_other" => count($not_optimized_data_other),
390
- "all_data" => count($all_data_count),
391
- "all_data_sizes" => count($all_data),
392
- "attachments_data" => $attachments_data
393
- );
394
- }
395
-
396
  private function get_current_opt_level($path)
397
  {
398
  $options = $this->options;
@@ -424,6 +527,9 @@ class IOWD_Optimize
424
  $post_ids = array();
425
  for ($i = 0; $i < count($images_data); $i++) {
426
  $image_data = $images_data[$i];
 
 
 
427
  // if enable resizing
428
  if ($options["enable_resizing"] == 1 || $options["enable_resizing_other"] == 1) {
429
  $resize_data = $this->resize($image_data, $meta);
@@ -456,7 +562,7 @@ class IOWD_Optimize
456
  $db_post_ids = array_unique($db_post_ids);
457
  set_transient("iowd_optimizing_post_ids", $db_post_ids);
458
 
459
- GuzzleHttp\Promise\unwrap($response);
460
  $response = $this->api_call_ajax($data, $s3->folder_name, $s3->sub_folder_name, $s3->credentials, $iteration, $id);
461
  if (isset($response["status"]) && $response["status"] == "error") {
462
  set_transient("iowd_response_error", $response["error"]);
@@ -492,9 +598,6 @@ class IOWD_Optimize
492
 
493
  if ($resized == 0) {
494
  $iowd_image->load_image($item["file"]);
495
- if ($options["keep_originals"] == 1) {
496
- $this->keep_originals($item["file"]);
497
- }
498
  $flag = false;
499
  list($width) = @getimagesize($item["file"]);
500
  if ($item["media"] == 1 && $options["resize_media_images_width"] && $options["resize_media_images_height"] && $width > $options["resize_media_images_width"] && $options["enable_resizing"] == 1 && $item["size"] == "full") {
@@ -596,6 +699,7 @@ class IOWD_Optimize
596
  $_image_size = 0;
597
  $_image_orig_size = 0;
598
  $_image_count = 0;
 
599
  for ($i = 0; $i < count($request); $i++) {
600
  $request_row = $request[$i];
601
  $response_row = isset($body[$request_row["post_id"] . ":" . $request_row["size"]]) ? $body[$request_row["post_id"] . ":" . $request_row["size"]] : false;
@@ -647,6 +751,7 @@ class IOWD_Optimize
647
  $_image_size += $row_data["image_size"];
648
  $_image_orig_size += $img_orig_size;
649
  $_image_count += 1;
 
650
  }
651
 
652
  $last_optimized_data = get_site_transient("iowd_last_optimized_data");
@@ -661,6 +766,11 @@ class IOWD_Optimize
661
 
662
  set_site_transient("iowd_last_optimized_data", json_encode($last_optimized_data));
663
 
 
 
 
 
 
664
  }
665
 
666
 
65
  return array("status" => "error", "error" => __("Empty credentials, please try again.", IOWD_PREFIX));
66
  }
67
 
68
+ $images_data = $this->get_attachments($ids, $other, $meta, $response["remained"]);
 
 
 
 
 
69
 
70
  $data_count = count($images_data);
71
+ if($data_count == 0){
72
+ set_transient("iowd_response_error", 'no_image_data');
73
+ return array("status" => "error", "data_count" => $data_count);
74
+ }
75
  // add temp data
76
  add_option("iowd_image_temp_data_" . $id, $images_data);
77
  add_option("iowd_data_count_" . $id, $data_count);
79
  return array("status" => "ok", "data_count" => $data_count);
80
  }
81
 
82
+ public function get_attachments($ids = array(), $include_others = false, $meta = array(), $remained = null, $limit = null)
83
  {
84
+ ini_set('max_execution_time', 300);
85
+
86
  clearstatcache();
87
  $options = $this->options;
88
  $image_data = array();
89
 
90
+ $optimized_data = get_site_transient("iowd_optimized");
91
+ $optimized_data = $optimized_data ? $optimized_data : array();
92
 
93
  $optimize_thumbs = explode(",", $options["optimize_thumbs"]);
94
+ $uploads = wp_get_upload_dir();
95
+
96
+ $limitation = IOWD_Helper::limitation();
97
+
98
+ global $wpdb;
99
+
100
+ $where_ids = $ids ? "AND ID IN (" . implode(",", $ids) . ")" : "";
101
+ $limit_by = $limit !== null ? ' LIMIT ' . $limit . ', 2000' : '';
102
+
103
+ $attachments = $wpdb->get_results("SELECT T_POSTS.ID, T_POSTMETA.meta_value FROM " . $wpdb->prefix . "posts AS T_POSTS LEFT JOIN " . $wpdb->prefix . "postmeta AS T_POSTMETA ON
104
+ T_POSTS.ID = T_POSTMETA.post_id AND T_POSTMETA.meta_key = '_wp_attachment_metadata' WHERE post_type='attachment' " . $where_ids . $limit_by);
105
 
 
 
 
 
 
 
106
 
107
+ $for_checking = array();
108
  if (empty($attachments) === false) {
109
  foreach ($attachments as $attachment) {
110
+ if (count($image_data) > $limitation["limit"] && is_null($limit)) {
111
+ break;
112
+ }
113
+ $meta = $attachment->meta_value ? unserialize($attachment->meta_value) : $meta;
114
+ $sizes = isset($meta["sizes"]) ? $meta["sizes"] : array();
115
+ $file = isset($meta["file"]) ? $meta["file"] : "no_file";
116
+ $file_name = $uploads['basedir'] . "/" . $file;
117
+ $path = $uploads['baseurl'] . "/" . $file;
118
+
119
+ //check for getting correct data
120
+ if (!$ids) {
121
+ if (in_array($path, $optimized_data) && in_array($attachment->ID . "_full", array_keys($optimized_data))) {
122
+ continue;
123
+ }
124
+ }
125
+
126
+ if (!file_exists($file_name) || in_array($file_name, $for_checking)) {
127
  continue;
128
  }
129
+ $for_checking[] = $file_name;
130
  $type = pathinfo($file_name, PATHINFO_EXTENSION);
131
  $size = filesize($file_name);
132
+
133
  // check type
134
  if (!in_array(strtolower($type), $this->allowed_types) || $this->check_optimization_level($type) === false) {
135
  continue;
136
  }
137
 
138
  if (($this->skip_small_images($size) === true && $this->skip_large_images($size) === true && $options["exclude_full_size"] == 0) || $this->is_single == true) {
139
+ if (is_null($limit)) {
140
+ $image = array();
141
+ $image["path"] = $path;
142
+ $image["file"] = $file_name;
143
+ $image["post_id"] = $attachment->ID;
144
+ $image["size"] = "full";
145
+ $image["image_size"] = $size;
146
+ $image["media"] = 1;
147
+ $image["converted"] = 0;
148
+ $image["resized"] = 0;
149
+ $image["single"] = $this->is_single;
150
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($file_name) ? 1 : 0;
151
+
152
+ $image_data[] = $image;
153
+ } else {
154
+ $image_data["media"][$attachment->ID . "_full"] = $path;
155
+ $image_data["attachments"][$attachment->ID] = $attachment->ID;
156
+ }
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  }
159
  $attachment_root_url = str_replace(basename($path), "", $path);
160
+ $attachment_root_dir = str_replace(basename($file_name), "", $file_name);
 
 
 
161
 
162
  foreach ($sizes as $size => $file) {
163
  if (in_array($size, $optimize_thumbs)) {
164
+ if (in_array($attachment_root_dir . $file["file"], $for_checking) || !file_exists($attachment_root_dir . $file["file"]) ) {
165
+ continue;
166
+ }
167
+ if (!$ids) {
168
+ if (in_array($attachment_root_url . $file["file"], $optimized_data) && in_array($attachment->ID . "_" . $size, array_keys($optimized_data))) {
169
+ continue;
170
+ }
171
+ }
172
  $image_size = filesize($attachment_root_dir . $file["file"]);
173
  if (($this->skip_small_images($image_size) === true && $this->skip_large_images($image_size) === true) || $this->is_single == true) {
174
+ if (is_null($limit)) {
175
+ $image = array();
176
+ $image["path"] = $attachment_root_url . $file["file"];
177
+ $image["file"] = $attachment_root_dir . $file["file"];
178
+ $image["post_id"] = $attachment->ID;
179
+ $image["size"] = $size;
180
+ $image["image_size"] = $image_size;
181
+ $image["media"] = 1;
182
+ $image["converted"] = 0;
183
+ $image["resized"] = 0;
184
+ $image["single"] = $this->is_single;
185
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($attachment_root_dir . $file["file"]) ? 1 : 0;
186
+ $image_data[] = $image;
187
+ } else {
188
+ $image_data["media_sizes"][$attachment->ID . "_" . $size] = $attachment_root_url . $file["file"];
189
+ $image_data["attachments"][$attachment->ID] = $attachment->ID;
190
+ }
191
+ $for_checking[] = $attachment_root_dir . $file["file"];
192
  }
193
  }
194
  }
195
  }
196
  }
197
+ // free memory
198
+ unset($for_checking);
199
 
200
+ if ($include_others == true && ((count($image_data) < $limitation["limit"] && is_null($limit)) || $limit !== null)) {
201
 
202
  $protocaol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http';
203
 
222
  $max_iowd_post = $max_iowd_post ? substr($max_iowd_post->post_id, 5) + 1 : 1;
223
 
224
  foreach ($other_images as $other_image) {
225
+ if (count($image_data) > $limitation["limit"] && is_null($limit)) {
226
+ break;
227
+ }
228
+ if (in_array($other_image, $optimized_data)) {
229
+ continue;
230
+ }
231
+
232
  $other_path = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
233
 
234
  if (!file_exists($other_path)) {
240
  if ($this->check_optimization_level($type) === false || $this->skip_small_images($size) === false || $this->skip_large_images($size) === false || !in_array(strtolower($type), $this->allowed_types)) {
241
  continue;
242
  }
243
+ if(is_null($limit)){
244
+ $image = array();
245
+ $image["path"] = $other_image;
246
+ $image["file"] = str_replace($protocaol . '://' . $_SERVER['SERVER_NAME'], $_SERVER['DOCUMENT_ROOT'], $other_image);
247
+ $image["post_id"] = "iowd_" . $max_iowd_post;
248
+ $image["size"] = "full";
249
+
250
+ $image["image_size"] = $size;
251
+ $image["media"] = 0;
252
+ $image["converted"] = 0;
253
+ $image["resized"] = 0;
254
+ $image["single"] = $this->is_single;
255
+ $image["transparent"] = $type == "png" && IOWD_Util::is_transparent_png($image["file"]) ? 1 : 0;
256
+
257
+ $image_data[] = $image;
258
+ } else{
259
+ $image_data["other"]["iowd_" . $max_iowd_post . "_full"] = $other_image;
260
+ }
261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  $i++;
263
  $max_iowd_post++;
264
  }
265
  }
266
  }
267
 
268
+ if (is_null($limit)) {
269
+ if (!is_null($remained)) {
270
+ $image_data = array_slice($image_data, 0, $remained);
271
+ }
272
+
273
+ $images_count = count($image_data);
274
+
275
+ $attachments_data = array();
276
+ if ($images_count > 0) {
277
+ if ($images_count > $this->images_count) {
278
+ for ($i = 0; $i < ceil($images_count / $this->images_count); $i++) {
279
+ $attachments_data[$i] = array_slice($image_data, $i * $this->images_count, $this->images_count);
280
+ }
281
+ } else {
282
+ $attachments_data[0] = $image_data;
283
+ }
284
+ }
285
+ return $attachments_data;
286
+ } else {
287
+ set_site_transient("iowd_temp_scan_data_".$limit, $image_data);
288
+ return $image_data ? true : false;
289
  }
290
 
291
+ }
292
+
293
+
294
+ public function scan($all_attachments)
295
+ {
296
+ $db_optimized_data = get_site_transient("iowd_optimized");
297
+ $db_optimized_data = $db_optimized_data ? $db_optimized_data : array();
298
+
299
+
300
+ // all data
301
+ $media = isset($all_attachments["media"]) ? $all_attachments["media"] : array();
302
+ $media_sizes = isset($all_attachments["media_sizes"]) ? $all_attachments["media_sizes"] : array();
303
+ $other = isset($all_attachments["other"]) ? $all_attachments["other"] : array();
304
+ $unique_attachments = isset($all_attachments["attachments"]) ? $all_attachments["attachments"] : 0;
305
+
306
+ $all_media_sizes = array_merge($media, $media_sizes);
307
+ $all_data_sizes = array_merge($all_media_sizes, $other);
308
+ $all_data = array_unique(array_merge($media, $other));
309
+
310
+ $optimized_data_other = array();
311
+ $optimized_data_media = array();
312
+ $optimized_data_media_sizes = array();
313
+
314
+
315
+ if ($db_optimized_data) {
316
+ foreach ($db_optimized_data as $post_id => $path) {
317
+ $parts = explode("_", $post_id);
318
+
319
+ if (count($parts) == 3 && $parts[0] == "iowd") {
320
+ $optimized_data_other[$post_id] = $path;
321
+ } else {
322
+ if ($parts[1] == "full") {
323
+ $optimized_data_media[$post_id] = $path;
324
+ }
325
+ $optimized_data_media_sizes[$post_id] = $path;
326
+ }
327
  }
328
+
329
  } else {
330
+ $db_optimized_data = array();
331
  }
332
 
333
+ $optimized_data = array_merge($optimized_data_other ,$optimized_data_media);
334
 
335
+ $not_optimized_data = array_diff($all_data, $optimized_data);
336
+ $not_optimized_data_sizes = array_diff($all_data_sizes, $db_optimized_data);
337
+ $not_optimized_data_media = array_diff($media, $optimized_data_media);
338
+ $not_optimized_data_media_sizes = array_diff($all_media_sizes, $optimized_data_media_sizes);
339
+ $not_optimized_data_other = array_diff($other, $optimized_data_other);
340
+
341
+ $all_data_sizes = array_merge($all_data_sizes,$db_optimized_data);
342
+ $all_data = array_merge($all_data, $optimized_data);
343
+
344
+
345
+
346
+ return array(
347
+ "optimized_data" => count($optimized_data),
348
+ "optimized_data_sizes" => count($db_optimized_data),
349
+ "not_optimized_data" => count($not_optimized_data),
350
+ "not_optimized_data_sizes" => count($not_optimized_data_sizes),
351
+ "not_optimized_data_media" => count($unique_attachments),
352
+ "not_optimized_data_media_sizes" => count($not_optimized_data_media_sizes),
353
+ "not_optimized_data_other" => count($not_optimized_data_other),
354
+ "all_data_sizes" => count($all_data_sizes),
355
+ "all_data" => count($all_data),
356
+ );
357
+ }
358
+
359
+ public function scanOld()
360
+ {
361
+ $options = $this->options;
362
+ $db_optimized_data = get_site_transient("iowd_optimized");
363
+ $db_optimized_data = $db_optimized_data ? $db_optimized_data : array();
364
+
365
+ // all data
366
+ global $wpdb;
367
+ $attachments = $wpdb->get_col("SELECT T_POSTMETA.meta_value FROM ". $wpdb->prefix . "posts AS T_POSTS LEFT JOIN ". $wpdb->prefix . "postmeta AS T_POSTMETA ON
368
+ T_POSTS.ID = T_POSTMETA.post_id AND T_POSTMETA.meta_key = '_wp_attachment_metadata' WHERE post_type='attachment' ");
369
+
370
+
371
+ $all_dirs = $options["other_folders"] ? json_decode(htmlspecialchars_decode(stripslashes($options["other_folders"])), true) : array();
372
+
373
+ $other_images = array();
374
+ if (empty($all_dirs) === false) {
375
+ foreach ($all_dirs as $dir => $image_path) {
376
+ foreach ($image_path as $path) {
377
+ $other_images[] = $path;
378
+ }
379
+ }
380
+ }
381
+ $other_images = count(array_unique($other_images));
382
+
383
+
384
+ $optimized_data_other = 0;
385
+ $optimized_data_media = 0;
386
+ $optimized_data_media_sizes = 0;
387
+
388
+ $all_data = count($attachments) + $other_images;
389
+ $all_media_sizes = array_reduce($attachments, function($initial, $value){
390
+
391
+ $value = unserialize($value);
392
+ $initial += 1 + count($value["sizes"]);
393
+
394
+ return $initial;
395
+ });
396
+
397
+ $post_ids = array();
398
+ if($db_optimized_data){
399
+ foreach($db_optimized_data as $post_id => $path){
400
+ $parts = explode("_", $post_id);
401
+ $post_id = $parts[1];
402
+
403
+ if(count($parts) == 3 && $parts[0] == "iowd"){
404
+ $post_id = $path;
405
+ $optimized_data_other++;
406
+ } else {
407
+ if($parts[1] == "full"){
408
+ $optimized_data_media++;
409
+ }
410
+ $optimized_data_media_sizes++;
411
+ }
412
+
413
+ $post_ids[] = $post_id;
414
+ }
415
+ $db_optimized_data = count($db_optimized_data);
416
+ } else {
417
+ $db_optimized_data = 0;
418
+ }
419
+
420
+ $optimized_data = count($post_ids);
421
+ $optimized_data_sizes = $db_optimized_data;
422
+
423
+ $not_optimized_data = $all_data - $optimized_data;
424
+ $not_optimized_data_sizes = $all_media_sizes + $other_images - $optimized_data_sizes;
425
+
426
+ $not_optimized_data_media = count($attachments) - $optimized_data_media;
427
+ $not_optimized_data_media_sizes = $all_media_sizes - $optimized_data_media_sizes;
428
+
429
+ $not_optimized_data_other = $other_images - $optimized_data_other;
430
+ $all_data_sizes = $all_media_sizes + $other_images;
431
+
432
+ return array(
433
+ "optimized_data" => $optimized_data,
434
+ "optimized_data_sizes" => $optimized_data_sizes,
435
+ "not_optimized_data" => $not_optimized_data,
436
+ "not_optimized_data_sizes" => $not_optimized_data_sizes,
437
+ "not_optimized_data_media" => $not_optimized_data_media,
438
+ "not_optimized_data_media_sizes" => $not_optimized_data_media_sizes,
439
+ "not_optimized_data_other" => $not_optimized_data_other,
440
+ "all_data" => $all_data,
441
+ "all_data_sizes" => $all_data_sizes,
442
+ );
443
  }
444
 
445
  private function check_optimization_level($mime_type)
496
  return true;
497
  }
498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  private function get_current_opt_level($path)
500
  {
501
  $options = $this->options;
527
  $post_ids = array();
528
  for ($i = 0; $i < count($images_data); $i++) {
529
  $image_data = $images_data[$i];
530
+ if ($options["keep_originals"] == 1) {
531
+ $this->keep_originals($image_data["file"]);
532
+ }
533
  // if enable resizing
534
  if ($options["enable_resizing"] == 1 || $options["enable_resizing_other"] == 1) {
535
  $resize_data = $this->resize($image_data, $meta);
562
  $db_post_ids = array_unique($db_post_ids);
563
  set_transient("iowd_optimizing_post_ids", $db_post_ids);
564
 
565
+ GuzzleHttp\Promise\settle($response)->wait();
566
  $response = $this->api_call_ajax($data, $s3->folder_name, $s3->sub_folder_name, $s3->credentials, $iteration, $id);
567
  if (isset($response["status"]) && $response["status"] == "error") {
568
  set_transient("iowd_response_error", $response["error"]);
598
 
599
  if ($resized == 0) {
600
  $iowd_image->load_image($item["file"]);
 
 
 
601
  $flag = false;
602
  list($width) = @getimagesize($item["file"]);
603
  if ($item["media"] == 1 && $options["resize_media_images_width"] && $options["resize_media_images_height"] && $width > $options["resize_media_images_width"] && $options["enable_resizing"] == 1 && $item["size"] == "full") {
699
  $_image_size = 0;
700
  $_image_orig_size = 0;
701
  $_image_count = 0;
702
+ $paths = array();
703
  for ($i = 0; $i < count($request); $i++) {
704
  $request_row = $request[$i];
705
  $response_row = isset($body[$request_row["post_id"] . ":" . $request_row["size"]]) ? $body[$request_row["post_id"] . ":" . $request_row["size"]] : false;
751
  $_image_size += $row_data["image_size"];
752
  $_image_orig_size += $img_orig_size;
753
  $_image_count += 1;
754
+ $paths[$request_row["post_id"] . "_" . $request_row["size"]] = $request_row["path"];
755
  }
756
 
757
  $last_optimized_data = get_site_transient("iowd_last_optimized_data");
766
 
767
  set_site_transient("iowd_last_optimized_data", json_encode($last_optimized_data));
768
 
769
+ $db_paths = get_site_transient("iowd_optimized");
770
+ $db_paths = $db_paths ? $db_paths : array();
771
+ $paths = array_merge($db_paths, $paths);
772
+ set_site_transient("iowd_optimized", $paths);
773
+
774
  }
775
 
776
 
includes/iowd-settings.php CHANGED
@@ -479,24 +479,27 @@ class IOWD_Settings
479
 
480
  public static function save_settings()
481
  {
482
- check_admin_referer('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX);
483
- if (isset($_POST["standard_setting"]) && $_POST["standard_setting"]) {
484
- self::save_standard_settings();
485
- } else {
486
- $old_settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
487
- $new_settings = array();
488
- foreach ($old_settings as $setting_key => $setting) {
489
- $new_settings[$setting_key] = isset($_POST[$setting_key]) ? esc_html($_POST[$setting_key]) : $setting;
490
- }
491
- if ($new_settings["scheduled_optimization"] == "0") {
492
- wp_clear_scheduled_hook('iowd_optimize');
493
- }
494
 
495
- update_option(IOWD_PREFIX . "_options", json_encode($new_settings));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  }
497
- $iowd_tabs_active = isset($_POST["iowd_tabs_active"]) ? $_POST["iowd_tabs_active"] : "general";
498
- $ids = isset($_POST["ids"]) ? $_POST["ids"] : "";
499
- IOWD_Helper::redirect(array("page" => "iowd_settings", "msg" => "1", "iowd_tabs_active" => $iowd_tabs_active, "ids" => $ids));
500
  }
501
 
502
  public static function save_standard_settings()
@@ -555,9 +558,7 @@ class IOWD_Settings
555
  $other_folders = json_decode(htmlspecialchars_decode(stripslashes($options["other_folders"])), true);
556
 
557
  $other = empty($other_folders) === false && is_array($other_folders) ? true : false;
558
-
559
- $scan = $optimize->scan(array(), $other);
560
-
561
  $iowd_tabs_active = isset($_REQUEST["iowd_tabs_active"]) ? $_REQUEST["iowd_tabs_active"] : "general";
562
  $iowd_sizes = IOWD_Helper::wp_get_image_sizes();
563
 
@@ -606,6 +607,8 @@ class IOWD_Settings
606
  $msg = __("No agreement found.", IOWD_PREFIX);
607
  } else if ($error == "empty_credentials") {
608
  $msg = __("Empty credentials, please try again.", IOWD_PREFIX);
 
 
609
  }
610
 
611
  if ($msg) {
479
 
480
  public static function save_settings()
481
  {
482
+ if(isset($_POST["action"]) && $_POST["action"] == "save_settings") {
 
 
 
 
 
 
 
 
 
 
 
483
 
484
+ check_admin_referer('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX);
485
+ if (isset($_POST["standard_setting"]) && $_POST["standard_setting"]) {
486
+ self::save_standard_settings();
487
+ } else {
488
+ $old_settings = json_decode(get_option(IOWD_PREFIX . "_options"), true);
489
+ $new_settings = array();
490
+ foreach ($old_settings as $setting_key => $setting) {
491
+ $new_settings[$setting_key] = isset($_POST[$setting_key]) ? esc_html($_POST[$setting_key]) : $setting;
492
+ }
493
+ if ($new_settings["scheduled_optimization"] == "0") {
494
+ wp_clear_scheduled_hook('iowd_optimize');
495
+ }
496
+
497
+ update_option(IOWD_PREFIX . "_options", json_encode($new_settings));
498
+ }
499
+ $iowd_tabs_active = isset($_POST["iowd_tabs_active"]) ? $_POST["iowd_tabs_active"] : "general";
500
+ $ids = isset($_POST["ids"]) ? $_POST["ids"] : "";
501
+ IOWD_Helper::redirect(array("page" => "iowd_settings", "msg" => "1", "iowd_tabs_active" => $iowd_tabs_active, "ids" => $ids));
502
  }
 
 
 
503
  }
504
 
505
  public static function save_standard_settings()
558
  $other_folders = json_decode(htmlspecialchars_decode(stripslashes($options["other_folders"])), true);
559
 
560
  $other = empty($other_folders) === false && is_array($other_folders) ? true : false;
561
+
 
 
562
  $iowd_tabs_active = isset($_REQUEST["iowd_tabs_active"]) ? $_REQUEST["iowd_tabs_active"] : "general";
563
  $iowd_sizes = IOWD_Helper::wp_get_image_sizes();
564
 
607
  $msg = __("No agreement found.", IOWD_PREFIX);
608
  } else if ($error == "empty_credentials") {
609
  $msg = __("Empty credentials, please try again.", IOWD_PREFIX);
610
+ } else if ($error == "no_image_data"){
611
+ $msg = __("No images found, please check your options.", IOWD_PREFIX);
612
  }
613
 
614
  if ($msg) {
io-wd.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: Image Optimizer WD
5
  * Plugin URI: https://web-dorado.com/products/wordpress-image-optimizer.html
6
  * Description: Image Optimizer WordPress plugin enables you to resize, compress and optimize PNG, JPG, GIF files while maintaining image quality.
7
- * Version: 1.0.1
8
  * Author: WebDorado
9
  * Author URI: https://web-dorado.com/
10
  * License: GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
4
  * Plugin Name: Image Optimizer WD
5
  * Plugin URI: https://web-dorado.com/products/wordpress-image-optimizer.html
6
  * Description: Image Optimizer WordPress plugin enables you to resize, compress and optimize PNG, JPG, GIF files while maintaining image quality.
7
+ * Version: 1.0.2
8
  * Author: WebDorado
9
  * Author URI: https://web-dorado.com/
10
  * License: GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
iowd_class.php CHANGED
@@ -8,7 +8,7 @@ class IOWD
8
  {
9
 
10
  protected static $instance = null;
11
- private static $version = '1.0.1';
12
  private static $page;
13
  private $reg_autoloader = false;
14
  private $options = array();
@@ -19,8 +19,8 @@ class IOWD
19
  self::$page = isset($_GET["page"]) ? $_GET["page"] : 'iowd';
20
  $this->options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
21
 
22
- add_action('admin_post_save_settings', array('IOWD_Settings', 'save_settings'));
23
- add_action('admin_post_nopriv_save_settings', array('IOWD_Settings', 'save_settings'));
24
 
25
  // ajax
26
  add_action('wp_ajax_choose_dirs', array($this, 'ajax'));
@@ -38,6 +38,8 @@ class IOWD
38
  add_action('admin_notices', array($this, 'notice'));
39
 
40
  add_action('wp_ajax_get_subdirs', array($this, 'ajax'));
 
 
41
 
42
  // autoloder
43
  add_action('init', array($this, 'register_autoloader'));
8
  {
9
 
10
  protected static $instance = null;
11
+ private static $version = '1.0.2';
12
  private static $page;
13
  private $reg_autoloader = false;
14
  private $options = array();
19
  self::$page = isset($_GET["page"]) ? $_GET["page"] : 'iowd';
20
  $this->options = json_decode(get_option(IOWD_PREFIX . "_options"), true);
21
 
22
+ add_action('admin_init', array('IOWD_Settings', 'save_settings'));
23
+ // add_action('admin_post_nopriv_save_settings', array('IOWD_Settings', 'save_settings'));
24
 
25
  // ajax
26
  add_action('wp_ajax_choose_dirs', array($this, 'ajax'));
38
  add_action('admin_notices', array($this, 'notice'));
39
 
40
  add_action('wp_ajax_get_subdirs', array($this, 'ajax'));
41
+ add_action('wp_ajax_scan', array($this, 'ajax'));
42
+ add_action('wp_ajax_scan_all', array($this, 'ajax'));
43
 
44
  // autoloder
45
  add_action('init', array($this, 'register_autoloader'));
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://web-dorado.com/products/wordpress-image-optimizer.html
4
  Tags: : compress, image, images optimization, performance, photos, lossless, optimize
5
  Requires at least: 3.9
6
  Tested up to: 4.8
7
- Stable tag: 1.0.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -54,6 +54,10 @@ Upgrade to [Image Optimizer WD Pro](https://web-dorado.com/products/wordpress-im
54
 
55
  == Changelog ==
56
 
 
 
 
 
57
  = 1.0.1 =
58
  * Added: Check required PHP version
59
 
4
  Tags: : compress, image, images optimization, performance, photos, lossless, optimize
5
  Requires at least: 3.9
6
  Tested up to: 4.8
7
+ Stable tag: 1.0.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
54
 
55
  == Changelog ==
56
 
57
+ = 1.0.2 =
58
+ * Change: Require PHP 5.5
59
+ * Change: Using AJAX for getting optimizer scan info
60
+
61
  = 1.0.1 =
62
  * Added: Check required PHP version
63
 
views/iowd_settings_display.php CHANGED
@@ -23,7 +23,7 @@ require_once IOWD_DIR_VIEWS . '/iowd_how_it_works_display.php';
23
  <form
24
  method="post"
25
  id="settings_form"
26
- action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
27
  <?php wp_nonce_field('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX); ?>
28
  <div
29
  class="iowd_header">
@@ -89,7 +89,8 @@ require_once IOWD_DIR_VIEWS . '/iowd_how_it_works_display.php';
89
  data-value="balanced"><?php _e("BALANCED", IOWD_PREFIX); ?></div>
90
  <div
91
  class="iowd-standart-cell iowd-btn-disabled"
92
- data-value="extreme" title="<?php _e("This option is disabled in free version.", IOWD_PREFIX); ?>">
 
93
  <?php _e("EXTREME", IOWD_PREFIX); ?>
94
  </div>
95
  </div>
@@ -124,116 +125,95 @@ require_once IOWD_DIR_VIEWS . '/iowd_how_it_works_display.php';
124
  </div>
125
  <?php
126
  } else {
127
- if (empty($attachments) === true && ($scan["not_optimized_data"] > 0 || $scan["not_optimized_data_sizes"] > 0)) { ?>
128
- <div
129
- class="iowd-main">
130
- <span><b>
131
- <?php
132
- echo sprintf(__("There are %u full-size ( totally %u ) images from media library and %u from other directories ready for optimize", IOWD_PREFIX), $scan["not_optimized_data_media"], $scan["not_optimized_data_media_sizes"], $scan["not_optimized_data_other"]);
133
-
134
- ?>
135
- . &nbsp;
136
- </b></span>
137
- </div>
138
- <?php } ?>
139
- <?php if (empty($attachments) === false) {
140
- $attachment_rows = "";
141
- $all_images_count = 0;
142
- for ($i = 0; $i < count($attachments); $i++) {
143
- foreach ($attachments[$i] as $attachment) {
144
- $attachment_rows .= '<div class="attachment-row attachment-row-' . $attachment["post_id"] . '">';
145
- $attachment_rows .= basename($attachment["path"]);
146
- if($attachment["size"] == "full"){
147
- $attachment_rows .= '<span class="iowd_remove_attachment" data-id="' . $attachment["post_id"] . '"> × </span>';
148
- }
149
- $attachment_rows .= '</div>';
150
- $all_images_count++;
151
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  }
153
  ?>
154
- <div
155
- class="iowd-media-seleced-b">
156
- <b><?php echo sprintf(__("You are going to optimize %d (totally %d) media images ", IOWD_PREFIX), count($ids), $all_images_count); ?></b>
157
- </div>
158
- <div
159
- class="iowd-main iowd-media-seleced">
160
  <?php
161
- echo $attachment_rows;
162
- ?>
163
- </div>
164
- <?php } ?>
165
- <div
166
- class="iowd-main">
167
- <?php if ($scan["not_optimized_data"] > 0 || $scan["not_optimized_data_sizes"] > 0 || empty($attachments) === false) {
168
- if ($limitation["already_optimized"] < $limitation["limit"]) {
169
- $optimize_btn_class = "iowd-btn-primary";
170
- $optimize_btn_id = "iowd_optimizing";
171
- $return_false = "";
172
- } else {
173
- $optimize_btn_class = "iowd-btn-disabled";
174
- $optimize_btn_id = "";
175
- $return_false = "onclick='return false;'";
176
- }
177
  ?>
178
- <button
179
- class="iowd-btn <?php echo $optimize_btn_class; ?>"
180
- id="<?php echo $optimize_btn_id; ?>" <?php echo $return_false; ?>>
181
- <?php
182
- if (empty($attachments) === false || $scan["optimized_data"] > 0) {
183
- _e("Optimize Now", IOWD_PREFIX);
184
- } else {
185
- _e("Bulk Optimizing", IOWD_PREFIX);
186
- }
187
- ?>
188
- </button> &nbsp;
189
- <img
190
- src="<?php echo IOWD_URL_IMG . '/spinner.gif'; ?>"
191
- class="iowd-spinner"
192
- style="display:none; vertical-align:sub;"/>
193
- <?php if (empty($attachments) === true) { ?>
194
- <div
195
- class="iowd-help iowd-help-from-media">
196
- <?php _e("You can optimize individual images via your ", IOWD_PREFIX); ?>
197
- <strong><a
198
- href="<?php echo admin_url("upload.php"); ?>"><?php _e("Media Library", IOWD_PREFIX); ?></a></strong>.
199
- </div>
200
- <?php } else {
201
- ?>
202
- <a href="upload.php?page=iowd_settings"
203
- class="iowd-btn iowd-btn-secondary iowd-cancel"
204
- data-cancel-type="<?php echo empty($attachments) === true ? 1 : 0; ?>"><?php _e("Cancel", IOWD_PREFIX); ?></a>
205
- <div
206
- class="iowd-respose-status"></div>
207
- <?php }
208
- } else { ?>
209
  <div
210
- class="iowd-optimized-txt">
211
-
212
- <?php
213
- if ($scan["optimized_data"]) {
214
- echo '<strong class="iowd-up-to-date">';
215
- _e("All images are optimized and up to date.", IOWD_PREFIX);
216
- echo '</strong>';
217
- } else {
218
- echo '<strong>';
219
- _e("Nothing is optimized yet.", IOWD_PREFIX);
220
- echo '</strong>';
221
- }
222
- ?>
223
-
224
  </div>
 
 
 
 
 
 
 
225
  <?php } ?>
 
 
 
 
 
 
226
  <div
227
- class="iowd-loading-bar">
228
- <div
229
- class="iowd-loading-bar-inner"></div>
230
- </div>
231
- <a href="#"
232
- class="iowd-abort">
233
- <?php _e("Cancel", IOWD_PREFIX); ?>
234
- </a>
235
  </div>
236
- <?php
 
 
 
 
 
237
  }
238
  if ($mode == "advanced") {
239
  require_once(IOWD_DIR_VIEWS . '/iowd_settings_form_display.php');
@@ -249,7 +229,8 @@ require_once IOWD_DIR_VIEWS . '/iowd_how_it_works_display.php';
249
  class="iowd-open-dir-tree-btn iowd-btn iowd-btn-small iowd-btn-primary"><?php _e("Select Directory", IOWD_PREFIX); ?></button>
250
  <img
251
  class="iowd_update_dirs"
252
- src="<?php echo IOWD_URL_IMG . "/reset.png"; ?>" title="<?php _e("Update data", IOWD_PREFIX); ?>">
 
253
  <img
254
  src="<?php echo IOWD_URL_IMG; ?>/spinner.gif"
255
  class="iowd-spinner-select"
@@ -267,29 +248,15 @@ require_once IOWD_DIR_VIEWS . '/iowd_how_it_works_display.php';
267
  <div
268
  class="iowd_stat_content">
269
  <h2><?php _e("Statistics", IOWD_PREFIX); ?></h2>
270
- <?php
271
- if ($scan["not_optimized_data"] > 0 || $scan["not_optimized_data_sizes"] > 0) {
272
- $ratio = "<span class='iowd_opt_data'>" . $scan["optimized_data_sizes"] . "</span>/<span class='iowd_all_data'>" . $scan["all_data_sizes"] . "</span>";
273
- $width = ($scan["optimized_data_sizes"] / $scan["all_data_sizes"]) * 100;
274
- $style = 'style="width:' . $width . '%; "';
275
- } else {
276
- $ratio = "<span class='iowd_opt_data'>" . $scan["optimized_data_sizes"] . "</span>/<span class='iowd_all_data'>" . $scan["optimized_data_sizes"] . "</span>";
277
- if($scan["optimized_data_sizes"] == 0){
278
- $style = 'style="width:0%; "';
279
- } else {
280
- $style = 'style="width:100%; "';
281
- }
282
- }
283
- ?>
284
  <div
285
  class="iowd_stat-row">
286
  <div
287
  class="iowd-stat-progress-bar">
288
  <div
289
- class="iowd-stat-progress-bar-inner" <?php echo $style; ?>></div>
290
  </div>
291
  <div
292
- class="iowd-stat-ratio"><?php echo $ratio; ?> </div>
293
  </div>
294
  <div
295
  class="iowd_stat-row">
23
  <form
24
  method="post"
25
  id="settings_form"
26
+ action="">
27
  <?php wp_nonce_field('nonce_' . IOWD_PREFIX, 'nonce_' . IOWD_PREFIX); ?>
28
  <div
29
  class="iowd_header">
89
  data-value="balanced"><?php _e("BALANCED", IOWD_PREFIX); ?></div>
90
  <div
91
  class="iowd-standart-cell iowd-btn-disabled"
92
+ data-value="extreme"
93
+ title="<?php _e("This option is disabled in free version.", IOWD_PREFIX); ?>">
94
  <?php _e("EXTREME", IOWD_PREFIX); ?>
95
  </div>
96
  </div>
125
  </div>
126
  <?php
127
  } else {
128
+ if (empty($attachments) === true) { ?>
129
+ <div
130
+ class="iowd-main iowd-stat-ajax">
131
+ <span><b>&nbsp;</b></span>
132
+ </div>
133
+ <?php } ?>
134
+ <?php if (empty($attachments) === false) {
135
+ $attachment_rows = "";
136
+ $all_images_count = 0;
137
+ for ($i = 0; $i < count($attachments); $i++) {
138
+ foreach ($attachments[$i] as $attachment) {
139
+ $attachment_rows .= '<div class="attachment-row attachment-row-' . $attachment["post_id"] . '">';
140
+ $attachment_rows .= basename($attachment["path"]);
141
+ if ($attachment["size"] == "full") {
142
+ $attachment_rows .= '<span class="iowd_remove_attachment" data-id="' . $attachment["post_id"] . '"> × </span>';
143
+ }
144
+ $attachment_rows .= '</div>';
145
+ $all_images_count++;
146
+ }
147
+ }
148
+ ?>
149
+ <div
150
+ class="iowd-media-seleced-b">
151
+ <b><?php echo sprintf(__("You are going to optimize %d (totally %d) media images ", IOWD_PREFIX), count($ids), $all_images_count); ?></b>
152
+ </div>
153
+ <div
154
+ class="iowd-main iowd-media-seleced">
155
+ <?php
156
+ echo $attachment_rows;
157
+ ?>
158
+ </div>
159
+ <?php } ?>
160
+ <div
161
+ class="iowd-main">
162
+ <div class="iowd-butn-ajax-container"
163
+ data-attachments="<?php echo empty($attachments) ? 0 : 1; ?>" style="display:none;">
164
+ <?php
165
+ if ($limitation["already_optimized"] < $limitation["limit"]) {
166
+ $optimize_btn_class = "iowd-btn-primary";
167
+ $optimize_btn_id = "iowd_optimizing";
168
+ $return_false = "";
169
+ } else {
170
+ $optimize_btn_class = "iowd-btn-disabled";
171
+ $optimize_btn_id = "";
172
+ $return_false = "onclick='return false;'";
173
  }
174
  ?>
175
+ <button
176
+ class="iowd-btn <?php echo $optimize_btn_class; ?>"
177
+ id="<?php echo $optimize_btn_id; ?>" <?php echo $return_false; ?>>
 
 
 
178
  <?php
179
+ _e("Bulk Optimizing", IOWD_PREFIX);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  ?>
181
+ </button>
182
+ &nbsp;
183
+ <img
184
+ src="<?php echo IOWD_URL_IMG . '/spinner.gif'; ?>"
185
+ class="iowd-spinner"
186
+ style="display:none; vertical-align:sub;"/>
187
+ <?php if (empty($attachments) === true) { ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  <div
189
+ class="iowd-help iowd-help-from-media">
190
+ <?php _e("You can optimize individual images via your ", IOWD_PREFIX); ?>
191
+ <strong><a
192
+ href="<?php echo admin_url("upload.php"); ?>"><?php _e("Media Library", IOWD_PREFIX); ?></a></strong>.
 
 
 
 
 
 
 
 
 
 
193
  </div>
194
+ <?php } else {
195
+ ?>
196
+ <a href="upload.php?page=iowd_settings"
197
+ class="iowd-btn iowd-btn-secondary iowd-cancel"
198
+ data-cancel-type="<?php echo empty($attachments) === true ? 1 : 0; ?>"><?php _e("Cancel", IOWD_PREFIX); ?></a>
199
+ <div
200
+ class="iowd-respose-status"></div>
201
  <?php } ?>
202
+ </div>
203
+ <div
204
+ class="iowd-optimized-txt iowd-optimized-ajax-text" style="display:none;">
205
+ </div>
206
+ <div
207
+ class="iowd-loading-bar">
208
  <div
209
+ class="iowd-loading-bar-inner"></div>
 
 
 
 
 
 
 
210
  </div>
211
+ <a href="#"
212
+ class="iowd-abort">
213
+ <?php _e("Cancel", IOWD_PREFIX); ?>
214
+ </a>
215
+ </div>
216
+ <?php
217
  }
218
  if ($mode == "advanced") {
219
  require_once(IOWD_DIR_VIEWS . '/iowd_settings_form_display.php');
229
  class="iowd-open-dir-tree-btn iowd-btn iowd-btn-small iowd-btn-primary"><?php _e("Select Directory", IOWD_PREFIX); ?></button>
230
  <img
231
  class="iowd_update_dirs"
232
+ src="<?php echo IOWD_URL_IMG . "/reset.png"; ?>"
233
+ title="<?php _e("Update data", IOWD_PREFIX); ?>">
234
  <img
235
  src="<?php echo IOWD_URL_IMG; ?>/spinner.gif"
236
  class="iowd-spinner-select"
248
  <div
249
  class="iowd_stat_content">
250
  <h2><?php _e("Statistics", IOWD_PREFIX); ?></h2>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  <div
252
  class="iowd_stat-row">
253
  <div
254
  class="iowd-stat-progress-bar">
255
  <div
256
+ class="iowd-stat-progress-bar-inner"></div>
257
  </div>
258
  <div
259
+ class="iowd-stat-ratio"></div>
260
  </div>
261
  <div
262
  class="iowd_stat-row">