PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.2
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.2
4.11.2 4.11.1 4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / Analytics / AnalyticsSender.php
wp-staging / Framework / Analytics Last commit date
Actions 3 days ago AnalyticsCleanup.php 1 week ago AnalyticsConsent.php 1 week ago AnalyticsEventDto.php 1 week ago AnalyticsEventWithTimeDto.php 1 week ago AnalyticsGenericEventHandler.php 1 week ago AnalyticsSender.php 3 days ago ErrorCode.php 1 week ago WithAnalyticsAPI.php 1 week ago WithAnalyticsSiteInfo.php 3 days ago
AnalyticsSender.php
252 lines
1 <?php
2
3 namespace WPStaging\Framework\Analytics;
4
5 class AnalyticsSender
6 {
7 use WithAnalyticsAPI;
8
9 protected $consent;
10
11 private $corruptSettingsNotice;
12
13 public function __construct(AnalyticsConsent $consent)
14 {
15 $this->consent = $consent;
16 }
17
18 public function maybeSend()
19 {
20
21 if (defined('DOING_AJAX') && DOING_AJAX) {
22 return;
23 }
24
25
26
27
28 $settings = get_option("wpstg_settings", []);
29 if (is_object($settings)) {
30 $settings = (array)$settings;
31 }
32
33
34 if (!is_array($settings)) {
35 return;
36 }
37
38
39 $interval = ($this->isDev() ? 1 : 15) * MINUTE_IN_SECONDS;
40
41
42 if (isset($settings['lastAnalyticsSend']) && time() - $settings['lastAnalyticsSend'] - $interval < 0) {
43 return;
44 }
45
46 $settings['lastAnalyticsSend'] = time();
47
48 if (!update_option('wpstg_settings', $settings)) {
49 \WPStaging\functions\debug_log('WP STAGING: Could not update Analytics last sent time.', 'debug');
50 };
51
52 $this->sendAnalytics();
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public function sendNow($event): bool
74 {
75 if (!$this->consent->hasUserConsent()) {
76 return false;
77 }
78
79 if ($this->isDev() && !$this->canDevSendAnalytics()) {
80 return false;
81 }
82
83 $response = wp_remote_post($this->getApiUrl('events'), [
84 'method' => 'POST',
85 'headers' => ['Content-Type' => 'application/json; charset=utf-8'],
86 'body' => wp_json_encode([
87 'events' => [$event],
88 'site_hash' => $this->getSiteHash(),
89 ]),
90 'data_format' => 'body',
91 'timeout' => 1,
92 'redirection' => 0,
93 'httpversion' => '1.0',
94 'blocking' => false,
95 'sslverify' => false,
96 ]);
97
98 return !is_wp_error($response);
99 }
100
101 public function sendAnalytics()
102 {
103 global $wpdb;
104
105 $eventOptions = $wpdb->get_results("SELECT * FROM $wpdb->options WHERE `option_name` LIKE 'wpstg_analytics_event_%' LIMIT 0, 20");
106
107
108 if (empty($eventOptions)) {
109 return;
110 }
111
112
113 if (!$this->consent->hasUserConsent()) {
114 return;
115 }
116
117
118 $events = array_map(function ($eventOption) {
119 return json_decode($eventOption->option_value);
120 }, $eventOptions);
121
122 $this->setStaleEvents($events);
123
124
125 $events = array_filter($events, function ($event) {
126 return $event->ready_to_send;
127 });
128
129
130 if (empty($events)) {
131 return;
132 }
133
134
135 foreach ($events as &$event) {
136 foreach ($event as $property => &$value) {
137 if (is_bool($value)) {
138 $event->$property = (int)$value;
139 } elseif ($property === 'site_info') {
140 $siteInfo = &$value;
141
142 foreach ($siteInfo as $siteInfoProperty => &$siteInfoValue) {
143 if (is_bool($siteInfoValue)) {
144 $siteInfo->$siteInfoProperty = (int)$siteInfoValue;
145 }
146 }
147 }
148 }
149 }
150
151
152
153 $idsToDelete = implode(',', array_map(function ($key) use ($eventOptions) {
154 return $eventOptions[$key]->option_id;
155 }, array_keys($events)));
156
157 if (!$wpdb->query("DELETE FROM $wpdb->options WHERE `option_id` IN ($idsToDelete)")) {
158 \WPStaging\functions\debug_log('WP STAGING Analytics Delete Sent Events Error: ' . $wpdb->last_error);
159 }
160
161
162 $events = array_values($events);
163
164 $body = wp_json_encode([
165 'events' => $events,
166 'site_hash' => $this->getSiteHash(),
167 ]);
168
169 $url = $this->getApiUrl('events');
170
171
172 if ($this->isDev() && !$this->canDevSendAnalytics()) {
173 return;
174 }
175
176 $response = wp_remote_post($url, [
177 'method' => 'POST',
178 'headers' => ['Content-Type' => 'application/json; charset=utf-8'],
179 'body' => $body,
180 'data_format' => 'body',
181 'timeout' => 10,
182 'redirection' => 5,
183 'httpversion' => '1.0',
184 'blocking' => true,
185 'sslverify' => false,
186 ]);
187
188 if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
189 if (wp_remote_retrieve_response_code($response) == 412) {
190
191 if ($this->consent->hasUserConsent()) {
192 try {
193 $this->consent->giveConsent();
194 } catch (\Exception $e) {
195
196
197
198
199
200 }
201 }
202 }
203
204 $errorMessage = is_wp_error($response) ? $response->get_error_message() : wp_remote_retrieve_body($response);
205 \WPStaging\functions\debug_log('WP STAGING Analytics Send Error: ' . $errorMessage);
206 }
207 }
208
209
210
211
212
213
214 protected function setStaleEvents(&$events)
215 {
216 $staleThreshold = time() - 1 * DAY_IN_SECONDS;
217
218 foreach ($events as &$event) {
219 if ($event->ready_to_send) {
220 continue;
221 }
222
223
224 if (isset($event->start_at)) {
225 if ($event->start_at < $staleThreshold) {
226 $event->ready_to_send = true;
227 $event->stale_at = time();
228 }
229
230 continue;
231 }
232
233
234
235 if (!empty($event->start_time) && $event->start_time < $staleThreshold) {
236 $event->ready_to_send = true;
237 $event->is_stale = true;
238 }
239 }
240 }
241
242 protected function isDev(): bool
243 {
244 return defined('WPSTG_IS_DEV') && WPSTG_IS_DEV;
245 }
246
247 protected function canDevSendAnalytics(): bool
248 {
249 return defined('WPSTG_DEV_SEND_ANALYTICS') && WPSTG_DEV_SEND_ANALYTICS;
250 }
251 }
252