Version Description
- bulk runs now only on media and post pages
- settings page redesign
- client site access test from our servers when activating the API key and warn if site not accessible
- fix last image sometimes unprocessed by bulk
- fix progress bar to advance when skipping images
Download this release
Release Info
Developer | ShortPixel |
Plugin | ShortPixel Image Optimizer |
Version | 3.1.2 |
Comparing to | |
See all releases |
Code changes from version 3.1.1 to 3.1.2
- css/short-pixel.css +85 -0
- js/short-pixel.js +26 -0
- readme.txt +26 -10
- shortpixel_queue.php +24 -4
- shortpixel_view.php +69 -10
- wp-shortpixel.php +95 -55
css/short-pixel.css
CHANGED
@@ -132,3 +132,88 @@ p.settings-info {
|
|
132 |
color: #818181;
|
133 |
font-size:13px;
|
134 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
color: #818181;
|
133 |
font-size:13px;
|
134 |
}
|
135 |
+
|
136 |
+
/* TABS CONTROLS */
|
137 |
+
article.tabs {
|
138 |
+
position: relative;
|
139 |
+
display: block;
|
140 |
+
width: 100%;
|
141 |
+
height: 900px;
|
142 |
+
margin: 2em auto;
|
143 |
+
}
|
144 |
+
article.tabs section {
|
145 |
+
position: absolute;
|
146 |
+
display: block;
|
147 |
+
top: 1.8em;
|
148 |
+
left: 0;
|
149 |
+
height: 900px;
|
150 |
+
width:94%;
|
151 |
+
padding: 10px 20px;
|
152 |
+
background-color: #ddd;
|
153 |
+
/* border-radius: 5px; */
|
154 |
+
box-shadow: 0 3px 3px rgba(0,0,0,0.1);
|
155 |
+
z-index: 0;
|
156 |
+
}
|
157 |
+
article.tabs section:first-child {
|
158 |
+
z-index: 1;
|
159 |
+
}
|
160 |
+
article.tabs section h2 {
|
161 |
+
position: absolute;
|
162 |
+
font-size: 1.3em;
|
163 |
+
font-weight: normal;
|
164 |
+
width: 180px;
|
165 |
+
height: 1.8em;
|
166 |
+
top: -1.8em;
|
167 |
+
left: 10px;
|
168 |
+
padding: 0;
|
169 |
+
margin: 0;
|
170 |
+
color: #999;
|
171 |
+
background-color: #ddd;
|
172 |
+
/* border-radius: 5px 5px 0 0; */
|
173 |
+
}
|
174 |
+
article.tabs section:nth-child(2) h2 {
|
175 |
+
left: 192px;
|
176 |
+
}
|
177 |
+
article.tabs section:nth-child(3) h2 {
|
178 |
+
left: 374px;
|
179 |
+
}
|
180 |
+
article.tabs section h2 a {
|
181 |
+
display: block;
|
182 |
+
width: 100%;
|
183 |
+
line-height: 1.8em;
|
184 |
+
text-align: center;
|
185 |
+
text-decoration: none;
|
186 |
+
color: inherit;
|
187 |
+
outline: 0 none;
|
188 |
+
}
|
189 |
+
article.tabs section h2 a:focus,
|
190 |
+
article.tabs section#tab-resources a:focus {
|
191 |
+
box-shadow: none;
|
192 |
+
outline: none;
|
193 |
+
}
|
194 |
+
article.tabs section.sel-tab,
|
195 |
+
article.tabs section.sel-tab h2 {
|
196 |
+
color: #333;
|
197 |
+
background-color: #fff;
|
198 |
+
z-index: 2;
|
199 |
+
}
|
200 |
+
/*article.tabs section,
|
201 |
+
article.tabs section h2 {
|
202 |
+
-webkit-transition: all 500ms ease;
|
203 |
+
-moz-transition: all 500ms ease;
|
204 |
+
-ms-transition: all 500ms ease;
|
205 |
+
-o-transition: all 500ms ease;
|
206 |
+
transition: all 500ms ease;
|
207 |
+
}
|
208 |
+
*/
|
209 |
+
/* Resources */
|
210 |
+
section#tab-resources .col-md-6 {
|
211 |
+
display: inline-block;
|
212 |
+
width: 45%;
|
213 |
+
}
|
214 |
+
section#tab-resources .text-center {
|
215 |
+
text-align: center;
|
216 |
+
}
|
217 |
+
section#tab-resources p {
|
218 |
+
font-size: 16px;
|
219 |
+
}
|
js/short-pixel.js
CHANGED
@@ -78,6 +78,25 @@ function checkQuotaExceededAlert() {
|
|
78 |
* calls itself until receives an Empty queue message
|
79 |
*/
|
80 |
function checkBulkProgress() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
//if I'm not the bulk processor, check every 20 sec. if the bulk processor is running, otherwise take the role
|
82 |
if(ShortPixel.bulkProcessor == true || typeof localStorage.bulkTime == 'undefined' || Math.floor(Date.now() / 1000) - localStorage.bulkTime > 90) {
|
83 |
ShortPixel.bulkProcessor = true;
|
@@ -128,6 +147,7 @@ function checkBulkProcessingCallApi(){
|
|
128 |
setCellMessage(id, data["Message"]);
|
129 |
if(isBulkPage) {
|
130 |
showToolBarAlert(ShortPixel.STATUS_FAIL, data["Message"]);
|
|
|
131 |
}
|
132 |
console.log(data["Message"]);
|
133 |
setTimeout(checkBulkProgress, 5000);
|
@@ -167,6 +187,9 @@ function checkBulkProcessingCallApi(){
|
|
167 |
case ShortPixel.STATUS_ERROR: //for error and skip also we retry
|
168 |
case ShortPixel.STATUS_SKIP:
|
169 |
console.log('Server response: ' + response);
|
|
|
|
|
|
|
170 |
setTimeout(checkBulkProgress, 5000);
|
171 |
break;
|
172 |
}
|
@@ -177,6 +200,9 @@ function checkBulkProcessingCallApi(){
|
|
177 |
function clearBulkProcessor(){
|
178 |
ShortPixel.bulkProcessor = false; //nothing to process, leave the role. Next page load will check again
|
179 |
localStorage.bulkTime = 0;
|
|
|
|
|
|
|
180 |
}
|
181 |
|
182 |
function setCellMessage(id, message){
|
78 |
* calls itself until receives an Empty queue message
|
79 |
*/
|
80 |
function checkBulkProgress() {
|
81 |
+
if( window.location.href.search("wp-admin/upload.php") < 0
|
82 |
+
&& window.location.href.search("wp-admin/edit.php") < 0
|
83 |
+
&& window.location.href.search("wp-admin/edit-tags.php") < 0
|
84 |
+
&& window.location.href.search("wp-admin/post-new.php") < 0
|
85 |
+
&& window.location.href.search("wp-admin/post.php") < 0) return;
|
86 |
+
|
87 |
+
//if i'm the bulk processor and i'm not the bulk page and a bulk page comes around, leave the bulk processor role
|
88 |
+
if(ShortPixel.bulkProcessor == true && window.location.href.search("wp-short-pixel-bulk") < 0
|
89 |
+
&& typeof localStorage.bulkPage !== 'undefined' && localStorage.bulkPage > 0) {
|
90 |
+
ShortPixel.bulkProcessor = false;
|
91 |
+
}
|
92 |
+
|
93 |
+
//if i'm the bulk page, steal the bulk processor
|
94 |
+
if( window.location.href.search("wp-short-pixel-bulk") >= 0 ) {
|
95 |
+
ShortPixel.bulkProcessor = true;
|
96 |
+
localStorage.bulkTime = Math.floor(Date.now() / 1000);
|
97 |
+
localStorage.bulkPage = 1;
|
98 |
+
}
|
99 |
+
|
100 |
//if I'm not the bulk processor, check every 20 sec. if the bulk processor is running, otherwise take the role
|
101 |
if(ShortPixel.bulkProcessor == true || typeof localStorage.bulkTime == 'undefined' || Math.floor(Date.now() / 1000) - localStorage.bulkTime > 90) {
|
102 |
ShortPixel.bulkProcessor = true;
|
147 |
setCellMessage(id, data["Message"]);
|
148 |
if(isBulkPage) {
|
149 |
showToolBarAlert(ShortPixel.STATUS_FAIL, data["Message"]);
|
150 |
+
progressUpdate(data["BulkPercent"], data["BulkMsg"]);
|
151 |
}
|
152 |
console.log(data["Message"]);
|
153 |
setTimeout(checkBulkProgress, 5000);
|
187 |
case ShortPixel.STATUS_ERROR: //for error and skip also we retry
|
188 |
case ShortPixel.STATUS_SKIP:
|
189 |
console.log('Server response: ' + response);
|
190 |
+
if(isBulkPage && typeof data["BulkPercent"] !== 'undefined') {
|
191 |
+
progressUpdate(data["BulkPercent"], data["BulkMsg"]);
|
192 |
+
}
|
193 |
setTimeout(checkBulkProgress, 5000);
|
194 |
break;
|
195 |
}
|
200 |
function clearBulkProcessor(){
|
201 |
ShortPixel.bulkProcessor = false; //nothing to process, leave the role. Next page load will check again
|
202 |
localStorage.bulkTime = 0;
|
203 |
+
if(window.location.href.search("wp-short-pixel-bulk") >= 0) {
|
204 |
+
localStorage.bulkPage = 0;
|
205 |
+
}
|
206 |
}
|
207 |
|
208 |
function setCellMessage(id, message){
|
readme.txt
CHANGED
@@ -5,7 +5,7 @@ Tags: picture, optimization, image editor, pngout, upload speed, shortpixel, co
|
|
5 |
|
6 |
Requires at least: 3.0.1
|
7 |
Tested up to: 4.3
|
8 |
-
Stable tag: 3.1.
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
@@ -25,6 +25,7 @@ Both new and old images can be optimized with ShortPixel. Once activated, the pl
|
|
25 |
|
26 |
* all types of image formats PNG, JPG, GIF (still and animated) and PDF
|
27 |
* thumbnails and featured images are also optimized
|
|
|
28 |
* free 100 image credits/month. Images that are optimized less that 5% are bonus
|
29 |
* no file size limit
|
30 |
* originals are saved in a backup folder and can be manually restored
|
@@ -41,6 +42,8 @@ Both monthly subscriptions and one-time plans are available. The same plan can b
|
|
41 |
|
42 |
We believe in a better society, so we support educational non-profits. <a href="http://shortpixel.com/contact">Contact us</a> and we’ll see how we can help!
|
43 |
|
|
|
|
|
44 |
|
45 |
**Why use ShortPixel to optimize you images?**
|
46 |
|
@@ -55,18 +58,17 @@ Read more about how <a href="http://googlewebmastercentral.blogspot.ro/2010/04/u
|
|
55 |
|
56 |
**New features coming soon:**
|
57 |
|
58 |
-
* Affiliate system
|
59 |
* support for NextGen Galley
|
60 |
* mass restore for backed-up images
|
61 |
|
62 |
|
63 |
**Get in touch!**
|
64 |
|
65 |
-
|
66 |
-
Twitter <a href="https://twitter.com/shortpixel">https://twitter.com/shortpixel</a>
|
67 |
-
Google+ <a href="https://www.google.com/+Shortpixelpage">https://www.google.com/+Shortpixelpage</a>
|
68 |
-
Facebook <a href="https://www.facebook.com/ShortPixel">https://www.facebook.com/ShortPixel</a>
|
69 |
-
LinkedIn <a href="https://www.linkedin.com/company/shortpixel">https://www.linkedin.com/company/shortpixel</a>
|
70 |
|
71 |
|
72 |
== Installation ==
|
@@ -134,7 +136,13 @@ Yes, privacy is guaranteed. The ShortPixel encryption process doesn't allow anyo
|
|
134 |
|
135 |
= What happens with my original images after they have been processed with ShortPixel? =
|
136 |
|
137 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
|
139 |
= What types of formats can be optimized? =
|
140 |
|
@@ -160,10 +168,18 @@ The ShortPixel team is here to help. <a href="https://shortpixel.com/contact">Co
|
|
160 |
|
161 |
== Changelog ==
|
162 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
= 3.1.1 =
|
164 |
|
165 |
-
* fix calculation of displayed images to be processed
|
166 |
-
* restore option appeared wrongly sometimes - thanks to Bogdan Günther @ http://medianotions.de
|
167 |
|
168 |
= 3.1.0 =
|
169 |
|
5 |
|
6 |
Requires at least: 3.0.1
|
7 |
Tested up to: 4.3
|
8 |
+
Stable tag: 3.1.2
|
9 |
License: GPLv2 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
11 |
|
25 |
|
26 |
* all types of image formats PNG, JPG, GIF (still and animated) and PDF
|
27 |
* thumbnails and featured images are also optimized
|
28 |
+
* CMYK to RGB conversion
|
29 |
* free 100 image credits/month. Images that are optimized less that 5% are bonus
|
30 |
* no file size limit
|
31 |
* originals are saved in a backup folder and can be manually restored
|
42 |
|
43 |
We believe in a better society, so we support educational non-profits. <a href="http://shortpixel.com/contact">Contact us</a> and we’ll see how we can help!
|
44 |
|
45 |
+
Help us spread a the word by recommending ShortPixel to your friends and collect 100 additional image credits for each referred sign up.
|
46 |
+
Make money by promoting a great plugin with our <a href="https://shortpixel.com/free-sign-up-affiliate">50/50 affiliate program</a>.
|
47 |
|
48 |
**Why use ShortPixel to optimize you images?**
|
49 |
|
58 |
|
59 |
**New features coming soon:**
|
60 |
|
|
|
61 |
* support for NextGen Galley
|
62 |
* mass restore for backed-up images
|
63 |
|
64 |
|
65 |
**Get in touch!**
|
66 |
|
67 |
+
* Email <a href="https://shortpixel.com/contact">https://shortpixel.com/contact</a>
|
68 |
+
* Twitter <a href="https://twitter.com/shortpixel">https://twitter.com/shortpixel</a>
|
69 |
+
* Google+ <a href="https://www.google.com/+Shortpixelpage">https://www.google.com/+Shortpixelpage</a>
|
70 |
+
* Facebook <a href="https://www.facebook.com/ShortPixel">https://www.facebook.com/ShortPixel</a>
|
71 |
+
* LinkedIn <a href="https://www.linkedin.com/company/shortpixel">https://www.linkedin.com/company/shortpixel</a>
|
72 |
|
73 |
|
74 |
== Installation ==
|
136 |
|
137 |
= What happens with my original images after they have been processed with ShortPixel? =
|
138 |
|
139 |
+
If you didn't make any changes in the plugin Settings and you left the 'Image backup' option checked, the originals will be located in a backup folder at:
|
140 |
+
|
141 |
+
/wp-content/uploads/ShortpixelBackups
|
142 |
+
|
143 |
+
After optimization, if you want to switch back to a certain original image, hit Restore backup in the Media Library. If you are happy with the optimized images, you can deactivate saving the backups in the plugin Settings.
|
144 |
+
|
145 |
+
|
146 |
|
147 |
= What types of formats can be optimized? =
|
148 |
|
168 |
|
169 |
== Changelog ==
|
170 |
|
171 |
+
= 3.1.2 =
|
172 |
+
|
173 |
+
* bulk runs now only on media and post pages
|
174 |
+
* settings page redesign
|
175 |
+
* client site access test from our servers when activating the API key and warn if site not accessible
|
176 |
+
* fix last image sometimes unprocessed by bulk
|
177 |
+
* fix progress bar to advance when skipping images
|
178 |
+
|
179 |
= 3.1.1 =
|
180 |
|
181 |
+
* fix calculation of displayed counters of images to be processed on bulk start
|
182 |
+
* fix restore option that appeared wrongly sometimes - thanks to Bogdan Günther @ http://medianotions.de
|
183 |
|
184 |
= 3.1.0 =
|
185 |
|
shortpixel_queue.php
CHANGED
@@ -198,8 +198,16 @@ class ShortPixelQueue {
|
|
198 |
}
|
199 |
|
200 |
public function pauseBulk() {
|
201 |
-
|
|
|
|
|
202 |
WPShortPixel::log("PAUSE: Pointer = ".get_option( 'wp-short-pixel-cancel-pointer'));
|
|
|
|
|
|
|
|
|
|
|
|
|
203 |
$this->stopBulk();
|
204 |
}
|
205 |
|
@@ -241,15 +249,27 @@ class ShortPixelQueue {
|
|
241 |
public static function resetBulk() {
|
242 |
delete_option('bulkProcessingStatus');
|
243 |
delete_option( 'wp-short-pixel-cancel-pointer');
|
|
|
244 |
$startBulkId = $stopBulkId = WPShortPixel::getMaxMediaId();
|
245 |
update_option( 'wp-short-pixel-query-id-stop', $startBulkId );
|
246 |
update_option( 'wp-short-pixel-query-id-start', $startBulkId );
|
247 |
-
|
248 |
-
|
249 |
-
|
|
|
|
|
250 |
delete_option( "wp-short-pixel-bulk-processed-items");
|
|
|
|
|
251 |
}
|
252 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
253 |
public function logBulkProgress() {
|
254 |
$t = time();
|
255 |
$this->incrementBulkCurrentlyProcessed();
|
198 |
}
|
199 |
|
200 |
public function pauseBulk() {
|
201 |
+
$cancelPointer = $this->startBulkId;
|
202 |
+
$bulkStartId = $this->getFlagBulkId();
|
203 |
+
update_option( 'wp-short-pixel-cancel-pointer', $cancelPointer);//we save this so we can resume bulk processing
|
204 |
WPShortPixel::log("PAUSE: Pointer = ".get_option( 'wp-short-pixel-cancel-pointer'));
|
205 |
+
//remove the bulk items from prio queue
|
206 |
+
foreach($this->get() as $qItem) {
|
207 |
+
if($qItem < $bulkStartId) {
|
208 |
+
$this->remove($qItem);
|
209 |
+
}
|
210 |
+
}
|
211 |
$this->stopBulk();
|
212 |
}
|
213 |
|
249 |
public static function resetBulk() {
|
250 |
delete_option('bulkProcessingStatus');
|
251 |
delete_option( 'wp-short-pixel-cancel-pointer');
|
252 |
+
delete_option( "wp-short-pixel-flag-id");
|
253 |
$startBulkId = $stopBulkId = WPShortPixel::getMaxMediaId();
|
254 |
update_option( 'wp-short-pixel-query-id-stop', $startBulkId );
|
255 |
update_option( 'wp-short-pixel-query-id-start', $startBulkId );
|
256 |
+
delete_option( "wp-short-pixel-bulk-previous-percent");
|
257 |
+
delete_option( "wp-short-pixel-bulk-processed-items");
|
258 |
+
delete_option('wp-short-pixel-bulk-running-time');
|
259 |
+
delete_option('wp-short-pixel-last-bulk-start-time');
|
260 |
+
delete_option('wp-short-pixel-last-bulk-success-time');
|
261 |
delete_option( "wp-short-pixel-bulk-processed-items");
|
262 |
+
delete_option( "wp-short-pixel-bulk-count");
|
263 |
+
delete_option( "wp-short-pixel-bulk-done-count");
|
264 |
}
|
265 |
|
266 |
+
public static function resetPrio() {
|
267 |
+
delete_option( "wp-short-pixel-priorityQueue");
|
268 |
+
if(isset($_SESSION["wp-short-pixel-priorityQueue"])){
|
269 |
+
unset($_SESSION["wp-short-pixel-priorityQueue"]);
|
270 |
+
}
|
271 |
+
}
|
272 |
+
|
273 |
public function logBulkProgress() {
|
274 |
$t = time();
|
275 |
$this->incrementBulkCurrentlyProcessed();
|
shortpixel_view.php
CHANGED
@@ -120,8 +120,9 @@ class ShortPixelView {
|
|
120 |
<div class="wrap short-pixel-bulk-page">
|
121 |
<h1>Bulk Image Optimization by ShortPixel</h1>
|
122 |
<p>Bulk optimization has started.<br>
|
123 |
-
|
124 |
-
|
|
|
125 |
<?=$this->displayBulkProgressBar(true, $percent, $message)?>
|
126 |
<div class="bulk-progress bulk-slider-container">
|
127 |
<div style="margin-bottom: 10px;"><span class="short-pixel-block-title">Just optimized:</span></div>
|
@@ -203,6 +204,55 @@ class ShortPixelView {
|
|
203 |
<?php
|
204 |
}
|
205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
public function displaySettingsForm($quotaData) {
|
207 |
$checked = ($this->ctrl->processThumbnails() ? 'checked' : '');
|
208 |
$checkedBackupImages = ($this->ctrl->backupImages() ? 'checked' : '');
|
@@ -211,7 +261,12 @@ class ShortPixelView {
|
|
211 |
$resizeDisabled = ($this->ctrl->getResizeImages() ? '' : 'disabled');
|
212 |
$minSizes = $this->ctrl->getMaxIntermediateImageSize();
|
213 |
?>
|
214 |
-
|
|
|
|
|
|
|
|
|
|
|
215 |
<table class="form-table">
|
216 |
<tbody>
|
217 |
<tr>
|
@@ -283,8 +338,8 @@ class ShortPixelView {
|
|
283 |
</tbody>
|
284 |
</table>
|
285 |
<p class="submit">
|
286 |
-
<input type="submit" name="save" id="save" class="button button-primary" title="Save Changes" value="Save Changes">
|
287 |
-
<
|
288 |
</p>
|
289 |
</form>
|
290 |
<script>
|
@@ -332,8 +387,8 @@ class ShortPixelView {
|
|
332 |
<?php
|
333 |
}
|
334 |
|
335 |
-
function displaySettingsStats($averageCompression, $savedSpace, $savedBandwidth,
|
336 |
-
$
|
337 |
<a id="facts"></a>
|
338 |
<h3>Your ShortPixel Stats</h3>
|
339 |
<table class="form-table">
|
@@ -361,7 +416,7 @@ class ShortPixelView {
|
|
361 |
<tr>
|
362 |
<th scope="row" bgcolor="#ffffff"><label for="apiQuota">Your ShortPixel plan</label></th>
|
363 |
<td bgcolor="#ffffff">
|
364 |
-
|
365 |
<a href="https://shortpixel.com/login/<?=$this->ctrl->getApiKey()?>/tell-a-friend" target="_blank">Join our friend referral system</a> to win more credits. For each user that joins, you receive +100 images credits/month.
|
366 |
</td>
|
367 |
</tr>
|
@@ -380,7 +435,7 @@ class ShortPixelView {
|
|
380 |
</tbody>
|
381 |
</table>
|
382 |
|
383 |
-
<p style="padding-top: 0px; color: #818181;" >** Increase your image quota by <a href="https://shortpixel.com/login/<?=$this->ctrl->getApiKey()?>" target="_blank">upgrading
|
384 |
|
385 |
<table class="form-table">
|
386 |
<tbody>
|
@@ -400,6 +455,10 @@ class ShortPixelView {
|
|
400 |
</tr>
|
401 |
<?php } ?>
|
402 |
</tbody>
|
403 |
-
</table>
|
|
|
|
|
|
|
|
|
404 |
}
|
405 |
}
|
120 |
<div class="wrap short-pixel-bulk-page">
|
121 |
<h1>Bulk Image Optimization by ShortPixel</h1>
|
122 |
<p>Bulk optimization has started.<br>
|
123 |
+
This process will take some time, depending on the number of images in your library. In the meantime, you can continue using
|
124 |
+
the admin as usual, <a href='<?=get_admin_url()?>' target='_blank'>in a different browser window or tab</a>.<br>
|
125 |
+
However, <strong>if you close this window, the bulk processing will pause</strong> until you open the media gallery or the ShortPixel bulk page again. </p>
|
126 |
<?=$this->displayBulkProgressBar(true, $percent, $message)?>
|
127 |
<div class="bulk-progress bulk-slider-container">
|
128 |
<div style="margin-bottom: 10px;"><span class="short-pixel-block-title">Just optimized:</span></div>
|
204 |
<?php
|
205 |
}
|
206 |
|
207 |
+
function displaySettings($quotaData, $notice, $resources = null, $averageCompression = null, $savedSpace = null, $savedBandwidth = null,
|
208 |
+
$remainingImages = null, $totalCallsMade = null, $fileCount = null, $backupFolderSize = null) {
|
209 |
+
//wp_enqueue_script('jquery.idTabs.js', plugins_url('/js/jquery.idTabs.js',__FILE__) );
|
210 |
+
?>
|
211 |
+
<h1>ShortPixel Plugin Settings</h1>
|
212 |
+
<p>
|
213 |
+
<a href="https://shortpixel.com" target="_blank">ShortPixel.com</a> |
|
214 |
+
<a href="https://wordpress.org/plugins/shortpixel-image-optimiser/installation/" target="_blank">Installation </a> |
|
215 |
+
<a href="https://shortpixel.com/contact" target="_blank">Support </a>
|
216 |
+
</p>
|
217 |
+
<?php if($notice !== null) { ?>
|
218 |
+
<br/>
|
219 |
+
<div style="background-color: #fff; border-left: 4px solid <?=$notice['status'] == 'error' ? '#ff0000' : ($notice['status'] == 'warn' ? '#FFC800' : '#7ad03a')?>; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); padding: 1px 12px;;width: 95%">
|
220 |
+
<p><?=$notice['msg']?></p>
|
221 |
+
</div>
|
222 |
+
<?php } ?>
|
223 |
+
|
224 |
+
<article class="tabs">
|
225 |
+
<section class='sel-tab' id="tab-settings">
|
226 |
+
<h2><a class='tab-link' href='javascript:void(0);' data-id="tab-settings">Settings</a></h2>
|
227 |
+
<?php $this->displaySettingsForm($quotaData);?>
|
228 |
+
</section> <?php
|
229 |
+
if($averageCompression !== null) {?>
|
230 |
+
<section id="tab-stats">
|
231 |
+
<h2><a class='tab-link' href='javascript:void(0);' data-id="tab-stats">Statistics</a></h2>
|
232 |
+
<?php
|
233 |
+
$this->displaySettingsStats($quotaData, $averageCompression, $savedSpace, $savedBandwidth,
|
234 |
+
$remainingImages, $totalCallsMade, $fileCount, $backupFolderSize);?>
|
235 |
+
</section>
|
236 |
+
<?php }
|
237 |
+
if($resources !== null) {?>
|
238 |
+
<section id="tab-resources">
|
239 |
+
<h2><a class='tab-link' href='javascript:void(0);' data-id="tab-resources">WP Resources</a></h2>
|
240 |
+
<?=(isset($resources['body']) ? $resources['body'] : "Please reload")?>
|
241 |
+
</section>
|
242 |
+
<?php } ?>
|
243 |
+
</article>
|
244 |
+
<script>
|
245 |
+
jQuery(document).ready(function () {
|
246 |
+
jQuery("a.tab-link").click(function(){
|
247 |
+
var target = jQuery(this).data("id");
|
248 |
+
jQuery("section").removeClass("sel-tab");
|
249 |
+
jQuery("section#" +target).addClass("sel-tab");
|
250 |
+
});
|
251 |
+
});
|
252 |
+
</script>
|
253 |
+
<?php
|
254 |
+
}
|
255 |
+
|
256 |
public function displaySettingsForm($quotaData) {
|
257 |
$checked = ($this->ctrl->processThumbnails() ? 'checked' : '');
|
258 |
$checkedBackupImages = ($this->ctrl->backupImages() ? 'checked' : '');
|
261 |
$resizeDisabled = ($this->ctrl->getResizeImages() ? '' : 'disabled');
|
262 |
$minSizes = $this->ctrl->getMaxIntermediateImageSize();
|
263 |
?>
|
264 |
+
<?php if($this->ctrl->getVerifiedKey()) { ?>
|
265 |
+
<p>New images uploaded to the Media Library will be optimized automatically.<br/>If you have existing images you would like to optimize, you can use the <a href="' . get_admin_url() . 'upload.php?page=wp-short-pixel-bulk">Bulk Optimization Tool</a>.</p>
|
266 |
+
<?php } else { ?>
|
267 |
+
<p>Please enter here the API Key provided by ShortPixel:</p>
|
268 |
+
<?php } ?>
|
269 |
+
<form name='wp_shortpixel_options' action='options-general.php?page=wp-shortpixel&noheader=true' method='post' id='wp_shortpixel_options'>
|
270 |
<table class="form-table">
|
271 |
<tbody>
|
272 |
<tr>
|
338 |
</tbody>
|
339 |
</table>
|
340 |
<p class="submit">
|
341 |
+
<input type="submit" name="save" id="save" class="button button-primary" title="Save Changes" value="Save Changes">
|
342 |
+
<input type="submit" name="save" id="bulk" class="button button-primary" title="Save and go to the Bulk Processing page" value="Bulk Process">
|
343 |
</p>
|
344 |
</form>
|
345 |
<script>
|
387 |
<?php
|
388 |
}
|
389 |
|
390 |
+
function displaySettingsStats($quotaData, $averageCompression, $savedSpace, $savedBandwidth,
|
391 |
+
$remainingImages, $totalCallsMade, $fileCount, $backupFolderSize) { ?>
|
392 |
<a id="facts"></a>
|
393 |
<h3>Your ShortPixel Stats</h3>
|
394 |
<table class="form-table">
|
416 |
<tr>
|
417 |
<th scope="row" bgcolor="#ffffff"><label for="apiQuota">Your ShortPixel plan</label></th>
|
418 |
<td bgcolor="#ffffff">
|
419 |
+
<?=$quotaData['APICallsQuota']?>/month, renews in <?=floor(30 + (strtotime($quotaData['APILastRenewalDate']) - time()) / 86400)?> days, on <?=date('M d, Y', strtotime($quotaData['APILastRenewalDate']. ' + 30 days'))?> ( <a href="https://shortpixel.com/login/<?=$this->ctrl->getApiKey();?>" target="_blank">Need More? See the options available</a> )<br/>
|
420 |
<a href="https://shortpixel.com/login/<?=$this->ctrl->getApiKey()?>/tell-a-friend" target="_blank">Join our friend referral system</a> to win more credits. For each user that joins, you receive +100 images credits/month.
|
421 |
</td>
|
422 |
</tr>
|
435 |
</tbody>
|
436 |
</table>
|
437 |
|
438 |
+
<p style="padding-top: 0px; color: #818181;" >** Increase your image quota by <a href="https://shortpixel.com/login/<?=$this->ctrl->getApiKey()?>" target="_blank">upgrading your ShortPixel plan.</a></p>
|
439 |
|
440 |
<table class="form-table">
|
441 |
<tbody>
|
455 |
</tr>
|
456 |
<?php } ?>
|
457 |
</tbody>
|
458 |
+
</table>
|
459 |
+
<div style="display:none">
|
460 |
+
|
461 |
+
</div>
|
462 |
+
<?php
|
463 |
}
|
464 |
}
|
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 > ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
|
6 |
-
* Version: 3.1.
|
7 |
* Author: ShortPixel
|
8 |
* Author URI: https://shortpixel.com
|
9 |
*/
|
@@ -21,7 +21,7 @@ define('SP_RESET_ON_ACTIVATE', false);
|
|
21 |
|
22 |
define('SP_AFFILIATE_CODE', '');
|
23 |
|
24 |
-
define('PLUGIN_VERSION', "3.1.
|
25 |
define('SP_MAX_TIMEOUT', 10);
|
26 |
define('SP_BACKUP', 'ShortpixelBackups');
|
27 |
define('SP_BACKUP_FOLDER', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . SP_BACKUP);
|
@@ -140,16 +140,30 @@ class WPShortPixel {
|
|
140 |
{
|
141 |
self::shortPixelDeactivatePlugin();
|
142 |
if(SP_RESET_ON_ACTIVATE === true && WP_DEBUG === true) { //force reset plugin counters, only on specific occasions and on test environments
|
143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
update_option( 'wp-short-pixel-thumbnail-count', 0);
|
145 |
update_option( 'wp-short-pixel-files-under-5-percent', 0);
|
146 |
update_option( 'wp-short-pixel-savedSpace', 0);
|
|
|
|
|
|
|
|
|
147 |
update_option( 'wp-short-pixel-api-retries', 0);//sometimes we need to retry processing/downloading a file multiple times
|
148 |
update_option( 'wp-short-pixel-quota-exceeded', 0);
|
149 |
-
|
150 |
-
update_option( 'wp-short-pixel-total-optimized', 0);//amount of optimized
|
151 |
update_option( 'wp-short-pixel-bulk-ever-ran', 0);
|
|
|
152 |
delete_option('wp-short-pixel-priorityQueue');
|
|
|
|
|
|
|
|
|
153 |
if(isset($_SESSION["wp-short-pixel-priorityQueue"])) {
|
154 |
unset($_SESSION["wp-short-pixel-priorityQueue"]);
|
155 |
}
|
@@ -165,6 +179,7 @@ class WPShortPixel {
|
|
165 |
{
|
166 |
include_once dirname( __FILE__ ) . '/shortpixel_queue.php';
|
167 |
ShortPixelQueue::resetBulk();
|
|
|
168 |
delete_option('wp-short-pixel-activation-notice');
|
169 |
}
|
170 |
|
@@ -258,6 +273,11 @@ class WPShortPixel {
|
|
258 |
$blank = '_blank';
|
259 |
//$icon = "shortpixel-alert.png";
|
260 |
}
|
|
|
|
|
|
|
|
|
|
|
261 |
self::log("TB: Start: " . $this->prioQ->getStartBulkId() . ", stop: " . $this->prioQ->getStopBulkId() . " PrioQ: "
|
262 |
.json_encode($this->prioQ->get()));
|
263 |
|
@@ -284,7 +304,7 @@ class WPShortPixel {
|
|
284 |
$action = $wp_list_table->current_action();
|
285 |
|
286 |
switch($action) {
|
287 |
-
|
288 |
case 'short-pixel-bulk':
|
289 |
// security check
|
290 |
check_admin_referer('bulk-media');
|
@@ -294,7 +314,7 @@ class WPShortPixel {
|
|
294 |
$mediaIds = array_reverse($_GET['media']);
|
295 |
foreach( $mediaIds as $ID ) {
|
296 |
$meta = wp_get_attachment_metadata($ID);
|
297 |
-
if( (!isset($meta['ShortPixel']) ||
|
298 |
&& (!isset($meta['ShortPixelImprovement']) || $meta['ShortPixelImprovement'] != 'Optimization N/A')) {
|
299 |
$this->prioQ->push($ID);
|
300 |
$meta['ShortPixel']['WaitingProcessing'] = true;
|
@@ -359,12 +379,12 @@ class WPShortPixel {
|
|
359 |
}
|
360 |
$idList = array();
|
361 |
for ($sanityCheck = 0, $crtStartQueryID = $startQueryID;
|
362 |
-
$crtStartQueryID
|
363 |
|
364 |
self::log("GETDB: current StartID: " . $crtStartQueryID);
|
365 |
|
366 |
$queryPostMeta = "SELECT * FROM " . $wpdb->prefix . "postmeta
|
367 |
-
WHERE ( post_id <= $crtStartQueryID AND post_id
|
368 |
AND ( meta_key = '_wp_attached_file' OR meta_key = '_wp_attachment_metadata' )
|
369 |
ORDER BY post_id DESC
|
370 |
LIMIT " . SP_MAX_RESULTS_QUERY;
|
@@ -425,14 +445,16 @@ class WPShortPixel {
|
|
425 |
}
|
426 |
|
427 |
public function handleImageProcessing($ID = null) {
|
428 |
-
//die("
|
429 |
//0: check key
|
430 |
if( $this->_verifiedKey == false) {
|
431 |
if($ID == null){
|
432 |
$ids = $this->getFromPrioAndCheck();
|
433 |
$ID = (count($ids) > 0 ? $ids[0] : null);
|
434 |
}
|
435 |
-
|
|
|
|
|
436 |
}
|
437 |
|
438 |
self::log("HIP: 0 Priority Queue: ".json_encode($this->prioQ->get()));
|
@@ -453,13 +475,14 @@ class WPShortPixel {
|
|
453 |
$bulkEverRan = $this->prioQ->stopBulk();
|
454 |
$avg = self::getAverageCompression();
|
455 |
$fileCount = get_option('wp-short-pixel-fileCount');
|
456 |
-
|
457 |
"Message" => 'Empty queue ' . $this->prioQ->getStartBulkId() . '->' . $this->prioQ->getStopBulkId(),
|
458 |
"BulkStatus" => ($this->prioQ->bulkRunning()
|
459 |
? "1" : ($this->prioQ->bulkPaused() ? "2" : "0")),
|
460 |
"AverageCompression" => $avg,
|
461 |
"FileCount" => $fileCount,
|
462 |
-
"BulkPercent" => $this->prioQ->getBulkPercent())
|
|
|
463 |
}
|
464 |
|
465 |
self::log("HIP: 1 Prio Queue: ".json_encode($this->prioQ->get()));
|
@@ -528,11 +551,17 @@ class WPShortPixel {
|
|
528 |
//put this one in the failed images list - to show the user at the end
|
529 |
$prio = $this->prioQ->addToFailed($ID);
|
530 |
}
|
531 |
-
if(
|
532 |
$this->prioQ->setStartBulkId($ID - 1);
|
|
|
|
|
|
|
|
|
|
|
533 |
}
|
534 |
}
|
535 |
-
|
|
|
536 |
}
|
537 |
|
538 |
private function sendToProcessing($ID) {
|
@@ -824,21 +853,9 @@ class WPShortPixel {
|
|
824 |
wp_die('You do not have sufficient permissions to access this page.');
|
825 |
}
|
826 |
|
827 |
-
echo '<h1>ShortPixel Plugin Settings</h1>';
|
828 |
-
echo '<p>
|
829 |
-
<a href="https://shortpixel.com" target="_blank">ShortPixel.com</a> |
|
830 |
-
<a href="https://wordpress.org/plugins/shortpixel-image-optimiser/installation/" target="_blank">Installation </a> |
|
831 |
-
<a href="https://shortpixel.com/contact" target="_blank">Support </a>
|
832 |
-
</p>';
|
833 |
-
if($this->_verifiedKey) {
|
834 |
-
echo '<p>New images uploaded to the Media Library will be optimized automatically.<br/>If you have existing images you would like to optimize, you can use the <a href="' . get_admin_url() . 'upload.php?page=wp-short-pixel-bulk">Bulk Optimization Tool</a>.</p>';
|
835 |
-
} else {
|
836 |
-
echo '<p>Please enter here the API Key provided by ShortPixel:</p>';
|
837 |
-
}
|
838 |
-
|
839 |
-
$noticeHTML = "<br/><div style=\"background-color: #fff; border-left: 4px solid %s; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); padding: 1px 12px;\"><p>%s</p></div>";
|
840 |
-
|
841 |
//die(var_dump($_POST));
|
|
|
|
|
842 |
|
843 |
//by default we try to fetch the API Key from wp-config.php (if defined)
|
844 |
if ( !isset($_POST['save']) && !get_option('wp-short-pixel-verifiedKey') && defined("SHORTPIXEL_API_KEY") && strlen(SHORTPIXEL_API_KEY) == 20 )
|
@@ -855,44 +872,45 @@ class WPShortPixel {
|
|
855 |
{
|
856 |
$KeyLength = strlen($_POST['key']);
|
857 |
|
858 |
-
|
859 |
If this problem persists, please contact us at <a href='mailto:help@shortpixel.com?Subject=API Key issues' target='_top'>help@shortpixel.com</a> or <a href='https://shortpixel.com/contact' target='_blank'>here</a>.");
|
860 |
}
|
861 |
else
|
862 |
{
|
863 |
-
$validityData = $this->getQuotaInformation($_POST['key'], true);
|
864 |
|
865 |
$this->_apiKey = $_POST['key'];
|
866 |
$this->_apiInterface->setApiKey($this->_apiKey);
|
867 |
update_option('wp-short-pixel-apiKey', $_POST['key']);
|
868 |
if($validityData['APIKeyValid']) {
|
869 |
if(isset($_POST['validate']) && $_POST['validate'] == "validate") {
|
|
|
|
|
|
|
|
|
|
|
870 |
//display notification
|
871 |
$urlParts = explode("/", get_site_url());
|
872 |
-
if(
|
873 |
-
|
874 |
-
|| in_array($_SERVER["SERVER_ADDR"], array("127.0.0.1","::1")))){
|
875 |
-
printf($noticeHTML, '#FFC800', "API Key is valid but your server seems to have a local address (" . $_SERVER['SERVER_ADDR'] . ").
|
876 |
Please make sure that your server is accessible from the Internet before using the API or otherwise we won't be able to optimize them.");
|
877 |
} else {
|
878 |
-
|
879 |
if ( function_exists("is_multisite") && is_multisite() )
|
880 |
-
|
881 |
else
|
882 |
-
|
883 |
}
|
884 |
}
|
885 |
update_option('wp-short-pixel-verifiedKey', true);
|
886 |
$this->_verifiedKey = true;
|
887 |
//test that the "uploads" have the right rights and also we can create the backup dir for ShortPixel
|
888 |
if ( !file_exists(SP_BACKUP_FOLDER) && !@mkdir(SP_BACKUP_FOLDER, 0777, true) )
|
889 |
-
|
890 |
-
Please make sure that folder <b>" .
|
891 |
-
WP_CONTENT_DIR . DIRECTORY_SEPARATOR . "uploads</b> has the necessary write and read rights." );
|
892 |
} else {
|
893 |
if(isset($_POST['validate'])) {
|
894 |
//display notification
|
895 |
-
|
896 |
}
|
897 |
update_option('wp-short-pixel-verifiedKey', false);
|
898 |
$this->_verifiedKey = false;
|
@@ -918,17 +936,23 @@ class WPShortPixel {
|
|
918 |
update_option( 'wp-short-pixel-resize-width', 0 + $this->_resizeWidth);
|
919 |
update_option( 'wp-short-pixel-resize-height', 0 + $this->_resizeHeight);
|
920 |
|
|
|
|
|
|
|
|
|
921 |
}
|
922 |
}
|
923 |
-
|
924 |
-
|
|
|
|
|
|
|
925 |
//empty backup
|
926 |
if(isset($_POST['emptyBackup'])) {
|
927 |
$this->emptyBackup();
|
928 |
}
|
929 |
|
930 |
$quotaData = $this->checkQuotaAndAlert();
|
931 |
-
$this->view->displaySettingsForm($quotaData);
|
932 |
|
933 |
if($this->_verifiedKey) {
|
934 |
$fileCount = number_format(get_option('wp-short-pixel-fileCount'));
|
@@ -943,8 +967,11 @@ class WPShortPixel {
|
|
943 |
$remainingImages = ( $remainingImages < 0 ) ? 0 : number_format($remainingImages);
|
944 |
$totalCallsMade = number_format($quotaData['APICallsMadeNumeric'] + $quotaData['APICallsMadeOneTimeNumeric']);
|
945 |
|
946 |
-
$
|
947 |
-
|
|
|
|
|
|
|
948 |
}
|
949 |
|
950 |
}
|
@@ -955,7 +982,14 @@ class WPShortPixel {
|
|
955 |
: 0;
|
956 |
}
|
957 |
|
958 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
959 |
|
960 |
if(is_null($apiKey)) { $apiKey = $this->_apiKey; }
|
961 |
|
@@ -968,6 +1002,13 @@ class WPShortPixel {
|
|
968 |
if($appendUserAgent) {
|
969 |
$args['body']['useragent'] = "Agent" . urlencode($_SERVER['HTTP_USER_AGENT']);
|
970 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
971 |
$response = wp_remote_post($requestURL, $args);
|
972 |
|
973 |
if(is_wp_error( $response )) //some hosting providers won't allow https:// POST connections so we try http:// as well
|
@@ -980,7 +1021,8 @@ class WPShortPixel {
|
|
980 |
"APIKeyValid" => false,
|
981 |
"Message" => 'API Key could not be validated due to a connectivity error.<BR>Your firewall may be blocking us. Please contact your hosting provider and ask them to allow connections from your site to IP 176.9.106.46.<BR> If you still cannot validate your API Key after this, please <a href="https://shortpixel.com/contact" target="_blank">contact us</a> and we will try to help. ',
|
982 |
"APICallsMade" => 'Information unavailable. Please check your API key.',
|
983 |
-
"APICallsQuota" => 'Information unavailable. Please check your API key.'
|
|
|
984 |
|
985 |
if(is_object($response) && get_class($response) == 'WP_Error') {
|
986 |
|
@@ -1010,7 +1052,6 @@ class WPShortPixel {
|
|
1010 |
update_option('wp-short-pixel-quota-exceeded',0);
|
1011 |
else
|
1012 |
update_option('wp-short-pixel-quota-exceeded',1);//activate quota limiting
|
1013 |
-
|
1014 |
return array(
|
1015 |
"APIKeyValid" => true,
|
1016 |
"APICallsMade" => number_format($data->APICallsMade) . ' images',
|
@@ -1021,10 +1062,9 @@ class WPShortPixel {
|
|
1021 |
"APICallsQuotaNumeric" => $data->APICallsQuota,
|
1022 |
"APICallsMadeOneTimeNumeric" => $data->APICallsMadeOneTime,
|
1023 |
"APICallsQuotaOneTimeNumeric" => $data->APICallsQuotaOneTime,
|
1024 |
-
"APILastRenewalDate" => $data->DateSubscription
|
|
|
1025 |
);
|
1026 |
-
|
1027 |
-
|
1028 |
}
|
1029 |
|
1030 |
public function generateCustomColumn( $column_name, $id ) {
|
@@ -1087,7 +1127,7 @@ class WPShortPixel {
|
|
1087 |
}
|
1088 |
if ( get_option('wp-short-backup_images') && !isset($data['ShortPixel']['NoBackup'])) //display restore backup option only when backup is active
|
1089 |
print " | <a href=\"admin.php?action=shortpixel_restore_backup&attachment_ID={$id}\">Restore backup</a>";
|
1090 |
-
if (count($data['sizes'])) {
|
1091 |
print "<br>+" . count($data['sizes']) . " thumbnails optimized";
|
1092 |
}
|
1093 |
}
|
@@ -1123,7 +1163,7 @@ class WPShortPixel {
|
|
1123 |
{
|
1124 |
print "<img src=\"" . plugins_url( 'img/loading.gif', __FILE__ ) . "\"> Image waiting to be processed
|
1125 |
| <a href=\"javascript:manualOptimization({$id})\">Retry</a></div>";
|
1126 |
-
$this->prioQ->push($id); //should be there but just to make sure
|
1127 |
}
|
1128 |
|
1129 |
} elseif(isset($data['ShortPixel']['NoFileOnDisk'])) {
|
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 > ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
|
6 |
+
* Version: 3.1.2
|
7 |
* Author: ShortPixel
|
8 |
* Author URI: https://shortpixel.com
|
9 |
*/
|
21 |
|
22 |
define('SP_AFFILIATE_CODE', '');
|
23 |
|
24 |
+
define('PLUGIN_VERSION', "3.1.2");
|
25 |
define('SP_MAX_TIMEOUT', 10);
|
26 |
define('SP_BACKUP', 'ShortpixelBackups');
|
27 |
define('SP_BACKUP_FOLDER', WP_CONTENT_DIR . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . SP_BACKUP);
|
140 |
{
|
141 |
self::shortPixelDeactivatePlugin();
|
142 |
if(SP_RESET_ON_ACTIVATE === true && WP_DEBUG === true) { //force reset plugin counters, only on specific occasions and on test environments
|
143 |
+
delete_option('wp-short-pixel-apiKey');
|
144 |
+
delete_option('wp-short-pixel-verifiedKey');
|
145 |
+
delete_option('wp-short-pixel-compression');
|
146 |
+
delete_option('wp-short-process_thumbnails');
|
147 |
+
delete_option('wp-short-pixel_cmyk2rgb');
|
148 |
+
delete_option('wp-short-backup_images');
|
149 |
+
delete_option('wp-short-pixel-view-mode');
|
150 |
update_option( 'wp-short-pixel-thumbnail-count', 0);
|
151 |
update_option( 'wp-short-pixel-files-under-5-percent', 0);
|
152 |
update_option( 'wp-short-pixel-savedSpace', 0);
|
153 |
+
delete_option( 'wp-short-pixel-averageCompression');
|
154 |
+
delete_option( 'wp-short-pixel-fileCount');
|
155 |
+
delete_option( 'wp-short-pixel-total-original');
|
156 |
+
delete_option( 'wp-short-pixel-total-optimized');
|
157 |
update_option( 'wp-short-pixel-api-retries', 0);//sometimes we need to retry processing/downloading a file multiple times
|
158 |
update_option( 'wp-short-pixel-quota-exceeded', 0);
|
159 |
+
delete_option( 'wp-short-pixel-protocol');
|
|
|
160 |
update_option( 'wp-short-pixel-bulk-ever-ran', 0);
|
161 |
+
delete_option( 'wp-short-pixel-bulk-last-status');
|
162 |
delete_option('wp-short-pixel-priorityQueue');
|
163 |
+
delete_option( 'wp-short-pixel-resize-images');
|
164 |
+
delete_option( 'wp-short-pixel-resize-width');
|
165 |
+
delete_option( 'wp-short-pixel-resize-height');
|
166 |
+
delete_option( 'wp-short-pixel-dismissed-notices');
|
167 |
if(isset($_SESSION["wp-short-pixel-priorityQueue"])) {
|
168 |
unset($_SESSION["wp-short-pixel-priorityQueue"]);
|
169 |
}
|
179 |
{
|
180 |
include_once dirname( __FILE__ ) . '/shortpixel_queue.php';
|
181 |
ShortPixelQueue::resetBulk();
|
182 |
+
ShortPixelQueue::resetPrio();
|
183 |
delete_option('wp-short-pixel-activation-notice');
|
184 |
}
|
185 |
|
273 |
$blank = '_blank';
|
274 |
//$icon = "shortpixel-alert.png";
|
275 |
}
|
276 |
+
$lastStatus = self::getOpt( 'wp-short-pixel-bulk-last-status', array('Status' => ShortPixelAPI::STATUS_SUCCESS));
|
277 |
+
if($lastStatus['Status'] != ShortPixelAPI::STATUS_SUCCESS) {
|
278 |
+
$extraClasses = " shortpixel-alert shortpixel-processing";
|
279 |
+
$tooltip = $lastStatus['Message'];
|
280 |
+
}
|
281 |
self::log("TB: Start: " . $this->prioQ->getStartBulkId() . ", stop: " . $this->prioQ->getStopBulkId() . " PrioQ: "
|
282 |
.json_encode($this->prioQ->get()));
|
283 |
|
304 |
$action = $wp_list_table->current_action();
|
305 |
|
306 |
switch($action) {
|
307 |
+
// 2. Perform the action
|
308 |
case 'short-pixel-bulk':
|
309 |
// security check
|
310 |
check_admin_referer('bulk-media');
|
314 |
$mediaIds = array_reverse($_GET['media']);
|
315 |
foreach( $mediaIds as $ID ) {
|
316 |
$meta = wp_get_attachment_metadata($ID);
|
317 |
+
if( (!isset($meta['ShortPixel']) || (isset($meta['ShortPixel']['WaitingProcessing']) && $meta['ShortPixel']['WaitingProcessing'] == true))
|
318 |
&& (!isset($meta['ShortPixelImprovement']) || $meta['ShortPixelImprovement'] != 'Optimization N/A')) {
|
319 |
$this->prioQ->push($ID);
|
320 |
$meta['ShortPixel']['WaitingProcessing'] = true;
|
379 |
}
|
380 |
$idList = array();
|
381 |
for ($sanityCheck = 0, $crtStartQueryID = $startQueryID;
|
382 |
+
$crtStartQueryID >= $endQueryID && count($idList) < 3; $sanityCheck++) {
|
383 |
|
384 |
self::log("GETDB: current StartID: " . $crtStartQueryID);
|
385 |
|
386 |
$queryPostMeta = "SELECT * FROM " . $wpdb->prefix . "postmeta
|
387 |
+
WHERE ( post_id <= $crtStartQueryID AND post_id >= $endQueryID )
|
388 |
AND ( meta_key = '_wp_attached_file' OR meta_key = '_wp_attachment_metadata' )
|
389 |
ORDER BY post_id DESC
|
390 |
LIMIT " . SP_MAX_RESULTS_QUERY;
|
445 |
}
|
446 |
|
447 |
public function handleImageProcessing($ID = null) {
|
448 |
+
//die("stop");
|
449 |
//0: check key
|
450 |
if( $this->_verifiedKey == false) {
|
451 |
if($ID == null){
|
452 |
$ids = $this->getFromPrioAndCheck();
|
453 |
$ID = (count($ids) > 0 ? $ids[0] : null);
|
454 |
}
|
455 |
+
$response = array("Status" => ShortPixelAPI::STATUS_NO_KEY, "ImageID" => $ID, "Message" => "Missing API Key");
|
456 |
+
update_option( 'wp-short-pixel-bulk-last-status', $response);
|
457 |
+
die(json_encode($response));
|
458 |
}
|
459 |
|
460 |
self::log("HIP: 0 Priority Queue: ".json_encode($this->prioQ->get()));
|
475 |
$bulkEverRan = $this->prioQ->stopBulk();
|
476 |
$avg = self::getAverageCompression();
|
477 |
$fileCount = get_option('wp-short-pixel-fileCount');
|
478 |
+
$response = array("Status" => self::BULK_EMPTY_QUEUE,
|
479 |
"Message" => 'Empty queue ' . $this->prioQ->getStartBulkId() . '->' . $this->prioQ->getStopBulkId(),
|
480 |
"BulkStatus" => ($this->prioQ->bulkRunning()
|
481 |
? "1" : ($this->prioQ->bulkPaused() ? "2" : "0")),
|
482 |
"AverageCompression" => $avg,
|
483 |
"FileCount" => $fileCount,
|
484 |
+
"BulkPercent" => $this->prioQ->getBulkPercent());
|
485 |
+
die(json_encode($response));
|
486 |
}
|
487 |
|
488 |
self::log("HIP: 1 Prio Queue: ".json_encode($this->prioQ->get()));
|
551 |
//put this one in the failed images list - to show the user at the end
|
552 |
$prio = $this->prioQ->addToFailed($ID);
|
553 |
}
|
554 |
+
if($ID <= $this->prioQ->getStartBulkId()) {
|
555 |
$this->prioQ->setStartBulkId($ID - 1);
|
556 |
+
$this->prioQ->logBulkProgress();
|
557 |
+
$deltaBulkPercent = $this->prioQ->getDeltaBulkPercent();
|
558 |
+
$msg = $this->bulkProgressMessage($deltaBulkPercent, $this->prioQ->getTimeRemaining());
|
559 |
+
$result["BulkPercent"] = $this->prioQ->getBulkPercent();
|
560 |
+
$result["BulkMsg"] = $msg;
|
561 |
}
|
562 |
}
|
563 |
+
update_option( 'wp-short-pixel-bulk-last-status', $result);
|
564 |
+
die(json_encode($result));
|
565 |
}
|
566 |
|
567 |
private function sendToProcessing($ID) {
|
853 |
wp_die('You do not have sufficient permissions to access this page.');
|
854 |
}
|
855 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
856 |
//die(var_dump($_POST));
|
857 |
+
$noticeHTML = "";
|
858 |
+
$notice = null;
|
859 |
|
860 |
//by default we try to fetch the API Key from wp-config.php (if defined)
|
861 |
if ( !isset($_POST['save']) && !get_option('wp-short-pixel-verifiedKey') && defined("SHORTPIXEL_API_KEY") && strlen(SHORTPIXEL_API_KEY) == 20 )
|
872 |
{
|
873 |
$KeyLength = strlen($_POST['key']);
|
874 |
|
875 |
+
$notice = array("status" => "error", "msg" => "The key you provided has " . $KeyLength . " characters. The API key should have 20 characters, letters and numbers only.<BR> <b>Please check that the API key is the same as the one you received in your confirmation email.</b><BR>
|
876 |
If this problem persists, please contact us at <a href='mailto:help@shortpixel.com?Subject=API Key issues' target='_top'>help@shortpixel.com</a> or <a href='https://shortpixel.com/contact' target='_blank'>here</a>.");
|
877 |
}
|
878 |
else
|
879 |
{
|
880 |
+
$validityData = $this->getQuotaInformation($_POST['key'], true, isset($_POST['validate']) && $_POST['validate'] == "validate");
|
881 |
|
882 |
$this->_apiKey = $_POST['key'];
|
883 |
$this->_apiInterface->setApiKey($this->_apiKey);
|
884 |
update_option('wp-short-pixel-apiKey', $_POST['key']);
|
885 |
if($validityData['APIKeyValid']) {
|
886 |
if(isset($_POST['validate']) && $_POST['validate'] == "validate") {
|
887 |
+
// delete last status if it was no valid key
|
888 |
+
$lastStatus = get_option( 'wp-short-pixel-bulk-last-status');
|
889 |
+
if(isset($lastStatus) && $lastStatus['Status'] == ShortPixelAPI::STATUS_NO_KEY) {
|
890 |
+
delete_option( 'wp-short-pixel-bulk-last-status');
|
891 |
+
}
|
892 |
//display notification
|
893 |
$urlParts = explode("/", get_site_url());
|
894 |
+
if( $validityData['DomainCheck'] == 'NOT Accessible'){
|
895 |
+
$notice = array("status" => "warn", "msg" => "API Key is valid but your site is not accessible from our servers.
|
|
|
|
|
896 |
Please make sure that your server is accessible from the Internet before using the API or otherwise we won't be able to optimize them.");
|
897 |
} else {
|
|
|
898 |
if ( function_exists("is_multisite") && is_multisite() )
|
899 |
+
$notice = array("status" => "success", "msg" => "API Key valid! <br>You seem to be running a multisite, please note that API Key can also be configured in wp-config.php like this:<BR> <b>define('SHORTPIXEL_API_KEY', '".$this->_apiKey."');</b>");
|
900 |
else
|
901 |
+
$notice = array("status" => "success", "msg" => 'API Key valid!');
|
902 |
}
|
903 |
}
|
904 |
update_option('wp-short-pixel-verifiedKey', true);
|
905 |
$this->_verifiedKey = true;
|
906 |
//test that the "uploads" have the right rights and also we can create the backup dir for ShortPixel
|
907 |
if ( !file_exists(SP_BACKUP_FOLDER) && !@mkdir(SP_BACKUP_FOLDER, 0777, true) )
|
908 |
+
$notice = array("status" => "error", "msg" => "There is something preventing us to create a new folder for backing up your original files.<BR>
|
909 |
+
Please make sure that folder <b>" . WP_CONTENT_DIR . DIRECTORY_SEPARATOR . "uploads</b> has the necessary write and read rights.");
|
|
|
910 |
} else {
|
911 |
if(isset($_POST['validate'])) {
|
912 |
//display notification
|
913 |
+
$notice = array("status" => "error", "msg" => $validityData["Message"]);
|
914 |
}
|
915 |
update_option('wp-short-pixel-verifiedKey', false);
|
916 |
$this->_verifiedKey = false;
|
936 |
update_option( 'wp-short-pixel-resize-width', 0 + $this->_resizeWidth);
|
937 |
update_option( 'wp-short-pixel-resize-height', 0 + $this->_resizeHeight);
|
938 |
|
939 |
+
if($_POST['save'] == "Bulk Process") {
|
940 |
+
wp_redirect("upload.php?page=wp-short-pixel-bulk");
|
941 |
+
exit();
|
942 |
+
}
|
943 |
}
|
944 |
}
|
945 |
+
//now output headers. They were prevented with noheaders=true in the form url in order to be able to redirect if bulk was pressed
|
946 |
+
if(isset($_REQUEST['noheader'])) {
|
947 |
+
require_once(ABSPATH . 'wp-admin/admin-header.php');
|
948 |
+
}
|
949 |
+
|
950 |
//empty backup
|
951 |
if(isset($_POST['emptyBackup'])) {
|
952 |
$this->emptyBackup();
|
953 |
}
|
954 |
|
955 |
$quotaData = $this->checkQuotaAndAlert();
|
|
|
956 |
|
957 |
if($this->_verifiedKey) {
|
958 |
$fileCount = number_format(get_option('wp-short-pixel-fileCount'));
|
967 |
$remainingImages = ( $remainingImages < 0 ) ? 0 : number_format($remainingImages);
|
968 |
$totalCallsMade = number_format($quotaData['APICallsMadeNumeric'] + $quotaData['APICallsMadeOneTimeNumeric']);
|
969 |
|
970 |
+
$resources = wp_remote_get("https://shortpixel.com/resources-frag");
|
971 |
+
$this->view->displaySettings($quotaData, $notice, $resources, $averageCompression, $savedSpace, $savedBandwidth,
|
972 |
+
$remainingImages, $totalCallsMade, $fileCount, $backupFolderSize);
|
973 |
+
} else {
|
974 |
+
$this->view->displaySettings($quotaData, $notice);
|
975 |
}
|
976 |
|
977 |
}
|
982 |
: 0;
|
983 |
}
|
984 |
|
985 |
+
/**
|
986 |
+
*
|
987 |
+
* @param type $apiKey
|
988 |
+
* @param type $appendUserAgent
|
989 |
+
* @param type $validate - true if we are validating the api key, send also the domain name and number of pics
|
990 |
+
* @return type
|
991 |
+
*/
|
992 |
+
public function getQuotaInformation($apiKey = null, $appendUserAgent = false, $validate = false) {
|
993 |
|
994 |
if(is_null($apiKey)) { $apiKey = $this->_apiKey; }
|
995 |
|
1002 |
if($appendUserAgent) {
|
1003 |
$args['body']['useragent'] = "Agent" . urlencode($_SERVER['HTTP_USER_AGENT']);
|
1004 |
}
|
1005 |
+
if($validate) {
|
1006 |
+
$args['body']['DomainCheck'] = get_site_url();
|
1007 |
+
$imageCount = $this->countAllProcessableFiles();
|
1008 |
+
$args['body']['ImagesCount'] = $imageCount['mainFiles'];
|
1009 |
+
$args['body']['ThumbsCount'] = $imageCount['totalFiles'] - $imageCount['mainFiles'];
|
1010 |
+
}
|
1011 |
+
|
1012 |
$response = wp_remote_post($requestURL, $args);
|
1013 |
|
1014 |
if(is_wp_error( $response )) //some hosting providers won't allow https:// POST connections so we try http:// as well
|
1021 |
"APIKeyValid" => false,
|
1022 |
"Message" => 'API Key could not be validated due to a connectivity error.<BR>Your firewall may be blocking us. Please contact your hosting provider and ask them to allow connections from your site to IP 176.9.106.46.<BR> If you still cannot validate your API Key after this, please <a href="https://shortpixel.com/contact" target="_blank">contact us</a> and we will try to help. ',
|
1023 |
"APICallsMade" => 'Information unavailable. Please check your API key.',
|
1024 |
+
"APICallsQuota" => 'Information unavailable. Please check your API key.',
|
1025 |
+
"DomainCheck" => 'NOT Accessible');
|
1026 |
|
1027 |
if(is_object($response) && get_class($response) == 'WP_Error') {
|
1028 |
|
1052 |
update_option('wp-short-pixel-quota-exceeded',0);
|
1053 |
else
|
1054 |
update_option('wp-short-pixel-quota-exceeded',1);//activate quota limiting
|
|
|
1055 |
return array(
|
1056 |
"APIKeyValid" => true,
|
1057 |
"APICallsMade" => number_format($data->APICallsMade) . ' images',
|
1062 |
"APICallsQuotaNumeric" => $data->APICallsQuota,
|
1063 |
"APICallsMadeOneTimeNumeric" => $data->APICallsMadeOneTime,
|
1064 |
"APICallsQuotaOneTimeNumeric" => $data->APICallsQuotaOneTime,
|
1065 |
+
"APILastRenewalDate" => $data->DateSubscription,
|
1066 |
+
"DomainCheck" => (isset($data->DomainCheck) ? $data->DomainCheck : null)
|
1067 |
);
|
|
|
|
|
1068 |
}
|
1069 |
|
1070 |
public function generateCustomColumn( $column_name, $id ) {
|
1127 |
}
|
1128 |
if ( get_option('wp-short-backup_images') && !isset($data['ShortPixel']['NoBackup'])) //display restore backup option only when backup is active
|
1129 |
print " | <a href=\"admin.php?action=shortpixel_restore_backup&attachment_ID={$id}\">Restore backup</a>";
|
1130 |
+
if (isset($data['sizes']) && count($data['sizes'])) {
|
1131 |
print "<br>+" . count($data['sizes']) . " thumbnails optimized";
|
1132 |
}
|
1133 |
}
|
1163 |
{
|
1164 |
print "<img src=\"" . plugins_url( 'img/loading.gif', __FILE__ ) . "\"> Image waiting to be processed
|
1165 |
| <a href=\"javascript:manualOptimization({$id})\">Retry</a></div>";
|
1166 |
+
if($id > $this->prioQ->getFlagBulkId()) $this->prioQ->push($id); //should be there but just to make sure
|
1167 |
}
|
1168 |
|
1169 |
} elseif(isset($data['ShortPixel']['NoFileOnDisk'])) {
|