Version Description
Release date June 21st, 2022 * Fix: the plugin now recognizes the offloaded WebP/AVIF files, when they are not also present anymore on the server; * Fix: in some cases, the bulk and manual optimization was stuck due to some errors related to the legacy optimization information; * Fix: when saving the settings, the credits quota and other API-related data will be sent to the API, for faster sync; * Fix: when having the backups turned off, a placeholder image was displayed instead of the original one; * Fix: an empty space was sometimes shown on some pages, as a result of some dismissed notifications; * Fix: various small fixes around the plugin processing engine, for increased speed and stability; * Fix: updated various pieces of code in accordance with the WordPress Coding Standards; * Language: 1 new string added, 0 updated, 0 fuzzed, and 0 obsoleted.
Release Info
| Developer | petredobrescu |
| Plugin | |
| Version | 5.0.3 |
| Comparing to | |
| See all releases | |
Code changes from version 5.0.2 to 5.0.3
- build/shortpixel/log/src/ShortPixelLogger.php +2 -2
- build/shortpixel/notices/src/NoticeModel.php +1 -0
- build/shortpixel/replacer/src/Replacer.php +0 -1
- class/BuildAutoLoader.php +1 -1
- class/Controller/AdminController.php +8 -5
- class/Controller/AdminNoticesController.php +23 -16
- class/Controller/FileSystemController.php +26 -0
- class/Controller/OptimizeController.php +0 -2
- class/Controller/OtherMediaController.php +1 -2
- class/Controller/Queue/Queue.php +2 -0
- class/Controller/SettingsController.php +3 -1
- class/Controller/View/EditMediaViewController.php +9 -1
- class/Controller/View/ListMediaViewController.php +1 -1
- class/Controller/View/OtherMediaViewController.php +4 -5
- class/Helper/UiHelper.php +1 -1
- class/Model/EnvironmentModel.php +4 -1
- class/Model/Image/ImageModel.php +1 -1
- class/Model/Image/MediaLibraryModel.php +71 -15
- class/Model/StatsModel.php +16 -5
- class/ViewController.php +1 -2
- class/external/helpscout.php +0 -179
- class/plugin.json +1 -1
- class/view/bulk/part-bulk-special.php +2 -1
- class/view/settings/part-debug.php +7 -7
- class/view/shortpixel-plugin-request.php +2 -2
- readme.txt +12 -1
- res/js/screens/screen-bulk.js +11 -9
- res/js/shortpixel-processor.js +7 -7
- wp-shortpixel.php +2 -2
|
@@ -344,8 +344,8 @@ namespace ShortPixel\ShortPixelLogger;
|
|
| 344 |
include($template_path);
|
| 345 |
}
|
| 346 |
else {
|
| 347 |
-
self::addError("View $template could not be found in " . $template_path,
|
| 348 |
-
array('class' => get_class($this)
|
| 349 |
}
|
| 350 |
}
|
| 351 |
|
| 344 |
include($template_path);
|
| 345 |
}
|
| 346 |
else {
|
| 347 |
+
self::addError("View $template for ShortPixelLogger could not be found in " . $template_path,
|
| 348 |
+
array('class' => get_class($this)));
|
| 349 |
}
|
| 350 |
}
|
| 351 |
|
|
@@ -279,6 +279,7 @@ class NoticeModel //extends ShortPixelModel
|
|
| 279 |
var ev = event.detail;
|
| 280 |
var target = event.target;
|
| 281 |
var parent = target.parentElement;
|
|
|
|
| 282 |
var data = {
|
| 283 |
'plugin_action': 'dismiss',
|
| 284 |
'action' : '$this->notice_action',
|
| 279 |
var ev = event.detail;
|
| 280 |
var target = event.target;
|
| 281 |
var parent = target.parentElement;
|
| 282 |
+
console.log(ev);
|
| 283 |
var data = {
|
| 284 |
'plugin_action': 'dismiss',
|
| 285 |
'action' : '$this->notice_action',
|
|
@@ -412,7 +412,6 @@ class Replacer
|
|
| 412 |
*/
|
| 413 |
private function findNearestSize($sizeName)
|
| 414 |
{
|
| 415 |
-
Log::addTemp('Find Nearest: '. $sizeName);
|
| 416 |
|
| 417 |
if (! isset($this->source_metadata['sizes'][$sizeName]) || ! isset($this->target_metadata['width'])) // This can happen with non-image files like PDF.
|
| 418 |
{
|
| 412 |
*/
|
| 413 |
private function findNearestSize($sizeName)
|
| 414 |
{
|
|
|
|
| 415 |
|
| 416 |
if (! isset($this->source_metadata['sizes'][$sizeName]) || ! isset($this->target_metadata['width'])) // This can happen with non-image files like PDF.
|
| 417 |
{
|
|
@@ -55,7 +55,7 @@ class BuildAutoLoader
|
|
| 55 |
'class/external/cloudflare.php',
|
| 56 |
'class/external/flywheel.php',
|
| 57 |
//'class/external/gravityforms.php',
|
| 58 |
-
'class/external/helpscout.php',
|
| 59 |
'class/external/nextgen/nextGenController.php',
|
| 60 |
'class/external/nextgen/nextGenViewController.php',
|
| 61 |
//'class/external/securi.php',
|
| 55 |
'class/external/cloudflare.php',
|
| 56 |
'class/external/flywheel.php',
|
| 57 |
//'class/external/gravityforms.php',
|
| 58 |
+
//'class/external/helpscout.php',
|
| 59 |
'class/external/nextgen/nextGenController.php',
|
| 60 |
'class/external/nextgen/nextGenViewController.php',
|
| 61 |
//'class/external/securi.php',
|
|
@@ -101,12 +101,15 @@ class AdminController extends \ShortPixel\Controller
|
|
| 101 |
|
| 102 |
foreach($args['queues'] as $qname)
|
| 103 |
{
|
| 104 |
-
$
|
| 105 |
-
// If Queue is not completely empty, there should be something to do.
|
| 106 |
-
if ($result->qstatus != QUEUE::RESULT_QUEUE_EMPTY)
|
| 107 |
{
|
| 108 |
-
|
| 109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
}
|
| 111 |
}
|
| 112 |
|
| 101 |
|
| 102 |
foreach($args['queues'] as $qname)
|
| 103 |
{
|
| 104 |
+
if (property_exists($results, $qname))
|
|
|
|
|
|
|
| 105 |
{
|
| 106 |
+
$result = $results->$qname;
|
| 107 |
+
// If Queue is not completely empty, there should be something to do.
|
| 108 |
+
if ($result->qstatus != QUEUE::RESULT_QUEUE_EMPTY)
|
| 109 |
+
{
|
| 110 |
+
$running = true;
|
| 111 |
+
continue;
|
| 112 |
+
}
|
| 113 |
}
|
| 114 |
}
|
| 115 |
|
|
@@ -325,6 +325,9 @@ class AdminNoticesController extends \ShortPixel\Controller
|
|
| 325 |
$settings = \wpSPIO()->settings();
|
| 326 |
|
| 327 |
$quotaController = QuotaController::getInstance();
|
|
|
|
|
|
|
|
|
|
| 328 |
|
| 329 |
if (! \wpSPIO()->settings()->verifiedKey)
|
| 330 |
{
|
|
@@ -348,8 +351,6 @@ class AdminNoticesController extends \ShortPixel\Controller
|
|
| 348 |
$quotaController = QuotaController::getInstance();
|
| 349 |
$quotaData = $quotaController->getQuota();
|
| 350 |
|
| 351 |
-
$statsControl = StatsController::getInstance(); // @todo Implement this. (Figure out what this was )
|
| 352 |
-
$noticeController = Notices::getInstance();
|
| 353 |
|
| 354 |
$bulk_notice = $noticeController->getNoticeByID(self::MSG_UPGRADE_BULK);
|
| 355 |
$bulk_is_dismissed = ($bulk_notice && $bulk_notice->isDismissed() ) ? true : false;
|
|
@@ -365,29 +366,35 @@ class AdminNoticesController extends \ShortPixel\Controller
|
|
| 365 |
'quotaAvailable' => $available);
|
| 366 |
|
| 367 |
//looks like the user hasn't got enough credits to bulk process all media library
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
|
|
|
|
|
|
| 372 |
}
|
| 373 |
//consider the monthly plus 1/6 of the available one-time credits.
|
| 374 |
elseif( $this->monthlyUpgradeNeeded($quotaData)) {
|
| 375 |
-
//looks like the user hasn't got enough credits to process the monthly images, display a notice telling this
|
| 376 |
-
$message = $this->getMonthlyUpgradeMessage(array('monthAvg' => $this->getMonthAvg(), 'monthlyQuota' => $quotaData->monthly->total ));
|
| 377 |
|
| 378 |
-
|
| 379 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 380 |
}
|
| 381 |
}
|
| 382 |
elseif ($quotaController->hasQuota() === false)
|
| 383 |
{
|
| 384 |
-
// $stats = $shortpixel->countAllIfNeeded($settings->currentStats, 86400);
|
| 385 |
-
// $quotaData = $stats;
|
| 386 |
-
Log::addDebug('Over quota detected, loading message (adminnotices)');
|
| 387 |
-
$message = $this->getQuotaExceededMessage();
|
| 388 |
|
| 389 |
-
|
| 390 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 391 |
|
| 392 |
Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH); // get rid of doubles. reset
|
| 393 |
Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
|
| 325 |
$settings = \wpSPIO()->settings();
|
| 326 |
|
| 327 |
$quotaController = QuotaController::getInstance();
|
| 328 |
+
$noticeController = Notices::getInstance();
|
| 329 |
+
$statsControl = StatsController::getInstance(); // @todo Implement this. (Figure out what this was )
|
| 330 |
+
|
| 331 |
|
| 332 |
if (! \wpSPIO()->settings()->verifiedKey)
|
| 333 |
{
|
| 351 |
$quotaController = QuotaController::getInstance();
|
| 352 |
$quotaData = $quotaController->getQuota();
|
| 353 |
|
|
|
|
|
|
|
| 354 |
|
| 355 |
$bulk_notice = $noticeController->getNoticeByID(self::MSG_UPGRADE_BULK);
|
| 356 |
$bulk_is_dismissed = ($bulk_notice && $bulk_notice->isDismissed() ) ? true : false;
|
| 366 |
'quotaAvailable' => $available);
|
| 367 |
|
| 368 |
//looks like the user hasn't got enough credits to bulk process all media library
|
| 369 |
+
if ($bulk_notice === false)
|
| 370 |
+
{
|
| 371 |
+
$message = $this->getBulkUpgradeMessage($data);
|
| 372 |
+
$notice = Notices::addNormal($message);
|
| 373 |
+
Notices::makePersistent($notice, self::MSG_UPGRADE_BULK, YEAR_IN_SECONDS, array($this, 'upgradeBulkCallback'));
|
| 374 |
+
}
|
| 375 |
}
|
| 376 |
//consider the monthly plus 1/6 of the available one-time credits.
|
| 377 |
elseif( $this->monthlyUpgradeNeeded($quotaData)) {
|
|
|
|
|
|
|
| 378 |
|
| 379 |
+
if ($month_notice === false)
|
| 380 |
+
{
|
| 381 |
+
//looks like the user hasn't got enough credits to process the monthly images, display a notice telling this
|
| 382 |
+
$message = $this->getMonthlyUpgradeMessage(array('monthAvg' => $this->getMonthAvg(), 'monthlyQuota' => $quotaData->monthly->total ));
|
| 383 |
+
$notice = Notices::addNormal($message);
|
| 384 |
+
Notices::makePersistent($notice, self::MSG_UPGRADE_MONTH, YEAR_IN_SECONDS);
|
| 385 |
+
}
|
| 386 |
}
|
| 387 |
}
|
| 388 |
elseif ($quotaController->hasQuota() === false)
|
| 389 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
| 390 |
|
| 391 |
+
$notice = $noticeController->getNoticeByID(self::MSG_QUOTA_REACHED);
|
| 392 |
+
if ($notice === false)
|
| 393 |
+
{
|
| 394 |
+
$message = $this->getQuotaExceededMessage();
|
| 395 |
+
$notice = Notices::addError($message);
|
| 396 |
+
Notices::makePersistent($notice, self::MSG_QUOTA_REACHED, WEEK_IN_SECONDS);
|
| 397 |
+
}
|
| 398 |
|
| 399 |
Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH); // get rid of doubles. reset
|
| 400 |
Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
|
|
@@ -387,6 +387,8 @@ Class FileSystemController extends \ShortPixel\Controller
|
|
| 387 |
return false;
|
| 388 |
}
|
| 389 |
|
|
|
|
|
|
|
| 390 |
/** Get all files from a directory tree, starting at given dir.
|
| 391 |
* @param DirectoryModel $dir to recursive into
|
| 392 |
* @param Array $filters Collection of optional filters as accepted by FileFilter in directoryModel
|
|
@@ -412,6 +414,30 @@ Class FileSystemController extends \ShortPixel\Controller
|
|
| 412 |
return $fileArray;
|
| 413 |
}
|
| 414 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 415 |
/** Old method of getting a subDir. This is messy and hopefully should not be used anymore. It's added here for backward compat in case of exceptions */
|
| 416 |
private function returnOldSubDir($file)
|
| 417 |
{
|
| 387 |
return false;
|
| 388 |
}
|
| 389 |
|
| 390 |
+
|
| 391 |
+
|
| 392 |
/** Get all files from a directory tree, starting at given dir.
|
| 393 |
* @param DirectoryModel $dir to recursive into
|
| 394 |
* @param Array $filters Collection of optional filters as accepted by FileFilter in directoryModel
|
| 414 |
return $fileArray;
|
| 415 |
}
|
| 416 |
|
| 417 |
+
// Url very sparingly.
|
| 418 |
+
public function url_exists($url)
|
| 419 |
+
{
|
| 420 |
+
if (! \wpSPIO()->env()->is_function_usable('curl_init'))
|
| 421 |
+
{
|
| 422 |
+
return null;
|
| 423 |
+
}
|
| 424 |
+
|
| 425 |
+
$ch = curl_init($url);
|
| 426 |
+
curl_setopt($ch, CURLOPT_NOBODY, true);
|
| 427 |
+
curl_exec($ch);
|
| 428 |
+
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
| 429 |
+
curl_close($ch);
|
| 430 |
+
|
| 431 |
+
if ($responseCode == 200)
|
| 432 |
+
{
|
| 433 |
+
return true;
|
| 434 |
+
}
|
| 435 |
+
else {
|
| 436 |
+
return false;
|
| 437 |
+
}
|
| 438 |
+
|
| 439 |
+
}
|
| 440 |
+
|
| 441 |
/** Old method of getting a subDir. This is messy and hopefully should not be used anymore. It's added here for backward compat in case of exceptions */
|
| 442 |
private function returnOldSubDir($file)
|
| 443 |
{
|
|
@@ -332,9 +332,7 @@ class OptimizeController
|
|
| 332 |
}
|
| 333 |
|
| 334 |
// @todo Here prevent bulk from running when running flag is off
|
| 335 |
-
|
| 336 |
// @todo Here prevent a runTick is the queue is empty and done already ( reliably )
|
| 337 |
-
|
| 338 |
$results = new \stdClass;
|
| 339 |
if ( in_array('media', $queueTypes))
|
| 340 |
{
|
| 332 |
}
|
| 333 |
|
| 334 |
// @todo Here prevent bulk from running when running flag is off
|
|
|
|
| 335 |
// @todo Here prevent a runTick is the queue is empty and done already ( reliably )
|
|
|
|
| 336 |
$results = new \stdClass;
|
| 337 |
if ( in_array('media', $queueTypes))
|
| 338 |
{
|
|
@@ -377,7 +377,6 @@ class OtherMediaController extends \ShortPixel\Controller
|
|
| 377 |
if( count($subdirs) > 0 ) {
|
| 378 |
echo "<ul class='jqueryFileTree'>";
|
| 379 |
foreach($subdirs as $dir ) {
|
| 380 |
-
|
| 381 |
$returnDir = substr($dir->getPath(), strlen($rootDirObj->getPath())); // relative to root.
|
| 382 |
$dirpath = $dir->getPath();
|
| 383 |
$dirname = $dir->getName();
|
|
@@ -389,7 +388,7 @@ class OtherMediaController extends \ShortPixel\Controller
|
|
| 389 |
|
| 390 |
if( $dir->exists() ) {
|
| 391 |
//KEEP the spaces in front of the rel values - it's a trick to make WP Hide not replace the wp-content path
|
| 392 |
-
echo "<li class='directory collapsed'><a rel=' "
|
| 393 |
}
|
| 394 |
|
| 395 |
}
|
| 377 |
if( count($subdirs) > 0 ) {
|
| 378 |
echo "<ul class='jqueryFileTree'>";
|
| 379 |
foreach($subdirs as $dir ) {
|
|
|
|
| 380 |
$returnDir = substr($dir->getPath(), strlen($rootDirObj->getPath())); // relative to root.
|
| 381 |
$dirpath = $dir->getPath();
|
| 382 |
$dirname = $dir->getName();
|
| 388 |
|
| 389 |
if( $dir->exists() ) {
|
| 390 |
//KEEP the spaces in front of the rel values - it's a trick to make WP Hide not replace the wp-content path
|
| 391 |
+
echo "<li class='directory collapsed'><a rel=' " .esc_attr($htmlRel) . "'>" . esc_html($htmlName) . "</a></li>";
|
| 392 |
}
|
| 393 |
|
| 394 |
}
|
|
@@ -335,6 +335,8 @@ abstract class Queue
|
|
| 335 |
$stats->done = (int) $this->getStatus('done');
|
| 336 |
$stats->bulk_running = (bool) $this->getStatus('bulk_running');
|
| 337 |
|
|
|
|
|
|
|
| 338 |
$stats->total = $stats->in_queue + $stats->fatal_errors + $stats->errors + $stats->done + $stats->in_process;
|
| 339 |
if ($stats->total > 0)
|
| 340 |
$stats->percentage_done = round((100 / $stats->total) * ($stats->done + $stats->fatal_errors));
|
| 335 |
$stats->done = (int) $this->getStatus('done');
|
| 336 |
$stats->bulk_running = (bool) $this->getStatus('bulk_running');
|
| 337 |
|
| 338 |
+
$customData = $this->getStatus('custom_data');
|
| 339 |
+
|
| 340 |
$stats->total = $stats->in_queue + $stats->fatal_errors + $stats->errors + $stats->done + $stats->in_process;
|
| 341 |
if ($stats->total > 0)
|
| 342 |
$stats->percentage_done = round((100 / $stats->total) * ($stats->done + $stats->fatal_errors));
|
|
@@ -352,7 +352,9 @@ class SettingsController extends \ShortPixel\ViewController
|
|
| 352 |
$this->keyModel->checkKey($check_key);
|
| 353 |
}
|
| 354 |
|
| 355 |
-
|
|
|
|
|
|
|
| 356 |
|
| 357 |
// end
|
| 358 |
|
| 352 |
$this->keyModel->checkKey($check_key);
|
| 353 |
}
|
| 354 |
|
| 355 |
+
|
| 356 |
+
// Every save, force load the quota. One reason, because of the HTTP Auth settings refresh.
|
| 357 |
+
$this->loadQuotaData(true);
|
| 358 |
|
| 359 |
// end
|
| 360 |
|
|
@@ -68,7 +68,7 @@ class EditMediaViewController extends \ShortPixel\ViewController
|
|
| 68 |
return false;
|
| 69 |
}
|
| 70 |
|
| 71 |
-
|
| 72 |
$this->view->status_message = null;
|
| 73 |
|
| 74 |
$this->view->text = UiHelper::getStatusText($this->imageModel);
|
|
@@ -187,9 +187,17 @@ class EditMediaViewController extends \ShortPixel\ViewController
|
|
| 187 |
$debugInfo = array();
|
| 188 |
$debugInfo[] = array(__('URL (get attachment URL)', 'shortpixel_image_optiser'), wp_get_attachment_url($this->post_id));
|
| 189 |
$debugInfo[] = array(__('File (get attached)'), get_attached_file($this->post_id));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
$debugInfo[] = array(__('Size and Mime (ImageObj)'), $imageObj->get('width') . 'x' . $imageObj->get('height'). ' (' . $imageObj->get('mime') . ')');
|
| 191 |
$debugInfo[] = array(__('Status (ShortPixel)'), $imageObj->getMeta('status') . ' ' );
|
| 192 |
|
|
|
|
|
|
|
| 193 |
$debugInfo[] = array(__('Processable'), $processable);
|
| 194 |
$debugInfo[] = array(__('Restorable'), $restorable);
|
| 195 |
|
| 68 |
return false;
|
| 69 |
}
|
| 70 |
|
| 71 |
+
|
| 72 |
$this->view->status_message = null;
|
| 73 |
|
| 74 |
$this->view->text = UiHelper::getStatusText($this->imageModel);
|
| 187 |
$debugInfo = array();
|
| 188 |
$debugInfo[] = array(__('URL (get attachment URL)', 'shortpixel_image_optiser'), wp_get_attachment_url($this->post_id));
|
| 189 |
$debugInfo[] = array(__('File (get attached)'), get_attached_file($this->post_id));
|
| 190 |
+
|
| 191 |
+
if ($imageObj->is_virtual())
|
| 192 |
+
{
|
| 193 |
+
$debugInfo[] = array(__('Is Virtual'), $imageObj->getFullPath() );
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
$debugInfo[] = array(__('Size and Mime (ImageObj)'), $imageObj->get('width') . 'x' . $imageObj->get('height'). ' (' . $imageObj->get('mime') . ')');
|
| 197 |
$debugInfo[] = array(__('Status (ShortPixel)'), $imageObj->getMeta('status') . ' ' );
|
| 198 |
|
| 199 |
+
|
| 200 |
+
|
| 201 |
$debugInfo[] = array(__('Processable'), $processable);
|
| 202 |
$debugInfo[] = array(__('Restorable'), $restorable);
|
| 203 |
|
|
@@ -304,7 +304,7 @@ class ListMediaViewController extends \ShortPixel\ViewController
|
|
| 304 |
foreach($options as $optname => $optval)
|
| 305 |
{
|
| 306 |
$selected = ($status == $optname) ? 'selected' : '';
|
| 307 |
-
echo "<option value='". $optname . "' $selected>" . $optval . "</option>\n";
|
| 308 |
}
|
| 309 |
echo "</select>";
|
| 310 |
|
| 304 |
foreach($options as $optname => $optval)
|
| 305 |
{
|
| 306 |
$selected = ($status == $optname) ? 'selected' : '';
|
| 307 |
+
echo "<option value='". esc_attr($optname) . "' $selected >" . esc_html($optval) . "</option>\n";
|
| 308 |
}
|
| 309 |
echo "</select>";
|
| 310 |
|
|
@@ -434,9 +434,8 @@ class OtherMediaViewController extends \ShortPixel\ViewController
|
|
| 434 |
public function doActionColumn($item)
|
| 435 |
{
|
| 436 |
?>
|
| 437 |
-
<div id='sp-msg-<?php echo $item->get('id') ?>' class='sp-column-info'><?php
|
| 438 |
-
|
| 439 |
-
$this->printItemActions($item);
|
| 440 |
echo "<div>" . UiHelper::getStatusText($item) . "</div>";
|
| 441 |
|
| 442 |
?>
|
|
@@ -464,7 +463,7 @@ class OtherMediaViewController extends \ShortPixel\ViewController
|
|
| 464 |
$link = ($action['type'] == 'js') ? 'javascript:' . $action['function'] : $action['function'];
|
| 465 |
|
| 466 |
?>
|
| 467 |
-
<a href="<?php echo $link ?>" class="<?php echo $classes ?>"><?php echo $action['text'] ?></a>
|
| 468 |
|
| 469 |
<?php
|
| 470 |
endforeach;
|
|
@@ -501,7 +500,7 @@ class OtherMediaViewController extends \ShortPixel\ViewController
|
|
| 501 |
$class = (isset($action['class'])) ? $action['class'] : '';
|
| 502 |
|
| 503 |
|
| 504 |
-
$link = '<a href="' . esc_url($url) . '" class="action-' . $action_arg . ' ' . $class . '">' . $text . '</a>';
|
| 505 |
}
|
| 506 |
|
| 507 |
$actions[$index] = $link;
|
| 434 |
public function doActionColumn($item)
|
| 435 |
{
|
| 436 |
?>
|
| 437 |
+
<div id='sp-msg-<?php echo esc_attr($item->get('id')) ?>' class='sp-column-info'><?php
|
| 438 |
+
$this->printItemActions($item);
|
|
|
|
| 439 |
echo "<div>" . UiHelper::getStatusText($item) . "</div>";
|
| 440 |
|
| 441 |
?>
|
| 463 |
$link = ($action['type'] == 'js') ? 'javascript:' . $action['function'] : $action['function'];
|
| 464 |
|
| 465 |
?>
|
| 466 |
+
<a href="<?php echo esc_url($link) ?>" class="<?php echo esc_attr($classes) ?>"><?php echo esc_html($action['text']) ?></a>
|
| 467 |
|
| 468 |
<?php
|
| 469 |
endforeach;
|
| 500 |
$class = (isset($action['class'])) ? $action['class'] : '';
|
| 501 |
|
| 502 |
|
| 503 |
+
$link = '<a href="' . esc_url($url) . '" class="action-' . esc_attr($action_arg) . ' ' . esc_attr($class) . '">' . esc_html($text) . '</a>';
|
| 504 |
}
|
| 505 |
|
| 506 |
$actions[$index] = $link;
|
|
@@ -413,7 +413,7 @@ class UiHelper
|
|
| 413 |
{
|
| 414 |
|
| 415 |
$retry = self::getAction('retry', $mediaItem->get('id'));
|
| 416 |
-
$text .= "<div class='shortpixel-image-error'>" . $mediaItem->isOptimizePrevented();
|
| 417 |
$text .= "<span class='shortpixel-error-reset'>" . sprintf(__('After you have fixed this issue, you can %s click here to retry %s', 'shortpixel-image-optimiser'), '<a href="javascript:' . $retry['function'] . '">', '</a>');
|
| 418 |
$text .= '</div>';
|
| 419 |
}
|
| 413 |
{
|
| 414 |
|
| 415 |
$retry = self::getAction('retry', $mediaItem->get('id'));
|
| 416 |
+
$text .= "<div class='shortpixel-image-error'>" . esc_html($mediaItem->isOptimizePrevented());
|
| 417 |
$text .= "<span class='shortpixel-error-reset'>" . sprintf(__('After you have fixed this issue, you can %s click here to retry %s', 'shortpixel-image-optimiser'), '<a href="javascript:' . $retry['function'] . '">', '</a>');
|
| 418 |
$text .= '</div>';
|
| 419 |
}
|
|
@@ -93,8 +93,11 @@ class EnvironmentModel extends \ShortPixel\Model
|
|
| 93 |
case 'spai':
|
| 94 |
$plugin = 'shortpixel-adaptive-images/short-pixel-ai.php';
|
| 95 |
break;
|
|
|
|
|
|
|
|
|
|
| 96 |
default:
|
| 97 |
-
|
| 98 |
break;
|
| 99 |
}
|
| 100 |
|
| 93 |
case 'spai':
|
| 94 |
$plugin = 'shortpixel-adaptive-images/short-pixel-ai.php';
|
| 95 |
break;
|
| 96 |
+
case 's3-offload':
|
| 97 |
+
$plugin = 'amazon-s3-and-cloudfront/wordpress-s3.php';
|
| 98 |
+
break;
|
| 99 |
default:
|
| 100 |
+
$plugin = 'none';
|
| 101 |
break;
|
| 102 |
}
|
| 103 |
|
|
@@ -296,7 +296,7 @@ abstract class ImageModel extends \ShortPixel\Model\File\FileModel
|
|
| 296 |
{
|
| 297 |
$fs = \wpSPIO()->filesystem();
|
| 298 |
|
| 299 |
-
if (! is_null($this->getMeta($type)))
|
| 300 |
{
|
| 301 |
$filepath = $this->getFileDir() . $this->getMeta($type);
|
| 302 |
$file = $fs->getFile($filepath);
|
| 296 |
{
|
| 297 |
$fs = \wpSPIO()->filesystem();
|
| 298 |
|
| 299 |
+
if (! is_null($this->getMeta($type)))
|
| 300 |
{
|
| 301 |
$filepath = $this->getFileDir() . $this->getMeta($type);
|
| 302 |
$file = $fs->getFile($filepath);
|
|
@@ -729,7 +729,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 729 |
|
| 730 |
$prepare = array_merge( array(self::IMAGE_TYPE_MAIN), $duplicates);
|
| 731 |
|
| 732 |
-
|
| 733 |
$sql = 'SELECT attach_id FROM ' . $wpdb->prefix . 'shortpixel_postmeta WHERE image_type = %d and attach_id in ( ' . $in_str . ') ';
|
| 734 |
$sql = $wpdb->prepare($sql, $prepare);
|
| 735 |
|
|
@@ -1864,6 +1863,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 1864 |
return false;
|
| 1865 |
}
|
| 1866 |
|
|
|
|
| 1867 |
$data = $metadata['ShortPixel'];
|
| 1868 |
|
| 1869 |
if (count($data) == 0) // This can happen. Empty array is still nothing to convert.
|
|
@@ -1942,9 +1942,10 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 1942 |
$this->image_meta->originalSize = ($this->getFileSize() / (100 - $imp)) * 100;
|
| 1943 |
}
|
| 1944 |
|
| 1945 |
-
|
| 1946 |
-
|
| 1947 |
-
|
|
|
|
| 1948 |
|
| 1949 |
$this->width = isset($metadata['width']) ? $metadata['width'] : false;
|
| 1950 |
$this->height = isset($metadata['height']) ? $metadata['height'] : false;
|
|
@@ -1983,11 +1984,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 1983 |
|
| 1984 |
$thumbnailObj->has_backup = $thumbnailObj->hasBackup();
|
| 1985 |
|
| 1986 |
-
|
| 1987 |
-
|
| 1988 |
-
{
|
| 1989 |
-
$thumbnailObj->image_meta->webp = $webp->getFileName();
|
| 1990 |
-
}
|
| 1991 |
|
| 1992 |
if (strpos($thumbname, 'sp-found') !== false) // File is 'unlisted', also save file information.
|
| 1993 |
{
|
|
@@ -2012,7 +2010,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 2012 |
$originalFile->image_meta->compressedSize = $originalFile->getFileSize();
|
| 2013 |
$originalFile->image_meta->did_jpg2png = $did_jpg2png;
|
| 2014 |
// $thumbnailObj->image_meta->improvement = -1; // n/a
|
| 2015 |
-
|
|
|
|
| 2016 |
{
|
| 2017 |
$backup = $originalFile->getBackupFile();
|
| 2018 |
$originalFile->image_meta->originalSize = $backup->getFileSize();
|
|
@@ -2022,11 +2021,9 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 2022 |
$originalFile->image_meta->tsOptimized = $tsOptimized;
|
| 2023 |
$originalFile->has_backup = $originalFile->hasBackup();
|
| 2024 |
|
| 2025 |
-
|
| 2026 |
-
|
| 2027 |
-
|
| 2028 |
-
$originalFile->image_meta->webp = $webp->getFileName();
|
| 2029 |
-
}
|
| 2030 |
|
| 2031 |
if (strpos($thumbname, 'sp-found') !== false) // File is 'unlisted', also save file information.
|
| 2032 |
{
|
|
@@ -2080,6 +2077,65 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
|
|
| 2080 |
return true;
|
| 2081 |
}
|
| 2082 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2083 |
private function legacyConvertType($string_type)
|
| 2084 |
{
|
| 2085 |
switch($string_type)
|
| 729 |
|
| 730 |
$prepare = array_merge( array(self::IMAGE_TYPE_MAIN), $duplicates);
|
| 731 |
|
|
|
|
| 732 |
$sql = 'SELECT attach_id FROM ' . $wpdb->prefix . 'shortpixel_postmeta WHERE image_type = %d and attach_id in ( ' . $in_str . ') ';
|
| 733 |
$sql = $wpdb->prepare($sql, $prepare);
|
| 734 |
|
| 1863 |
return false;
|
| 1864 |
}
|
| 1865 |
|
| 1866 |
+
|
| 1867 |
$data = $metadata['ShortPixel'];
|
| 1868 |
|
| 1869 |
if (count($data) == 0) // This can happen. Empty array is still nothing to convert.
|
| 1942 |
$this->image_meta->originalSize = ($this->getFileSize() / (100 - $imp)) * 100;
|
| 1943 |
}
|
| 1944 |
|
| 1945 |
+
|
| 1946 |
+
$this->image_meta->webp = $this->checkLegacyFileTypeFileName($this, 'webp');
|
| 1947 |
+
$this->image_meta->avif = $this->checkLegacyFileTypeFileName($this, 'avif');
|
| 1948 |
+
|
| 1949 |
|
| 1950 |
$this->width = isset($metadata['width']) ? $metadata['width'] : false;
|
| 1951 |
$this->height = isset($metadata['height']) ? $metadata['height'] : false;
|
| 1984 |
|
| 1985 |
$thumbnailObj->has_backup = $thumbnailObj->hasBackup();
|
| 1986 |
|
| 1987 |
+
$thumbnailObj->image_meta->webp = $this->checkLegacyFileTypeFileName($thumbnailObj, 'webp');
|
| 1988 |
+
$thumbnailObj->image_meta->avif = $this->checkLegacyFileTypeFileName($thumbnailObj, 'avif');
|
|
|
|
|
|
|
|
|
|
| 1989 |
|
| 1990 |
if (strpos($thumbname, 'sp-found') !== false) // File is 'unlisted', also save file information.
|
| 1991 |
{
|
| 2010 |
$originalFile->image_meta->compressedSize = $originalFile->getFileSize();
|
| 2011 |
$originalFile->image_meta->did_jpg2png = $did_jpg2png;
|
| 2012 |
// $thumbnailObj->image_meta->improvement = -1; // n/a
|
| 2013 |
+
|
| 2014 |
+
if ($originalFile->hasBackup())
|
| 2015 |
{
|
| 2016 |
$backup = $originalFile->getBackupFile();
|
| 2017 |
$originalFile->image_meta->originalSize = $backup->getFileSize();
|
| 2021 |
$originalFile->image_meta->tsOptimized = $tsOptimized;
|
| 2022 |
$originalFile->has_backup = $originalFile->hasBackup();
|
| 2023 |
|
| 2024 |
+
$originalFile->image_meta->webp = $this->checkLegacyFileTypeFileName($originalFile, 'webp');
|
| 2025 |
+
$originalFile->image_meta->avif = $this->checkLegacyFileTypeFileName($originalFile, 'avif');
|
| 2026 |
+
|
|
|
|
|
|
|
| 2027 |
|
| 2028 |
if (strpos($thumbname, 'sp-found') !== false) // File is 'unlisted', also save file information.
|
| 2029 |
{
|
| 2077 |
return true;
|
| 2078 |
}
|
| 2079 |
|
| 2080 |
+
private function checkLegacyFileTypeFileName($fileObj, $type)
|
| 2081 |
+
{
|
| 2082 |
+
$fileType = $fileObj->getImageType($type);
|
| 2083 |
+
if ($fileType !== false)
|
| 2084 |
+
{
|
| 2085 |
+
return $fileType->getFileName();
|
| 2086 |
+
}
|
| 2087 |
+
$env = \wpSPIO()->env();
|
| 2088 |
+
$fs = \wpSPIO()->filesystem();
|
| 2089 |
+
|
| 2090 |
+
// try the whole thing, but fetching remote URLS, test if really S3 not in case something went wrong with is_virtual, or it's just something messed up.
|
| 2091 |
+
if ($fileObj->is_virtual() && $env->plugin_active('s3-offload') )
|
| 2092 |
+
{
|
| 2093 |
+
if ($type == 'webp')
|
| 2094 |
+
{
|
| 2095 |
+
$is_double = \wpSPIO()->env()->useDoubleWebpExtension();
|
| 2096 |
+
}
|
| 2097 |
+
if ($type == 'avif')
|
| 2098 |
+
{
|
| 2099 |
+
$is_double = \wpSPIO()->env()->useDoubleAvifExtension();
|
| 2100 |
+
}
|
| 2101 |
+
|
| 2102 |
+
$url = str_replace('.' . $fileObj->getExtension(), '.' . $type, $fileObj->getURL());
|
| 2103 |
+
$double_url = $fileObj->getURL() . '.' . $type;
|
| 2104 |
+
|
| 2105 |
+
$double_filename = $fileObj->getFileName() . '.' . $type;
|
| 2106 |
+
$filename = $fileObj->getFileBase() . '.' . $type;
|
| 2107 |
+
|
| 2108 |
+
if ($is_double)
|
| 2109 |
+
{
|
| 2110 |
+
$url_exists = $fs->url_exists($double_url);
|
| 2111 |
+
if ($url_exists === true)
|
| 2112 |
+
return $double_filename;
|
| 2113 |
+
}
|
| 2114 |
+
else
|
| 2115 |
+
{
|
| 2116 |
+
$url_exists = $fs->url_exists($url);
|
| 2117 |
+
if ($url_exists === true)
|
| 2118 |
+
return $filename;
|
| 2119 |
+
}
|
| 2120 |
+
|
| 2121 |
+
// If double extension is enabled, but no file, check the alternative.
|
| 2122 |
+
if ($is_double)
|
| 2123 |
+
{
|
| 2124 |
+
$url_exists = $fs->url_exists($url);
|
| 2125 |
+
if ($url_exists === true)
|
| 2126 |
+
return $filename;
|
| 2127 |
+
}
|
| 2128 |
+
else
|
| 2129 |
+
{
|
| 2130 |
+
$url_exists = $fs->getFile($double_url);
|
| 2131 |
+
if ($url_exists === true)
|
| 2132 |
+
return $double_filename;
|
| 2133 |
+
}
|
| 2134 |
+
} // is_virtual
|
| 2135 |
+
|
| 2136 |
+
return null;
|
| 2137 |
+
}
|
| 2138 |
+
|
| 2139 |
private function legacyConvertType($string_type)
|
| 2140 |
{
|
| 2141 |
switch($string_type)
|
|
@@ -371,17 +371,28 @@ class StatsModel
|
|
| 371 |
//$monthsAgo = 0 - $monthsAgo; // minus it for the sub.
|
| 372 |
/*$sql = "select meta_id from wp_postmeta where meta_key = '_shortpixel_meta' HAVING substr(meta_value, instr(meta_value, 'tsOptimized')+15,10) as stamp >= %d and stamp <= %d"; */
|
| 373 |
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
$date = new \DateTime();
|
| 377 |
$date->sub( new \DateInterval('P' . $monthsAgo . 'M'));
|
| 378 |
|
| 379 |
$dateUntil = new \DateTime();
|
| 380 |
$dateUntil->sub( new \DateInterval('P' . ($monthsAgo-1). 'M'));
|
| 381 |
|
| 382 |
-
$sql =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 383 |
|
| 384 |
-
$count = $wpdb->get_var($sql);
|
| 385 |
|
| 386 |
return $count;
|
| 387 |
}
|
| 371 |
//$monthsAgo = 0 - $monthsAgo; // minus it for the sub.
|
| 372 |
/*$sql = "select meta_id from wp_postmeta where meta_key = '_shortpixel_meta' HAVING substr(meta_value, instr(meta_value, 'tsOptimized')+15,10) as stamp >= %d and stamp <= %d"; */
|
| 373 |
|
| 374 |
+
$date = new \DateTime();
|
|
|
|
|
|
|
| 375 |
$date->sub( new \DateInterval('P' . $monthsAgo . 'M'));
|
| 376 |
|
| 377 |
$dateUntil = new \DateTime();
|
| 378 |
$dateUntil->sub( new \DateInterval('P' . ($monthsAgo-1). 'M'));
|
| 379 |
|
| 380 |
+
$sql = 'SELECT count(id) FROM ' . $wpdb->prefix . 'shortpixel_postmeta WHERE tsOptimized >= %s and tsOptimized <= %s';
|
| 381 |
+
$sql = $wpdb->prepare($sql, $date->format('Y-m-d H:i:s'), $dateUntil->format('Y-m-d H:i:s') );
|
| 382 |
+
$count_media = $wpdb->get_var($sql);
|
| 383 |
+
|
| 384 |
+
// Custom
|
| 385 |
+
$sql = 'SELECT count(id) FROM ' . $wpdb->prefix . 'shortpixel_meta WHERE ts_optimized >= %s and ts_optimized <= %s';
|
| 386 |
+
$sql = $wpdb->prepare($sql, $date->format('Y-m-d H:i:s'), $dateUntil->format('Y-m-d H:i:s') );
|
| 387 |
+
$count_custom = $wpdb->get_var($sql);
|
| 388 |
+
|
| 389 |
+
$count = 0;
|
| 390 |
+
if (! is_null($count_media) && is_numeric($count_media))
|
| 391 |
+
$count += $count_media;
|
| 392 |
+
|
| 393 |
+
if (! is_null($count_custom) && is_numeric($count_custom))
|
| 394 |
+
$count += $count_custom;
|
| 395 |
|
|
|
|
| 396 |
|
| 397 |
return $count;
|
| 398 |
}
|
|
@@ -75,7 +75,6 @@ class ViewController extends Controller
|
|
| 75 |
// load either param or class template.
|
| 76 |
$template = (is_null($template)) ? $this->template : $template;
|
| 77 |
|
| 78 |
-
|
| 79 |
if (is_null($template) )
|
| 80 |
{
|
| 81 |
return false;
|
|
@@ -93,7 +92,7 @@ class ViewController extends Controller
|
|
| 93 |
if (file_exists($template_path) === false)
|
| 94 |
{
|
| 95 |
Log::addError("View $template could not be found in " . $template_path,
|
| 96 |
-
array('class' => get_class($this)
|
| 97 |
}
|
| 98 |
elseif ($unique === false || ! in_array($template, self::$viewsLoaded))
|
| 99 |
{
|
| 75 |
// load either param or class template.
|
| 76 |
$template = (is_null($template)) ? $this->template : $template;
|
| 77 |
|
|
|
|
| 78 |
if (is_null($template) )
|
| 79 |
{
|
| 80 |
return false;
|
| 92 |
if (file_exists($template_path) === false)
|
| 93 |
{
|
| 94 |
Log::addError("View $template could not be found in " . $template_path,
|
| 95 |
+
array('class' => get_class($this)));
|
| 96 |
}
|
| 97 |
elseif ($unique === false || ! in_array($template, self::$viewsLoaded))
|
| 98 |
{
|
|
@@ -1,179 +0,0 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
namespace ShortPixel;
|
| 3 |
-
|
| 4 |
-
use ShortPixel\Controller\ApiKeyController as ApiKeyController;
|
| 5 |
-
|
| 6 |
-
// Integration class for HelpScout
|
| 7 |
-
class HelpScout
|
| 8 |
-
{
|
| 9 |
-
public static function outputBeacon()
|
| 10 |
-
{
|
| 11 |
-
return; // this is disabled.
|
| 12 |
-
|
| 13 |
-
global $shortPixelPluginInstance;
|
| 14 |
-
$settings = \wpSPIO()->settings();
|
| 15 |
-
$dismissed = $settings->dismissedNotices ? $settings->dismissedNotices : array();
|
| 16 |
-
if(isset($dismissed['help'])) {
|
| 17 |
-
return;
|
| 18 |
-
}
|
| 19 |
-
|
| 20 |
-
// if ($settings->helpscoutOptin <> 1)
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
$keyControl = ApiKeyController::getInstance();
|
| 24 |
-
$apikey = $keyControl->getKeyForDisplay();
|
| 25 |
-
|
| 26 |
-
?>
|
| 27 |
-
<style>
|
| 28 |
-
.shortpixel-hs-blind {
|
| 29 |
-
position: fixed;
|
| 30 |
-
bottom: 4px;
|
| 31 |
-
right: 0;
|
| 32 |
-
z-index: 20003;
|
| 33 |
-
background-color: white;
|
| 34 |
-
width: 87px;
|
| 35 |
-
height: 188px;
|
| 36 |
-
border-radius: 20px 0 0 20px;
|
| 37 |
-
text-align: right;
|
| 38 |
-
padding-right: 15px;
|
| 39 |
-
}
|
| 40 |
-
.shortpixel-hs-blind a {
|
| 41 |
-
color: lightgray;
|
| 42 |
-
text-decoration: none;
|
| 43 |
-
}
|
| 44 |
-
.shortpixel-hs-blind i.dashicons {
|
| 45 |
-
margin-top: -8px;
|
| 46 |
-
}
|
| 47 |
-
.shortpixel-hs-blind .dashicons-minus {
|
| 48 |
-
border: 3px solid;
|
| 49 |
-
border-radius: 12px;
|
| 50 |
-
font-size: 12px;
|
| 51 |
-
font-weight: bold;
|
| 52 |
-
line-height: 15px;
|
| 53 |
-
height: 13px;
|
| 54 |
-
width: 13px;
|
| 55 |
-
display:none;
|
| 56 |
-
}
|
| 57 |
-
.shortpixel-hs-blind .dashicons-dismiss {
|
| 58 |
-
font-size: 23px;
|
| 59 |
-
line-height: 19px;
|
| 60 |
-
display: none;
|
| 61 |
-
}
|
| 62 |
-
.shortpixel-hs-blind:hover .dashicons-minus,
|
| 63 |
-
.shortpixel-hs-blind:hover .dashicons-dismiss {
|
| 64 |
-
display: inline-block;
|
| 65 |
-
}
|
| 66 |
-
.shortpixel-hs-button-blind {
|
| 67 |
-
display:none;
|
| 68 |
-
position: fixed;
|
| 69 |
-
bottom: 115px;right: 0;
|
| 70 |
-
z-index: 20003;
|
| 71 |
-
background-color: white;
|
| 72 |
-
width: 237px;
|
| 73 |
-
height: 54px;
|
| 74 |
-
}
|
| 75 |
-
.shortpixel-hs-tools {
|
| 76 |
-
position: fixed;
|
| 77 |
-
bottom: 116px;
|
| 78 |
-
right: 0px;
|
| 79 |
-
z-index: 20003;
|
| 80 |
-
background-color: #ecf9fc;
|
| 81 |
-
padding: 8px 18px 3px 12px;
|
| 82 |
-
border-radius: 26px 0 0 26px;
|
| 83 |
-
-webkit-box-shadow: 1px 1px 5px 0px rgba(6,109,117,1);
|
| 84 |
-
-moz-box-shadow: 1px 1px 5px 0px rgba(6,109,117,1);
|
| 85 |
-
box-shadow: 1px 1px 10px 0px rgb(172, 173, 173);
|
| 86 |
-
}
|
| 87 |
-
@media (max-width: 767px) {
|
| 88 |
-
.shortpixel-hs-blind {
|
| 89 |
-
bottom: 8px;
|
| 90 |
-
height: 194px;
|
| 91 |
-
}
|
| 92 |
-
.shortpixel-hs-button-blind {
|
| 93 |
-
bottom: 100px;
|
| 94 |
-
}
|
| 95 |
-
}
|
| 96 |
-
</style>
|
| 97 |
-
<div id="shortpixel-hs-blind" class="shortpixel-hs-blind">
|
| 98 |
-
<a href="javascript:ShortPixel.closeHelpPane();">
|
| 99 |
-
<i class="dashicons dashicons-minus" title="<?php _e('Dismiss for now', 'shortpixel-image-optimiser'); ?> "></i>
|
| 100 |
-
</a>
|
| 101 |
-
<a href="javascript:ShortPixel.dismissHelpPane();">
|
| 102 |
-
<i class="dashicons dashicons-dismiss" title="<?php _e('Never display again', 'shortpixel-image-optimiser'); ?>"></i>
|
| 103 |
-
</a>
|
| 104 |
-
</div>
|
| 105 |
-
<!--<div id="shortpixel-hs-button-blind" class="shortpixel-hs-button-blind"></div>-->
|
| 106 |
-
<div id="shortpixel-hs-tools" class="shortpixel-hs-tools">
|
| 107 |
-
<a href="javascript:shortpixelToggleHS();" class="shortpixel-hs-tools-docs" title="<?php _e('Search through our online documentation.', 'shortpixel-image-optimiser'); ?>">
|
| 108 |
-
<img alt="<?php _e('ShortPixel document icon', 'shortpixel-image-optimiser'); ?>" src="<?php echo( wpSPIO()->plugin_url('res/img/notes-sp.png') );?>" style="margin-bottom: 2px;width: 36px;">
|
| 109 |
-
</a>
|
| 110 |
-
</div>
|
| 111 |
-
<script>
|
| 112 |
-
window.shortpixelHSOpen = 0;//-1;
|
| 113 |
-
function shortpixelToggleHS() {
|
| 114 |
-
//if(window.shortpixelHSOpen == -1) {
|
| 115 |
-
// HS.beacon.init();
|
| 116 |
-
//}
|
| 117 |
-
if(window.shortpixelHSOpen == 1) {
|
| 118 |
-
window.Beacon('close');
|
| 119 |
-
jQuery('#botbutton').addClass('show');
|
| 120 |
-
jQuery('div.shortpixel-hs-tools').css('bottom', '116px');
|
| 121 |
-
jQuery('div.shortpixel-hs-blind').css('height', '188px');
|
| 122 |
-
jQuery('div.shortpixel-hs-blind').css('border-radius', '20px 0 0 20px');
|
| 123 |
-
jQuery('div.shortpixel-hs-blind a').css('display', 'inline');
|
| 124 |
-
window.shortpixelHSOpen = 0;
|
| 125 |
-
} else {
|
| 126 |
-
window.Beacon('open');
|
| 127 |
-
jQuery('#botbutton').removeClass('show');
|
| 128 |
-
jQuery('div.shortpixel-hs-tools').css('bottom', '40px');
|
| 129 |
-
jQuery('div.shortpixel-hs-blind').css('height', '93px');
|
| 130 |
-
jQuery('div.shortpixel-hs-blind').css('border-radius', '0 0 0 20px');
|
| 131 |
-
jQuery('div.shortpixel-hs-blind a').css('display', 'none');
|
| 132 |
-
window.shortpixelHSOpen = 1;
|
| 133 |
-
}
|
| 134 |
-
}
|
| 135 |
-
</script>
|
| 136 |
-
<script type="text/javascript" src="https://quriobot.com/qb/widget/KoPqxmzqzjbg5eNl/V895xbyndnmeqZYd" async defer></script>
|
| 137 |
-
|
| 138 |
-
<script>
|
| 139 |
-
<?php
|
| 140 |
-
$screen = get_current_screen();
|
| 141 |
-
if($screen) {
|
| 142 |
-
switch($screen->id) {
|
| 143 |
-
case 'media_page_wp-short-pixel-bulk':
|
| 144 |
-
echo("var shortpixel_suggestions = [ '5a5de2782c7d3a19436843af', '5a5de6902c7d3a19436843e9', '5a5de5c42c7d3a19436843d0', '5a9945e42c7d3a75495145d0', '5a5de1c2042863193801047c', '5a5de66f2c7d3a19436843e0', '5a9946e62c7d3a75495145d8', '5a5de4f02c7d3a19436843c8', '5a5de65f042863193801049f', '5a5de2df0428631938010485' ]; ");
|
| 145 |
-
$suggestions = "shortpixel_suggestions";
|
| 146 |
-
break;
|
| 147 |
-
case 'settings_page_wp-shortpixel-settings':
|
| 148 |
-
echo("var shortpixel_suggestions_settings = [ '5a5de1de2c7d3a19436843a8', '5a6612032c7d3a39e6263a1d', '5a5de1c2042863193801047c', '5a5de2782c7d3a19436843af', '5a6610c62c7d3a39e6263a02', '5a9945e42c7d3a75495145d0', '5a5de66f2c7d3a19436843e0', '5a6597e80428632faf620487', '5a5de5c42c7d3a19436843d0', '5a5de5642c7d3a19436843cc' ]; ");
|
| 149 |
-
echo("var shortpixel_suggestions_adv_settings = [ '5a5de4f02c7d3a19436843c8', '5a8431f00428634376d01dc4', '5a5de58b0428631938010497', '5a5de65f042863193801049f', '5a9945e42c7d3a75495145d0', '5a9946e62c7d3a75495145d8', '5a5de57c0428631938010495', '5a5de2d22c7d3a19436843b1', '5a5de5c42c7d3a19436843d0', '5a5de5642c7d3a19436843cc' ]; ");
|
| 150 |
-
echo("var shortpixel_suggestions_cloudflare = [ '5a5de1f62c7d3a19436843a9', '5a5de58b0428631938010497', '5a5de66f2c7d3a19436843e0', '5a5de5c42c7d3a19436843d0', '5a5de6902c7d3a19436843e9', '5a5de51a2c7d3a19436843c9', '5a9946e62c7d3a75495145d8', '5a5de46c2c7d3a19436843c1', '5a5de1de2c7d3a19436843a8', '5a6597e80428632faf620487' ]; ");
|
| 151 |
-
$suggestions = "shortpixel_suggestions_settings";
|
| 152 |
-
break;
|
| 153 |
-
case 'media_page_wp-short-pixel-custom':
|
| 154 |
-
echo("var shortpixel_suggestions = [ '5a9946e62c7d3a75495145d8', '5a5de1c2042863193801047c', '5a5de2782c7d3a19436843af', '5a5de6902c7d3a19436843e9', '5a5de4f02c7d3a19436843c8', '5a6610c62c7d3a39e6263a02', '5a9945e42c7d3a75495145d0', '5a5de46c2c7d3a19436843c1', '5a5de1de2c7d3a19436843a8', '5a5de25c2c7d3a19436843ad' ]; ");
|
| 155 |
-
$suggestions = "shortpixel_suggestions";
|
| 156 |
-
break;
|
| 157 |
-
}
|
| 158 |
-
}
|
| 159 |
-
?>
|
| 160 |
-
!function(e,t,n){
|
| 161 |
-
function a(){
|
| 162 |
-
var e=t.getElementsByTagName("script")[0],n=t.createElement("script");n.type="text/javascript",n.async=!0,n.src="https://beacon-v2.helpscout.net",e.parentNode.insertBefore(n,e)
|
| 163 |
-
}
|
| 164 |
-
if(e.Beacon=n=function(t,n,a){
|
| 165 |
-
e.Beacon.readyQueue.push({method:t,options:n,data:a})
|
| 166 |
-
},n.readyQueue=[],"complete"===t.readyState) return a();
|
| 167 |
-
e.attachEvent?e.attachEvent("onload",a):e.addEventListener("load",a,!1)
|
| 168 |
-
}(window,document,window.Beacon||function(){});
|
| 169 |
-
window.Beacon('init', 'e41d21e0-f3c4-4399-bcfe-358e59a860de');
|
| 170 |
-
|
| 171 |
-
window.Beacon('identify', {
|
| 172 |
-
email: "<?php $u = wp_get_current_user(); echo($u->user_email); ?>",
|
| 173 |
-
apiKey: "<?php echo($apikey);?>"
|
| 174 |
-
});
|
| 175 |
-
window.Beacon('suggest', <?php echo( $suggestions ) ?>);
|
| 176 |
-
</script>
|
| 177 |
-
<?php
|
| 178 |
-
}
|
| 179 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1 +1 @@
|
|
| 1 |
-
{"name":"ShortPixel\/Plugin","description":"ShortPixel AutoLoader","type":"function","autoload":{"psr-4":{"ShortPixel":"class"},"files":["class\/wp-shortpixel-settings.php","class\/shortpixel-png2jpg.php","class\/front\/img-to-picture-webp.php","class\/external\/cloudflare.php","class\/external\/flywheel.php","class\/external\/
|
| 1 |
+
{"name":"ShortPixel\/Plugin","description":"ShortPixel AutoLoader","type":"function","autoload":{"psr-4":{"ShortPixel":"class"},"files":["class\/wp-shortpixel-settings.php","class\/shortpixel-png2jpg.php","class\/front\/img-to-picture-webp.php","class\/external\/cloudflare.php","class\/external\/flywheel.php","class\/external\/nextgen\/nextGenController.php","class\/external\/nextgen\/nextGenViewController.php","class\/external\/visualcomposer.php","class\/external\/wp-offload-media.php","class\/external\/wp-cli\/wp-cli-base.php","class\/external\/wp-cli\/wp-cli-single.php","class\/external\/wp-cli\/wp-cli-bulk.php","class\/external\/custom-suffixes.php","class\/external\/pantheon.php","class\/external\/spai.php"]}}
|
|
@@ -79,7 +79,8 @@ use \ShortPixel\Controller\BulkController as BulkController;
|
|
| 79 |
|
| 80 |
<button class="button" type="button" data-action="open-panel" data-panel="dashboard"><?php _e('Back','shortpixel-image-optimiser'); ?></button>
|
| 81 |
|
| 82 |
-
<button type="button" type="button" class="button disabled button-primary" disabled id='bulk-migrate-button' data-action="BulkMigrateAll" ><?php _e('Search and migrate All Images', 'shortpixel-image-optimiser')
|
|
|
|
| 83 |
|
| 84 |
</nav>
|
| 85 |
</div>
|
| 79 |
|
| 80 |
<button class="button" type="button" data-action="open-panel" data-panel="dashboard"><?php _e('Back','shortpixel-image-optimiser'); ?></button>
|
| 81 |
|
| 82 |
+
<button type="button" type="button" class="button disabled button-primary" disabled id='bulk-migrate-button' data-action="BulkMigrateAll" ><?php _e('Search and migrate All Images', 'shortpixel-image-optimiser') ?>
|
| 83 |
+
</button>
|
| 84 |
|
| 85 |
</nav>
|
| 86 |
</div>
|
|
@@ -161,13 +161,13 @@ $env = \wpSPIO()->env();
|
|
| 161 |
foreach($queues as $name => $queue):
|
| 162 |
$stats = $queue->getStats();
|
| 163 |
echo "<div>";
|
| 164 |
-
echo "<span>" .
|
| 165 |
-
echo "<span>" . $stats->in_queue . '</span>';
|
| 166 |
-
echo "<span>" . $stats->in_process . '</span>';
|
| 167 |
-
echo "<span>" . $stats->errors . '</span>';
|
| 168 |
-
echo "<span>" . $stats->fatal_errors . '</span>';
|
| 169 |
-
echo "<span>" . $stats->done . '</span>';
|
| 170 |
-
echo "<span>" . $stats->total . '</span>';
|
| 171 |
|
| 172 |
echo "</div>";
|
| 173 |
?>
|
| 161 |
foreach($queues as $name => $queue):
|
| 162 |
$stats = $queue->getStats();
|
| 163 |
echo "<div>";
|
| 164 |
+
echo "<span>" . esc_html($name) . '</span>';
|
| 165 |
+
echo "<span>" . esc_html($stats->in_queue) . '</span>';
|
| 166 |
+
echo "<span>" . esc_html($stats->in_process) . '</span>';
|
| 167 |
+
echo "<span>" . esc_html($stats->errors) . '</span>';
|
| 168 |
+
echo "<span>" . esc_html($stats->fatal_errors) . '</span>';
|
| 169 |
+
echo "<span>" . esc_html($stats->done) . '</span>';
|
| 170 |
+
echo "<span>" . esc_html($stats->total) . '</span>';
|
| 171 |
|
| 172 |
echo "</div>";
|
| 173 |
?>
|
|
@@ -95,9 +95,9 @@ class ShortPixelPluginRequest {
|
|
| 95 |
*
|
| 96 |
*/
|
| 97 |
private function _collect_server_data() {
|
| 98 |
-
$this->data['server']['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
|
| 99 |
$this->data['server']['php_version'] = phpversion();
|
| 100 |
-
$this->data['server']['url'] = home_url();
|
| 101 |
}
|
| 102 |
|
| 103 |
/**
|
| 95 |
*
|
| 96 |
*/
|
| 97 |
private function _collect_server_data() {
|
| 98 |
+
$this->data['server']['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field($_SERVER['SERVER_SOFTWARE']) : '';
|
| 99 |
$this->data['server']['php_version'] = phpversion();
|
| 100 |
+
$this->data['server']['url'] = esc_url(home_url());
|
| 101 |
}
|
| 102 |
|
| 103 |
/**
|
|
@@ -4,7 +4,7 @@ Tags: convert webp, optimize images, image optimization, resize, compressor, ima
|
|
| 4 |
Requires at least: 4.8.0
|
| 5 |
Tested up to: 6.0
|
| 6 |
Requires PHP: 5.6
|
| 7 |
-
Stable tag: 5.0.
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
|
@@ -309,6 +309,17 @@ Add HTTP basic authentication credentials by defining these constants in wp-conf
|
|
| 309 |
|
| 310 |
== Changelog ==
|
| 311 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 312 |
= 5.0.2 =
|
| 313 |
Release date June 16th, 2022
|
| 314 |
* Fix: an uncaught error was fixed for the sites running without the `fileinfo` PHP extension that is needed by the plugin to get the mime type of the files;
|
| 4 |
Requires at least: 4.8.0
|
| 5 |
Tested up to: 6.0
|
| 6 |
Requires PHP: 5.6
|
| 7 |
+
Stable tag: 5.0.3
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
| 309 |
|
| 310 |
== Changelog ==
|
| 311 |
|
| 312 |
+
= 5.0.3 =
|
| 313 |
+
Release date June 21st, 2022
|
| 314 |
+
* Fix: the plugin now recognizes the offloaded WebP/AVIF files, when they are not also present anymore on the server;
|
| 315 |
+
* Fix: in some cases, the bulk and manual optimization was stuck due to some errors related to the legacy optimization information;
|
| 316 |
+
* Fix: when saving the settings, the credits quota and other API-related data will be sent to the API, for faster sync;
|
| 317 |
+
* Fix: when having the backups turned off, a placeholder image was displayed instead of the original one;
|
| 318 |
+
* Fix: an empty space was sometimes shown on some pages, as a result of some dismissed notifications;
|
| 319 |
+
* Fix: various small fixes around the plugin processing engine, for increased speed and stability;
|
| 320 |
+
* Fix: updated various pieces of code in accordance with the WordPress Coding Standards;
|
| 321 |
+
* Language: 1 new string added, 0 updated, 0 fuzzed, and 0 obsoleted.
|
| 322 |
+
|
| 323 |
= 5.0.2 =
|
| 324 |
Release date June 16th, 2022
|
| 325 |
* Fix: an uncaught error was fixed for the sites running without the `fileinfo` PHP extension that is needed by the plugin to get the mime type of the files;
|
|
@@ -121,20 +121,23 @@ console.log("Screen Init Done", initMedia, initCustom);
|
|
| 121 |
var eventName = (action.getAttribute('data-event')) ? action.getAttribute('data-event') : 'click';
|
| 122 |
|
| 123 |
action.addEventListener(eventName, self.DoActionEvent.bind(self));
|
|
|
|
|
|
|
| 124 |
if (action.children.length > 0)
|
| 125 |
{
|
| 126 |
for(var i = 0; i < action.children.length; i++)
|
| 127 |
{
|
| 128 |
-
|
| 129 |
}
|
| 130 |
}
|
|
|
|
| 131 |
});
|
| 132 |
-
}
|
|
|
|
| 133 |
this.DoActionEvent = function(event)
|
| 134 |
{
|
| 135 |
var element = event.target;
|
| 136 |
-
|
| 137 |
-
event.stopPropagation();
|
| 138 |
|
| 139 |
// Might be the child
|
| 140 |
if (element.getAttribute('data-action') == null)
|
|
@@ -148,7 +151,6 @@ console.log("Screen Init Done", initMedia, initCustom);
|
|
| 148 |
var actionName = element.getAttribute('data-action');
|
| 149 |
var isPanelAction = (actionName == 'open-panel');
|
| 150 |
|
| 151 |
-
|
| 152 |
if (isPanelAction)
|
| 153 |
{
|
| 154 |
var doPanel = element.getAttribute('data-panel');
|
|
@@ -161,7 +163,6 @@ console.log("Screen Init Done", initMedia, initCustom);
|
|
| 161 |
this[actionName].call(this,event);
|
| 162 |
}
|
| 163 |
}
|
| 164 |
-
|
| 165 |
}
|
| 166 |
|
| 167 |
this.UpdatePanelStatus = function(status, panelName)
|
|
@@ -421,8 +422,7 @@ console.log("Screen Init Done", initMedia, initCustom);
|
|
| 421 |
preview.querySelector('.new.preview-image .image.source img').src = originalSrc;
|
| 422 |
}
|
| 423 |
else {
|
| 424 |
-
|
| 425 |
-
preview.querySelector('.new.preview-image .image.source img').classList.add('notempty');
|
| 426 |
}
|
| 427 |
|
| 428 |
if (optimizedSrc)
|
|
@@ -430,7 +430,9 @@ console.log("Screen Init Done", initMedia, initCustom);
|
|
| 430 |
preview.querySelector('.new.preview-image .image.result img').src = optimizedSrc;
|
| 431 |
}
|
| 432 |
else {
|
| 433 |
-
preview.querySelector('.new.preview-image .image.result').
|
|
|
|
|
|
|
| 434 |
}
|
| 435 |
// currentItem.classList.add('slideleft');
|
| 436 |
currentItem.style.marginLeft = '-' + offset + 'px';
|
| 121 |
var eventName = (action.getAttribute('data-event')) ? action.getAttribute('data-event') : 'click';
|
| 122 |
|
| 123 |
action.addEventListener(eventName, self.DoActionEvent.bind(self));
|
| 124 |
+
/*
|
| 125 |
+
This is off, since I can't find any clue that children don't get triggered, but it does create double events when added.
|
| 126 |
if (action.children.length > 0)
|
| 127 |
{
|
| 128 |
for(var i = 0; i < action.children.length; i++)
|
| 129 |
{
|
| 130 |
+
// action.children[i].addEventListener(eventName, self.DoActionEvent.bind(self));
|
| 131 |
}
|
| 132 |
}
|
| 133 |
+
*/
|
| 134 |
});
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
this.DoActionEvent = function(event)
|
| 138 |
{
|
| 139 |
var element = event.target;
|
| 140 |
+
var action = element.getAttribute('data-action');
|
|
|
|
| 141 |
|
| 142 |
// Might be the child
|
| 143 |
if (element.getAttribute('data-action') == null)
|
| 151 |
var actionName = element.getAttribute('data-action');
|
| 152 |
var isPanelAction = (actionName == 'open-panel');
|
| 153 |
|
|
|
|
| 154 |
if (isPanelAction)
|
| 155 |
{
|
| 156 |
var doPanel = element.getAttribute('data-panel');
|
| 163 |
this[actionName].call(this,event);
|
| 164 |
}
|
| 165 |
}
|
|
|
|
| 166 |
}
|
| 167 |
|
| 168 |
this.UpdatePanelStatus = function(status, panelName)
|
| 422 |
preview.querySelector('.new.preview-image .image.source img').src = originalSrc;
|
| 423 |
}
|
| 424 |
else {
|
| 425 |
+
preview.querySelector('.new.preview-image .image.source').style.display = 'none';
|
|
|
|
| 426 |
}
|
| 427 |
|
| 428 |
if (optimizedSrc)
|
| 430 |
preview.querySelector('.new.preview-image .image.result img').src = optimizedSrc;
|
| 431 |
}
|
| 432 |
else {
|
| 433 |
+
preview.querySelector('.new.preview-image .image.result img').src = placeHolder;
|
| 434 |
+
preview.querySelector('.new.preview-image .image.result img').classList.add('notempty');
|
| 435 |
+
|
| 436 |
}
|
| 437 |
// currentItem.classList.add('slideleft');
|
| 438 |
currentItem.style.marginLeft = '-' + offset + 'px';
|
|
@@ -99,7 +99,7 @@ window.ShortPixelProcessor =
|
|
| 99 |
|
| 100 |
|
| 101 |
this.tooltip = new ShortPixelToolTip({}, this);
|
| 102 |
-
|
| 103 |
if (typeof ShortPixelScreen == 'undefined')
|
| 104 |
{
|
| 105 |
console.error('Missing Screen!');
|
|
@@ -411,6 +411,7 @@ window.ShortPixelProcessor =
|
|
| 411 |
// If there are items, give them to the screen for display of optimization, waiting status etc.
|
| 412 |
var imageHandled = false; // Only post one image per result-set to the ImageHandler (on bulk), to prevent flooding.
|
| 413 |
|
|
|
|
| 414 |
if (typeof response.results !== 'undefined' && response.results !== null)
|
| 415 |
{
|
| 416 |
for (var i = 0; i < response.results.length; i++)
|
|
@@ -436,9 +437,10 @@ window.ShortPixelProcessor =
|
|
| 436 |
if (typeof response.result !== 'undefined' && response.result !== null)
|
| 437 |
{
|
| 438 |
if (response.result.is_error)
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
|
|
|
| 442 |
{
|
| 443 |
imageHandled = this.screen.HandleImage(response, type); // whole response here is single item. (final!)
|
| 444 |
}
|
|
@@ -500,11 +502,8 @@ window.ShortPixelProcessor =
|
|
| 500 |
else if (qstatus == "PREPARING_DONE")
|
| 501 |
{
|
| 502 |
console.log('Processor: Preparing is done');
|
| 503 |
-
//this.tooltip.ProcessEnd();
|
| 504 |
this.StopProcess();
|
| 505 |
|
| 506 |
-
//if (typeof this.screen.preparingDone == 'function')
|
| 507 |
-
// this.screen.PreparingDone();
|
| 508 |
}
|
| 509 |
|
| 510 |
// React to status of the queue.
|
|
@@ -512,6 +511,7 @@ window.ShortPixelProcessor =
|
|
| 512 |
this.screen.QueueStatus(qstatus, data);
|
| 513 |
}
|
| 514 |
},
|
|
|
|
| 515 |
HandleItemError : function(result, type)
|
| 516 |
{
|
| 517 |
console.log('Handle Item Error', result, type);
|
| 99 |
|
| 100 |
|
| 101 |
this.tooltip = new ShortPixelToolTip({}, this);
|
| 102 |
+
|
| 103 |
if (typeof ShortPixelScreen == 'undefined')
|
| 104 |
{
|
| 105 |
console.error('Missing Screen!');
|
| 411 |
// If there are items, give them to the screen for display of optimization, waiting status etc.
|
| 412 |
var imageHandled = false; // Only post one image per result-set to the ImageHandler (on bulk), to prevent flooding.
|
| 413 |
|
| 414 |
+
// @todo Make sure that .result and .results can be iterated the same.
|
| 415 |
if (typeof response.results !== 'undefined' && response.results !== null)
|
| 416 |
{
|
| 417 |
for (var i = 0; i < response.results.length; i++)
|
| 437 |
if (typeof response.result !== 'undefined' && response.result !== null)
|
| 438 |
{
|
| 439 |
if (response.result.is_error)
|
| 440 |
+
{
|
| 441 |
+
this.HandleItemError(response.result, type);
|
| 442 |
+
}
|
| 443 |
+
elseif (! imageHandled)
|
| 444 |
{
|
| 445 |
imageHandled = this.screen.HandleImage(response, type); // whole response here is single item. (final!)
|
| 446 |
}
|
| 502 |
else if (qstatus == "PREPARING_DONE")
|
| 503 |
{
|
| 504 |
console.log('Processor: Preparing is done');
|
|
|
|
| 505 |
this.StopProcess();
|
| 506 |
|
|
|
|
|
|
|
| 507 |
}
|
| 508 |
|
| 509 |
// React to status of the queue.
|
| 511 |
this.screen.QueueStatus(qstatus, data);
|
| 512 |
}
|
| 513 |
},
|
| 514 |
+
|
| 515 |
HandleItemError : function(result, type)
|
| 516 |
{
|
| 517 |
console.log('Handle Item Error', result, type);
|
|
@@ -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="/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings > ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
|
| 6 |
-
* Version: 5.0.
|
| 7 |
* Author: ShortPixel
|
| 8 |
* Author URI: https://shortpixel.com
|
| 9 |
* GitHub Plugin URI: https://github.com/short-pixel-optimizer/shortpixel-image-optimiser
|
|
@@ -30,7 +30,7 @@ if (! defined('SHORTPIXEL_RESET_ON_ACTIVATE'))
|
|
| 30 |
define('SHORTPIXEL_PLUGIN_FILE', __FILE__);
|
| 31 |
define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
|
| 32 |
|
| 33 |
-
define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "5.0.
|
| 34 |
|
| 35 |
define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
|
| 36 |
define('SHORTPIXEL_MAX_FAIL_RETRIES', 3);
|
| 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="/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings > ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
|
| 6 |
+
* Version: 5.0.3
|
| 7 |
* Author: ShortPixel
|
| 8 |
* Author URI: https://shortpixel.com
|
| 9 |
* GitHub Plugin URI: https://github.com/short-pixel-optimizer/shortpixel-image-optimiser
|
| 30 |
define('SHORTPIXEL_PLUGIN_FILE', __FILE__);
|
| 31 |
define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
|
| 32 |
|
| 33 |
+
define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "5.0.3");
|
| 34 |
|
| 35 |
define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
|
| 36 |
define('SHORTPIXEL_MAX_FAIL_RETRIES', 3);
|
