Sin descripción

WooCommercePastOrders.php 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace MailPoet\Cron\Workers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\ScheduledTask;
  5. use MailPoet\Models\StatisticsClicks;
  6. use MailPoet\Models\StatisticsWooCommercePurchases;
  7. use MailPoet\Statistics\Track\WooCommercePurchases;
  8. use MailPoet\WooCommerce\Helper as WCHelper;
  9. use MailPoetVendor\Carbon\Carbon;
  10. class WooCommercePastOrders extends SimpleWorker {
  11. const TASK_TYPE = 'woocommerce_past_orders';
  12. const BATCH_SIZE = 20;
  13. /** @var WCHelper */
  14. private $woocommerceHelper;
  15. /** @var WooCommercePurchases */
  16. private $woocommercePurchases;
  17. public function __construct(
  18. WCHelper $woocommerceHelper,
  19. WooCommercePurchases $woocommercePurchases
  20. ) {
  21. $this->woocommerceHelper = $woocommerceHelper;
  22. $this->woocommercePurchases = $woocommercePurchases;
  23. parent::__construct();
  24. }
  25. public function checkProcessingRequirements() {
  26. return $this->woocommerceHelper->isWooCommerceActive() && empty($this->getCompletedTasks()); // run only once
  27. }
  28. public function processTaskStrategy(ScheduledTask $task, $timer) {
  29. $oldestClick = StatisticsClicks::orderByAsc('created_at')->limit(1)->findOne();
  30. if (!$oldestClick instanceof StatisticsClicks) {
  31. return true;
  32. }
  33. // continue from 'last_processed_id' from previous run
  34. $meta = $task->getMeta();
  35. $lastId = isset($meta['last_processed_id']) ? $meta['last_processed_id'] : 0;
  36. add_filter('posts_where', function ($where = '') use ($lastId) {
  37. global $wpdb;
  38. return $where . " AND {$wpdb->prefix}posts.ID > " . $lastId;
  39. }, 10, 2);
  40. $orderIds = $this->woocommerceHelper->wcGetOrders([
  41. 'status' => 'completed',
  42. 'date_completed' => '>=' . $oldestClick->createdAt,
  43. 'orderby' => 'ID',
  44. 'order' => 'ASC',
  45. 'limit' => self::BATCH_SIZE,
  46. 'return' => 'ids',
  47. ]);
  48. if (empty($orderIds)) {
  49. return true;
  50. }
  51. foreach ($orderIds as $orderId) {
  52. // clean all records for given order to fix wrong data inserted by a past buggy version
  53. StatisticsWooCommercePurchases::where('order_id', $orderId)->deleteMany();
  54. $this->woocommercePurchases->trackPurchase($orderId, false);
  55. }
  56. $task->meta = ['last_processed_id' => end($orderIds)];
  57. $task->save();
  58. return false;
  59. }
  60. public function getNextRunDate() {
  61. return Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); // schedule immediately
  62. }
  63. }