PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.33.1
MailPoet – Newsletters, Email Marketing, and Automation v5.33.1
5.37.0 5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Statistics / Track / SubscriberActivityTracker.php
mailpoet / lib / Statistics / Track Last commit date
Clicks.php 9 months ago Opens.php 1 year ago PageViewCookie.php 3 months ago SubscriberActivityTracker.php 2 years ago SubscriberCookie.php 3 months ago SubscriberHandler.php 1 year ago Unsubscribes.php 3 months ago WooCommercePurchases.php 2 years ago index.php 3 years ago
SubscriberActivityTracker.php
141 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Statistics\Track;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\SubscriberEntity;
9 use MailPoet\Settings\TrackingConfig;
10 use MailPoet\Subscribers\SubscribersRepository;
11 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
12 use MailPoet\WP\Functions as WPFunctions;
13
14 class SubscriberActivityTracker {
15
16 const TRACK_INTERVAL = 60; // 1 minute
17
18 /** @var PageViewCookie */
19 private $pageViewCookie;
20
21 /** @var SubscriberCookie */
22 private $subscriberCookie;
23
24 /** @var SubscribersRepository */
25 private $subscribersRepository;
26
27 /** @var WPFunctions */
28 private $wp;
29
30 /** @var TrackingConfig */
31 private $trackingConfig;
32
33 /** @var callable[] */
34 private $callbacks = [];
35
36 /** @var WooCommerceHelper */
37 private $wooCommerceHelper;
38
39 public function __construct(
40 PageViewCookie $pageViewCookie,
41 SubscriberCookie $subscriberCookie,
42 SubscribersRepository $subscribersRepository,
43 WPFunctions $wp,
44 WooCommerceHelper $wooCommerceHelper,
45 TrackingConfig $trackingConfig
46 ) {
47 $this->pageViewCookie = $pageViewCookie;
48 $this->subscriberCookie = $subscriberCookie;
49 $this->subscribersRepository = $subscribersRepository;
50 $this->wp = $wp;
51 $this->wooCommerceHelper = $wooCommerceHelper;
52 $this->trackingConfig = $trackingConfig;
53 }
54
55 public function trackActivity(): bool {
56 // Don't track in admin interface
57 if ($this->wp->isAdmin()) {
58 return false;
59 }
60
61 $subscriber = null;
62 $latestTimestamp = $this->getLatestTimestampFromCookie();
63
64 // If cookie tracking is not allowed try use last activity from subscriber data
65 if ($latestTimestamp === null) {
66 $subscriber = $this->getSubscriber();
67 if (!$subscriber) {
68 return false; // Can't determine timestamp
69 }
70 $latestTimestamp = $this->getLatestTimestampFromSubscriber($subscriber);
71 }
72
73 if ($latestTimestamp + self::TRACK_INTERVAL > $this->wp->currentTime('timestamp', true)) {
74 return false;
75 }
76
77 if ($subscriber === null) {
78 $subscriber = $this->getSubscriber();
79 }
80
81 if (!$subscriber) {
82 return false;
83 }
84
85 $this->processTracking($subscriber);
86 return true;
87 }
88
89 public function registerCallback(string $slug, callable $callback): void {
90 $this->callbacks[$slug] = $callback;
91 }
92
93 public function unregisterCallback(string $slug): void {
94 unset($this->callbacks[$slug]);
95 }
96
97 private function processTracking(SubscriberEntity $subscriber): void {
98 $this->subscribersRepository->maybeUpdateLastPageViewAt($subscriber);
99 $this->pageViewCookie->setPageViewTimestamp($this->wp->currentTime('timestamp', true));
100 foreach ($this->callbacks as $callback) {
101 $callback($subscriber);
102 }
103 }
104
105 private function getLatestTimestampFromCookie(): ?int {
106 if ($this->trackingConfig->isCookieTrackingEnabled()) {
107 return $this->pageViewCookie->getPageViewTimestamp() ?? 0;
108 }
109 return null;
110 }
111
112 private function getLatestTimestampFromSubscriber(SubscriberEntity $subscriber): int {
113 return $subscriber->getLastEngagementAt() ? $subscriber->getLastEngagementAt()->getTimestamp() : 0;
114 }
115
116 private function getSubscriber(): ?SubscriberEntity {
117 $wpUser = $this->wp->wpGetCurrentUser();
118 if ($wpUser->exists()) {
119 return $this->subscribersRepository->findOneBy(['wpUserId' => $wpUser->ID]);
120 }
121
122 $subscriberId = $this->subscriberCookie->getSubscriberId();
123 if ($subscriberId) {
124 return $this->subscribersRepository->findOneById($subscriberId);
125 }
126
127 if (!$this->wooCommerceHelper->isWooCommerceActive()) {
128 return null;
129 }
130 $wooCommerce = $this->wooCommerceHelper->WC();
131 if (!$wooCommerce || !$wooCommerce->session) {
132 return null;
133 }
134 $customer = $wooCommerce->session->get('customer');
135 if (!is_array($customer) || empty($customer['email'])) {
136 return null;
137 }
138 return $this->subscribersRepository->findOneBy(['email' => $customer['email']]);
139 }
140 }
141