83 lines
2.6 KiB
PHP
83 lines
2.6 KiB
PHP
<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
|
|
|
|
namespace MailPoet\Cron\Workers;
|
|
|
|
if (!defined('ABSPATH')) exit;
|
|
|
|
|
|
use MailPoet\Entities\ScheduledTaskEntity;
|
|
use MailPoet\Entities\StatisticsClickEntity;
|
|
use MailPoet\Statistics\StatisticsClicksRepository;
|
|
use MailPoet\Statistics\Track\WooCommercePurchases;
|
|
use MailPoet\WooCommerce\Helper as WCHelper;
|
|
use MailPoetVendor\Carbon\Carbon;
|
|
|
|
class WooCommercePastOrders extends SimpleWorker {
|
|
const TASK_TYPE = 'woocommerce_past_orders';
|
|
const BATCH_SIZE = 20;
|
|
|
|
/** @var WCHelper */
|
|
private $woocommerceHelper;
|
|
|
|
/** @var WooCommercePurchases */
|
|
private $woocommercePurchases;
|
|
|
|
/** @var StatisticsClicksRepository */
|
|
private $statisticsClicksRepository;
|
|
|
|
public function __construct(
|
|
WCHelper $woocommerceHelper,
|
|
StatisticsClicksRepository $statisticsClicksRepository,
|
|
WooCommercePurchases $woocommercePurchases
|
|
) {
|
|
$this->woocommerceHelper = $woocommerceHelper;
|
|
$this->woocommercePurchases = $woocommercePurchases;
|
|
$this->statisticsClicksRepository = $statisticsClicksRepository;
|
|
parent::__construct();
|
|
}
|
|
|
|
public function checkProcessingRequirements() {
|
|
return $this->woocommerceHelper->isWooCommerceActive() && empty($this->getCompletedTasks()); // run only once
|
|
}
|
|
|
|
public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
|
|
$oldestClick = $this->statisticsClicksRepository->findOneBy([], ['createdAt' => 'asc']);
|
|
if (!$oldestClick instanceof StatisticsClickEntity) {
|
|
return true;
|
|
}
|
|
|
|
// continue from 'last_processed_id' from previous run
|
|
$meta = $task->getMeta();
|
|
$lastId = isset($meta['last_processed_id']) ? $meta['last_processed_id'] : 0;
|
|
add_filter('posts_where', function ($where = '') use ($lastId) {
|
|
global $wpdb;
|
|
return $where . " AND {$wpdb->prefix}posts.ID > " . $lastId;
|
|
}, 10, 2);
|
|
|
|
$orderIds = $this->woocommerceHelper->wcGetOrders([
|
|
'date_completed' => '>=' . (($createdAt = $oldestClick->getCreatedAt()) ? $createdAt->format('Y-m-d H:i:s') : null),
|
|
'orderby' => 'ID',
|
|
'order' => 'ASC',
|
|
'limit' => self::BATCH_SIZE,
|
|
'return' => 'ids',
|
|
]);
|
|
|
|
if (empty($orderIds)) {
|
|
return true;
|
|
}
|
|
|
|
foreach ($orderIds as $orderId) {
|
|
$this->woocommercePurchases->trackPurchase($orderId, false);
|
|
}
|
|
|
|
$task->setMeta(['last_processed_id' => end($orderIds)]);
|
|
$this->scheduledTasksRepository->persist($task);
|
|
$this->scheduledTasksRepository->flush();
|
|
|
|
return false;
|
|
}
|
|
|
|
public function getNextRunDate() {
|
|
return Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); // schedule immediately
|
|
}
|
|
}
|