PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / Config / SubscriberChangesNotifier.php
mailpoet / lib / Config Last commit date
PopulatorData 2 months ago AccessControl.php 2 years ago Activator.php 2 months ago AssetsLoader.php 2 weeks ago Capabilities.php 2 months ago Changelog.php 2 months ago DeactivationPoll.php 3 years ago DeferredAdminNotices.php 2 months ago Env.php 6 months ago Hooks.php 1 month ago HooksWooCommerce.php 1 month ago Initializer.php 1 month ago Installer.php 10 months ago Localizer.php 3 years ago Menu.php 1 month ago PersonalDataErasers.php 1 month ago PersonalDataExporters.php 1 month ago PluginActivatedHook.php 3 years ago Populator.php 2 weeks ago PrivacyPolicy.php 1 month ago Renderer.php 1 year ago RendererFactory.php 3 years ago RequirementsChecker.php 2 months ago Router.php 2 months ago ServicesChecker.php 3 years ago Shortcodes.php 1 month ago SilentUpgraderSkin.php 3 years ago SubscriberChangesNotifier.php 2 months ago TranslationUpdater.php 3 months ago TwigEnvironment.php 1 year ago TwigFileSystemCache.php 3 years ago Updater.php 4 days ago index.php 3 years ago
SubscriberChangesNotifier.php
189 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Config;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\SubscriberEntity;
9 use MailPoet\WP\Functions as WPFunctions;
10 use MailPoetVendor\Carbon\Carbon;
11
12 class SubscriberChangesNotifier {
13
14 /** @var array<int, int> */
15 private $createdSubscriberIds = [];
16
17 /** @var array<int, int> */
18 private $deletedSubscriberIds = [];
19
20 /** @var array<int, int> */
21 private $updatedSubscriberIds = [];
22
23 /** @var array<int, int> */
24 private $statusChangedSubscriberIds = [];
25
26 /** @var array<int, int> */
27 private $countChangedSubscriberIds = [];
28
29 /** @var array<int, int> */
30 private $createdSubscriberBatches = [];
31
32 /** @var array<int, int> */
33 private $updatedSubscriberBatches = [];
34
35 /** @var WPFunctions */
36 private $wp;
37
38 public function __construct(
39 WPFunctions $wp
40 ) {
41 $this->wp = $wp;
42 }
43
44 public function notify() {
45 $this->notifyCreations();
46 $this->notifyUpdates();
47 $this->notifyDeletes();
48 $this->notifyCountChanges();
49 }
50
51 private function notifyCreations(): void {
52 if (count($this->createdSubscriberIds) > 1) {
53 $minTimestamp = min($this->createdSubscriberIds);
54 if ($minTimestamp) {
55 $this->createdSubscriberBatches[] = $minTimestamp;
56 $this->createdSubscriberIds = []; // reset created subscribers
57 }
58 }
59
60 foreach ($this->createdSubscriberIds as $subscriberId => $updatedAt) {
61 $this->wp->doAction(SubscriberEntity::HOOK_SUBSCRIBER_CREATED, $subscriberId);
62 }
63
64 if ($this->createdSubscriberBatches) {
65 $minTimestamp = min($this->createdSubscriberBatches);
66 if ($minTimestamp) {
67 $this->wp->doAction(SubscriberEntity::HOOK_MULTIPLE_SUBSCRIBERS_CREATED, $minTimestamp);
68 }
69 }
70 }
71
72 private function notifyUpdates(): void {
73 // unset updated subscribers if subscriber is created
74 foreach ($this->createdSubscriberIds as $subscriberId => $timestamp) {
75 unset($this->updatedSubscriberIds[$subscriberId]);
76 unset($this->statusChangedSubscriberIds[$subscriberId]);
77 }
78
79 if (count($this->updatedSubscriberIds) > 1) {
80 $minTimestamp = min($this->updatedSubscriberIds);
81 if ($minTimestamp) {
82 $this->updatedSubscriberBatches[] = $minTimestamp;
83 $this->updatedSubscriberIds = []; // reset updated subscribers
84 $this->statusChangedSubscriberIds = []; // reset status changed subscribers
85 }
86 }
87
88 foreach ($this->updatedSubscriberIds as $subscriberId => $updatedAt) {
89 $this->wp->doAction(SubscriberEntity::HOOK_SUBSCRIBER_UPDATED, $subscriberId);
90 }
91
92 foreach ($this->statusChangedSubscriberIds as $subscriberId => $updatedAt) {
93 $this->wp->doAction(SubscriberEntity::HOOK_SUBSCRIBER_STATUS_CHANGED, $subscriberId);
94 }
95
96 if ($this->updatedSubscriberBatches) {
97 $minTimestamp = min($this->updatedSubscriberBatches);
98 if ($minTimestamp) {
99 $this->wp->doAction(SubscriberEntity::HOOK_MULTIPLE_SUBSCRIBERS_UPDATED, $minTimestamp);
100 }
101 }
102 }
103
104 private function notifyDeletes(): void {
105 if (count($this->deletedSubscriberIds) === 1) {
106 foreach ($this->deletedSubscriberIds as $subscriberId => $updatedAt) {
107 $this->wp->doAction(SubscriberEntity::HOOK_SUBSCRIBER_DELETED, $subscriberId);
108 }
109 } elseif ($this->deletedSubscriberIds) {
110 $this->wp->doAction(SubscriberEntity::HOOK_MULTIPLE_SUBSCRIBERS_DELETED, array_keys($this->deletedSubscriberIds));
111 }
112 }
113
114 private function notifyCountChanges(): void {
115 if (empty($this->countChangedSubscriberIds)) {
116 return;
117 }
118
119 $this->wp->doAction(SubscriberEntity::HOOK_SUBSCRIBERS_COUNT_CHANGED, array_keys($this->countChangedSubscriberIds));
120 }
121
122 public function subscriberCreated(int $subscriberId): void {
123 // store id as a key and timestamp change as the value
124 $timestamp = $this->getTimestamp();
125 $this->createdSubscriberIds[$subscriberId] = $timestamp;
126 $this->countChangedSubscriberIds[$subscriberId] = $timestamp;
127 }
128
129 public function subscriberUpdated(int $subscriberId): void {
130 // store id as a key and timestamp change as the value
131 $this->updatedSubscriberIds[$subscriberId] = $this->getTimestamp();
132 }
133
134 public function subscriberStatusChanged(int $subscriberId): void {
135 // store id as a key and timestamp change as the value
136 $timestamp = $this->getTimestamp();
137 $this->statusChangedSubscriberIds[$subscriberId] = $timestamp;
138 $this->countChangedSubscriberIds[$subscriberId] = $timestamp;
139 }
140
141 public function subscriberDeleted(int $subscriberId): void {
142 // store id as a key and timestamp change as the value
143 $timestamp = $this->getTimestamp();
144 $this->deletedSubscriberIds[$subscriberId] = $timestamp;
145 $this->countChangedSubscriberIds[$subscriberId] = $timestamp;
146 }
147
148 public function subscribersCreated(array $subscriberIds): void {
149 foreach ($subscriberIds as $subscriberId) {
150 $this->subscriberCreated((int)$subscriberId);
151 }
152 }
153
154 public function subscribersUpdated(array $subscriberIds): void {
155 foreach ($subscriberIds as $subscriberId) {
156 $this->subscriberUpdated((int)$subscriberId);
157 }
158 }
159
160 public function subscribersDeleted(array $subscriberIds): void {
161 foreach ($subscriberIds as $subscriberId) {
162 $this->subscriberDeleted((int)$subscriberId);
163 }
164 }
165
166 public function subscriberCountChanged(int $subscriberId): void {
167 $this->countChangedSubscriberIds[$subscriberId] = $this->getTimestamp();
168 }
169
170 public function subscribersCountChanged(array $subscriberIds): void {
171 foreach ($subscriberIds as $subscriberId) {
172 $this->subscriberCountChanged((int)$subscriberId);
173 }
174 }
175
176 public function subscribersBatchCreate(): void {
177 $this->createdSubscriberBatches[] = $this->getTimestamp();
178 }
179
180 public function subscribersBatchUpdate(): void {
181 $this->updatedSubscriberBatches[] = $this->getTimestamp();
182 }
183
184 private function getTimestamp(): int {
185 $dateTime = Carbon::createFromTimestamp($this->wp->currentTime('timestamp', true), 'UTC');
186 return $dateTime->getTimestamp();
187 }
188 }
189