woocommerceHelper = $woocommerceHelper; $this->cookies = $cookies; } public function trackPurchase($id, $useCookies = true) { $order = $this->woocommerceHelper->wcGetOrder($id); if (!$order instanceof WC_Order) { return; } // limit clicks to 'USE_CLICKS_SINCE_DAYS_AGO' range before order has been created $fromDate = $order->get_date_created(); if (is_null($fromDate)) { return; } $from = clone $fromDate; $from->modify(-self::USE_CLICKS_SINCE_DAYS_AGO . ' days'); $to = $order->get_date_created(); // track purchases from all clicks matched by order email $processedNewsletterIdsMap = []; $orderEmailClicks = $this->getClicks($order->get_billing_email(), $from, $to); foreach ($orderEmailClicks as $click) { StatisticsWooCommercePurchases::createOrUpdateByClickDataAndOrder($click, $order); $processedNewsletterIdsMap[$click->newsletterId] = true; } if (!$useCookies) { return; } // track purchases from clicks matched by cookie email (only for newsletters not tracked by order) $cookieEmailClicks = $this->getClicks($this->getSubscriberEmailFromCookie(), $from, $to); foreach ($cookieEmailClicks as $click) { if (isset($processedNewsletterIdsMap[$click->newsletterId])) { continue; // do not track click for newsletters that were already tracked by order email } StatisticsWooCommercePurchases::createOrUpdateByClickDataAndOrder($click, $order); } } private function getClicks($email, $from, $to) { $subscriber = Subscriber::findOne($email); if (!$subscriber instanceof Subscriber) { return []; } return StatisticsClicks::findLatestPerNewsletterBySubscriber($subscriber, $from, $to); } private function getSubscriberEmailFromCookie() { $cookieData = $this->cookies->get(Clicks::REVENUE_TRACKING_COOKIE_NAME); if (!$cookieData) { return null; } $click = StatisticsClicks::findOne($cookieData['statistics_clicks']); if (!$click instanceof StatisticsClicks) { return null; } $subscriber = Subscriber::findOne($click->subscriberId); if ($subscriber) { return $subscriber->email; } return null; } }