woocommerce_helper = $woocommerce_helper; $this->cookies = $cookies; } function trackPurchase($id, $use_cookies = true) { $order = $this->woocommerce_helper->wcGetOrder($id); if (!$order instanceof WC_Order) { return; } // limit clicks to 'USE_CLICKS_SINCE_DAYS_AGO' range before order has been created $from_date = $order->get_date_created(); if (is_null($from_date)) { return; } $from = clone $from_date; $from->modify(-self::USE_CLICKS_SINCE_DAYS_AGO . ' days'); $to = $order->get_date_created(); // track purchases from all clicks matched by order email $processed_newsletter_ids_map = []; $order_email_clicks = $this->getClicks($order->get_billing_email(), $from, $to); foreach ($order_email_clicks as $click) { StatisticsWooCommercePurchases::createOrUpdateByClickDataAndOrder($click, $order); $processed_newsletter_ids_map[$click->newsletter_id] = true; } if (!$use_cookies) { return; } // track purchases from clicks matched by cookie email (only for newsletters not tracked by order) $cookie_email_clicks = $this->getClicks($this->getSubscriberEmailFromCookie(), $from, $to); foreach ($cookie_email_clicks as $click) { if (isset($processed_newsletter_ids_map[$click->newsletter_id])) { 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() { $cookie_data = $this->cookies->get(Clicks::REVENUE_TRACKING_COOKIE_NAME); if (!$cookie_data) { return null; } $click = StatisticsClicks::findOne($cookie_data['statistics_clicks']); if (!$click instanceof StatisticsClicks) { return null; } $subscriber = Subscriber::findOne($click->subscriber_id); if ($subscriber) { return $subscriber->email; } return null; } }