wp_back/wp-content/plugins/shortpixel-image-optimiser/class/external/wp-cli/wp-cli-bulk.php
2024-05-20 15:37:46 +03:00

297 lines
6.7 KiB
PHP

<?php
namespace ShortPixel;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
use ShortPixel\Controller\OptimizeController as OptimizeController;
use ShortPixel\Controller\BulkController as BulkController;
use ShortPixel\Controller\Queue\Queue as Queue;
use ShortPixel\Controller\ApiController as ApiController;
use ShortPixel\Controller\ResponseController as ResponseController;
/**
* Actions for running bulk operations from WP-CLI
*/
class SpioBulk extends SpioCommandBase
{
/**
* Starts the prepared queue(s). The bulk needs an express command to start processing.
* Once started, the queue(s) can be processed and finished with the run command.
*
* ## OPTIONS
* [--queue=<name>]
* : Either 'media' or 'custom'. Omit the parameter to start both queues.
* ---
* default: media,custom
* options:
* - media
* - custom
* ---
*
* ## EXAMPLES
*
* wp spio bulk start
*
*
* @when after_wp_load
*/
public function start($args, $assoc)
{
$bulkControl = BulkController::getInstance();
$queue = $this->getQueueArgument($assoc);
foreach($queue as $qname)
{
$result = $bulkControl->startBulk($qname);
}
\WP_CLI::Line('Start signal for Bulk Processing given.');
// $this->run($args, $assoc);
//$controller = new OptimizeController();
//$result = $controller->startBulk();
}
/**
* Automatically Bulk Processes everything that needs to be done.
*
* [--queue=<name>]
* : Either 'media' or 'custom'. Omit the parameter to process both queues.
* ---
* default: media,custom
* options:
* - media
* - custom
* ---
*
* [--limit=<num>]
* : Limit the amount of items being prepared.
*
* [--special=<migrate>]
* : Run the migration
*
* ## EXAMPLES
*
* wp spio bulk auto
*
*
*/
public function auto($args, $assoc)
{
$queue = $this->getQueueArgument($assoc);
$optimizeController = $this->getOptimizeController();
$bulkControl = BulkController::getInstance();
$running = true;
$created = false;
$this->settings();
sleep(2); // user can digest settings
while($running)
{
$data = $optimizeController->getStartupData();
$combined = $data->total->stats;
// Is_finished is no queue running.
if ($combined->is_preparing)
{
\WP_CLI::line('[Auto Bulk] Preparing .. ');
$this->prepare($args, $assoc);
$this->start($args, $assoc);
\WP_CLI::line('Preparing Run done');
}
elseif ($combined->is_running)
{
\WP_CLI::line('Bulk Running ...');
$this->run($args, $assoc); // Run All
}
elseif ($combined->total > 0 && $combined->done == 0 && $combined->is_running == false && $combined->is_preparing == false && $combined->is_finished == false)
{
\WP_CLI::line('[Auto Bulk] Starting to process');
$this->status($args, $assoc);
$this->start($args, $assoc);
}
elseif ($combined->is_finished)
{
if ($combined->done > 0 || $created == true) // means we already ran the whole thing once.
{
\WP_CLI::Line('[Auto Bulk] Seems finished and done running');
$running = false;
$this->finishBulk($args, $assoc);
break;
}
\WP_CLI::Line('[Auto Bulk] Creating New Queue');
$this->create($args, $assoc);
$created = true;
}
else
{
\WP_CLI::error("[Auto Bulk] : Encountered nothing to do", true);
$running = false; // extra fallback
}
}
\WP_CLI::log('Automatic Bulk ended');
}
/**
* Creates the queue(s) for bulk optimization of media library and/or custom media items.
*
* ## OPTIONS
*
* [--queue=<name>]
* : Either 'media' or 'custom'. Omit the parameter to create both queues.
* ---
* default: media,custom
* options:
* - media
* - custom
* [--special=<migrate>]
* : Run the migration
* ---
*
* ## EXAMPLES
*
* wp spio bulk create
*
*
* @when after_wp_load
*/
public function create($args, $assoc)
{
$bulkControl = BulkController::getInstance();
$json = new \stdClass;
$json->media = new \stdClass;
$json->custom = new \stdClass;
$queues = $this->getQueueArgument($assoc);
$operation = null;
if (isset($assoc['special']))
{
switch ($assoc['special'])
{
case 'migrate':
$operation = 'migrate';
$queues = array('media'); // can only have one bulk, this.
break;
}
}
foreach($queues as $qname)
{
$stats = $bulkControl->createNewBulk($qname, $operation);
$json->$qname->stats = $stats;
\WP_CLI::Line("Bulk $qname created. Ready to prepare");
}
$this->showResponses();
return $stats;
}
/**
* ## OPTIONS
*
* <start-id>
* : ID to start restore
*
* <end-id>
* : ID to stop restore
*
* [--type=<type>]
* : media or custom
* ---
* default: media
* options:
* - media
* - custom
* ---
*
* ## EXAMPLES
*
* wp spio bulk restore 0 100
*
*
* @when after_wp_load
*/
/*public function restore($args, $assoc)
{
\WP_CLI::Line('Not yet implemented');
} */
protected function finishBulk($args, $assoc)
{
$bulkControl = BulkController::getInstance();
$queues = $this->getQueueArgument($assoc);
foreach($queues as $queue_name)
{
$bulkControl->finishBulk($queue_name);
}
}
// To ensure the bulk switch is ok.
protected function getOptimizeController()
{
$optimizeController = new OptimizeController();
$optimizeController->setBulk(true);
return $optimizeController;
}
/**
* Prepares the items by adding them to the queue(s). It runs only when the queue is in the preparing phase and finishes when everything is prepared.
*
*
* [--queue=<name>]
* : Either 'media' or 'custom'. Omit the parameter to run both queues.
* ---
* default: media,custom
* options:
* - media
* - custom
* ---
*
* [--limit=<num>]
* : Limit the amount of items being prepared.
*
* ## EXAMPLES
*
* wp spio bulk prepare
*
*/
public function prepare($args, $assoc)
{
$queues = $this->getQueueArgument($assoc);
$optimizeController = $this->getOptimizeController();
$data = $optimizeController->getStartupData();
if (! $data->total->stats->is_preparing)
{
\WP_CLI::Error("No queues have status preparing, aborting");
}
else
{
$assoc['wait'] = 0.5;
$bool = $this->run($args, $assoc);
}
}
} // CLASS