75 lines
2 KiB
PHP
75 lines
2 KiB
PHP
|
<?php declare(strict_types = 1);
|
||
|
|
||
|
namespace MailPoet\Cron\Workers;
|
||
|
|
||
|
if (!defined('ABSPATH')) exit;
|
||
|
|
||
|
|
||
|
use MailPoet\Entities\ScheduledTaskEntity;
|
||
|
use MailPoet\Segments\WooCommerce as WooCommerceSegment;
|
||
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||
|
|
||
|
class WooCommerceSync extends SimpleWorker {
|
||
|
const TASK_TYPE = 'woocommerce_sync';
|
||
|
const SUPPORT_MULTIPLE_INSTANCES = false;
|
||
|
const AUTOMATIC_SCHEDULING = false;
|
||
|
const BATCH_SIZE = 1000;
|
||
|
|
||
|
/** @var WooCommerceSegment */
|
||
|
private $woocommerceSegment;
|
||
|
|
||
|
/** @var WooCommerceHelper */
|
||
|
private $woocommerceHelper;
|
||
|
|
||
|
public function __construct(
|
||
|
WooCommerceSegment $woocommerceSegment,
|
||
|
WooCommerceHelper $woocommerceHelper
|
||
|
) {
|
||
|
$this->woocommerceSegment = $woocommerceSegment;
|
||
|
$this->woocommerceHelper = $woocommerceHelper;
|
||
|
parent::__construct();
|
||
|
}
|
||
|
|
||
|
public function checkProcessingRequirements() {
|
||
|
return $this->woocommerceHelper->isWooCommerceActive();
|
||
|
}
|
||
|
|
||
|
public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
|
||
|
$meta = $task->getMeta();
|
||
|
$highestOrderId = $this->getHighestOrderId();
|
||
|
|
||
|
if (!isset($meta['last_checked_order_id'])) {
|
||
|
$meta['last_checked_order_id'] = 0;
|
||
|
}
|
||
|
|
||
|
do {
|
||
|
$this->cronHelper->enforceExecutionLimit($timer);
|
||
|
$meta['last_checked_order_id'] = $this->woocommerceSegment->synchronizeCustomers(
|
||
|
$meta['last_checked_order_id'],
|
||
|
$highestOrderId,
|
||
|
self::BATCH_SIZE
|
||
|
);
|
||
|
$task->setMeta($meta);
|
||
|
$this->scheduledTasksRepository->persist($task);
|
||
|
$this->scheduledTasksRepository->flush();
|
||
|
} while ($meta['last_checked_order_id'] < $highestOrderId);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
private function getHighestOrderId(): int {
|
||
|
$orders = $this->woocommerceHelper->wcGetOrders(
|
||
|
[
|
||
|
'status' => 'all',
|
||
|
'type' => 'shop_order',
|
||
|
'limit' => 1,
|
||
|
'orderby' => 'ID',
|
||
|
'order' => 'DESC',
|
||
|
'return' => 'ids',
|
||
|
]
|
||
|
);
|
||
|
|
||
|
return (!empty($orders)) ? $orders[0] : 0;
|
||
|
}
|
||
|
}
|