Keine Beschreibung

WooCommercePurchases.php 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace MailPoet\Statistics\Track;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\StatisticsClicks;
  5. use MailPoet\Models\StatisticsWooCommercePurchases;
  6. use MailPoet\Models\Subscriber;
  7. use MailPoet\Util\Cookies;
  8. use MailPoet\WooCommerce\Helper;
  9. use WC_Order;
  10. class WooCommercePurchases {
  11. const USE_CLICKS_SINCE_DAYS_AGO = 14;
  12. /** @var Helper */
  13. private $woocommerceHelper;
  14. /** @var Cookies */
  15. private $cookies;
  16. public function __construct(
  17. Helper $woocommerceHelper,
  18. Cookies $cookies
  19. ) {
  20. $this->woocommerceHelper = $woocommerceHelper;
  21. $this->cookies = $cookies;
  22. }
  23. public function trackPurchase($id, $useCookies = true) {
  24. $order = $this->woocommerceHelper->wcGetOrder($id);
  25. if (!$order instanceof WC_Order) {
  26. return;
  27. }
  28. // limit clicks to 'USE_CLICKS_SINCE_DAYS_AGO' range before order has been created
  29. $fromDate = $order->get_date_created();
  30. if (is_null($fromDate)) {
  31. return;
  32. }
  33. $from = clone $fromDate;
  34. $from->modify(-self::USE_CLICKS_SINCE_DAYS_AGO . ' days');
  35. $to = $order->get_date_created();
  36. // track purchases from all clicks matched by order email
  37. $processedNewsletterIdsMap = [];
  38. $orderEmailClicks = $this->getClicks($order->get_billing_email(), $from, $to);
  39. foreach ($orderEmailClicks as $click) {
  40. StatisticsWooCommercePurchases::createOrUpdateByClickDataAndOrder($click, $order);
  41. $processedNewsletterIdsMap[$click->newsletterId] = true;
  42. }
  43. if (!$useCookies) {
  44. return;
  45. }
  46. // track purchases from clicks matched by cookie email (only for newsletters not tracked by order)
  47. $cookieEmailClicks = $this->getClicks($this->getSubscriberEmailFromCookie(), $from, $to);
  48. foreach ($cookieEmailClicks as $click) {
  49. if (isset($processedNewsletterIdsMap[$click->newsletterId])) {
  50. continue; // do not track click for newsletters that were already tracked by order email
  51. }
  52. StatisticsWooCommercePurchases::createOrUpdateByClickDataAndOrder($click, $order);
  53. }
  54. }
  55. private function getClicks($email, $from, $to) {
  56. $subscriber = Subscriber::findOne($email);
  57. if (!$subscriber instanceof Subscriber) {
  58. return [];
  59. }
  60. return StatisticsClicks::findLatestPerNewsletterBySubscriber($subscriber, $from, $to);
  61. }
  62. private function getSubscriberEmailFromCookie() {
  63. $cookieData = $this->cookies->get(Clicks::REVENUE_TRACKING_COOKIE_NAME);
  64. if (!$cookieData) {
  65. return null;
  66. }
  67. $click = StatisticsClicks::findOne($cookieData['statistics_clicks']);
  68. if (!$click instanceof StatisticsClicks) {
  69. return null;
  70. }
  71. $subscriber = Subscriber::findOne($click->subscriberId);
  72. if ($subscriber) {
  73. return $subscriber->email;
  74. }
  75. return null;
  76. }
  77. }