PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 1.17
Independent Analytics – WordPress Analytics Plugin v1.17
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / queries / view.php
independent-analytics / IAWP / queries Last commit date
campaigns.php 3 years ago current_traffic_finder.php 3 years ago geos.php 3 years ago range_query.php 3 years ago referrers.php 3 years ago reset_database.php 3 years ago resources.php 3 years ago view.php 3 years ago views.php 3 years ago visitors_over_time_finder.php 3 years ago
view.php
281 lines
1 <?php
2
3 namespace IAWP;
4
5 class View
6 {
7 private $payload;
8 private $referrer_url;
9 private $visitor;
10 private $campaign_fields;
11 private $viewed_at;
12 private $resource;
13 private $referrer;
14 private $campaign;
15 private $session;
16
17 /**
18 * @param array $payload
19 * @param string|null $referrer_url
20 * @param Visitor $visitor
21 * @param array $campaign
22 * @param null $viewed_at
23 */
24 public function __construct(array $payload, ?string $referrer_url, Visitor $visitor, array $campaign_fields, $viewed_at = null)
25 {
26 $this->payload = $payload;
27 $this->referrer_url = trim($referrer_url);
28 $this->visitor = $visitor;
29 $this->campaign_fields = $campaign_fields;
30 $this->viewed_at = $viewed_at;
31 $this->resource = $this->get_resource();
32 $this->session = $this->get_session();
33 $view_id = $this->create_view();
34 $this->set_sessions_initial_view($view_id);
35 }
36
37 private function set_sessions_initial_view(int $view_id)
38 {
39 global $wpdb;
40
41 $sessions_table = Query::get_table_name(Query::SESSIONS);
42
43 $wpdb->query(
44 $wpdb->prepare(
45 "UPDATE $sessions_table SET initial_view_id = %d WHERE session_id = %d AND initial_view_id IS NULL",
46 $view_id,
47 $this->session
48 )
49 );
50 }
51
52 private function create_view()
53 {
54 $date = new \DateTime();
55 $viewed_at = $date->format('Y-m-d H:i:s');
56
57 return Query::query('create_view', [
58 'resource_id' => $this->resource,
59 'viewed_at' => $viewed_at,
60 'page' => $this->payload['page'],
61 'session_id' => $this->session,
62 ])->last_inserted_id();
63 }
64
65 private function get_resource(): ?int
66 {
67 global $wpdb;
68 $resources_table = Query::get_table_name(Query::RESOURCES);
69 $query = '';
70
71 $payload = array_merge($this->payload);
72 unset($payload['page']);
73
74 switch ($payload['resource']) {
75 case 'singular':
76 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND singular_id = %d", $payload['resource'], $payload['singular_id']);
77 break;
78 case 'author_archive':
79 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND author_id = %d", $payload['resource'], $payload['author_id']);
80 break;
81 case 'date_archive':
82 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND date_archive = %s", $payload['resource'], $payload['date_archive']);
83 break;
84 case 'post_type_archive':
85 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND post_type = %s", $payload['resource'], $payload['post_type']);
86 break;
87 case 'term_archive':
88 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND term_id = %s", $payload['resource'], $payload['term_id']);
89 break;
90 case 'search':
91 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND search_query = %s", $payload['resource'], $payload['search_query']);
92 break;
93 case 'home':
94 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s ", $payload['resource']);
95 break;
96 case '404':
97 $query = $wpdb->prepare("SELECT * FROM $resources_table WHERE resource = %s AND not_found_url = %s", $payload['resource'], $payload['not_found_url']);
98 break;
99 }
100
101 $resource = $wpdb->get_row($query);
102
103 if (is_null($resource)) {
104 $wpdb->insert($resources_table, $payload);
105 $resource = $wpdb->get_row($query);
106 }
107
108 // Todo - This probably shouldn't happen here... A call should be make to the page and then the page should
109 // know if it's a page type that needs to be cached or not.
110 switch ($resource->resource) {
111 case 'singular':
112 (new Page_Singular($resource))->update_cache();
113 break;
114 case 'author_archive':
115 (new Page_Author_Archive($resource))->update_cache();
116 break;
117 case 'post_type_archive':
118 (new Page_Post_Type_Archive($resource))->update_cache();
119 break;
120 case 'term_archive':
121 (new Page_Term_Archive($resource))->update_cache();
122 break;
123 case 'home':
124 (new Page_Home($resource))->update_cache();
125 break;
126 case 'date_archive':
127 (new Page_Date_Archive($resource))->update_cache();
128 break;
129 case '404':
130 (new Page_Not_Found($resource))->update_cache();
131 break;
132 case 'search':
133 (new Page_Search($resource))->update_cache();
134 break;
135 }
136
137 return $resource->id;
138 }
139
140 private function get_session(): int
141 {
142 $is_internal_referrer = $this->is_internal_referrer($this->referrer_url);
143 $current_session = $this->get_current_session();
144
145 if (isset($current_session) && $is_internal_referrer) {
146 return $current_session;
147 } else {
148 return $this->create_session();
149 }
150 }
151
152 /**
153 * @param string|null $referrer_url
154 * @return bool
155 */
156 private function is_internal_referrer(?string $referrer_url): bool
157 {
158 return !empty($referrer_url) && StringUtil::str_starts_with(strtolower($referrer_url), strtolower(site_url()));
159 }
160
161 /**
162 * Gets the current session not including any that might get created by the current view
163 *
164 * @return int|null
165 */
166 private function get_current_session(): ?int
167 {
168 $session = Query::query('get_current_session', [
169 'visitor_id' => $this->visitor->id(),
170 ])->row();
171
172 if (isset($session)) {
173 return $session->session_id;
174 } else {
175 return null;
176 }
177 }
178
179 public function create_session(): int
180 {
181 $date = new \DateTime();
182 $created_at = $date->format('Y-m-d H:i:s');
183
184 return Query::query('create_session', [
185 'visitor_id' => $this->visitor->id(),
186 'referrer_id' => $this->get_referrer(),
187 'campaign_id' => $this->get_campaign(),
188 'created_at' => $created_at,
189 ])->last_inserted_id();
190 }
191
192 private function get_referrer(): ?int
193 {
194 if (!isset($this->referrer_url) || strlen($this->referrer_url) === 0) {
195 return null;
196 }
197
198 $url = new URL($this->referrer_url);
199
200 if (!$url->is_valid_url()) {
201 return null;
202 }
203
204 Query::query('create_referrer', [
205 'domain' => $url->get_domain(),
206 ]);
207
208 $referrer = Query::query('get_referrer', [
209 'domain' => $url->get_domain(),
210 ])->row();
211
212 if (isset($referrer)) {
213 return $referrer->id;
214 } else {
215 return null;
216 }
217 }
218
219 private function get_campaign(): ?int
220 {
221 global $wpdb;
222 $required_fields = ['utm_source', 'utm_medium', 'utm_campaign'];
223 $valid = true;
224
225 foreach ($required_fields as $field) {
226 if (!isset($this->campaign_fields[$field])) {
227 $valid = false;
228 }
229 }
230
231 if (!$valid) {
232 return null;
233 }
234
235 $campaigns_table = Query::get_table_name(Query::CAMPAIGNS);
236 $campaign = $wpdb->get_row(
237 $wpdb->prepare(
238 "SELECT * FROM $campaigns_table WHERE utm_source = %s AND utm_medium = %s AND utm_campaign = %s AND (utm_term = %s OR (%d = 0 AND utm_term IS NULL)) AND (utm_content = %s OR (%d = 0 AND utm_content IS NULL))",
239 $this->campaign_fields['utm_source'],
240 $this->campaign_fields['utm_medium'],
241 $this->campaign_fields['utm_campaign'],
242 $this->campaign_fields['utm_term'],
243 isset($this->campaign_fields['utm_term']) ? 1 : 0,
244 $this->campaign_fields['utm_content'],
245 isset($this->campaign_fields['utm_content']) ? 1 : 0
246 )
247 );
248
249 if (!is_null($campaign)) {
250 return $campaign->campaign_id;
251 }
252
253 $wpdb->insert($campaigns_table, [
254 'utm_source' => $this->campaign_fields['utm_source'],
255 'utm_medium' => $this->campaign_fields['utm_medium'],
256 'utm_campaign' => $this->campaign_fields['utm_campaign'],
257 'utm_term' => $this->campaign_fields['utm_term'],
258 'utm_content' => $this->campaign_fields['utm_content'],
259 ]);
260
261 $campaign = $wpdb->get_row(
262 $wpdb->prepare(
263 "SELECT * FROM $campaigns_table WHERE utm_source = %s AND utm_medium = %s AND utm_campaign = %s AND (utm_term = %s OR (%d = 0 AND utm_term IS NULL)) AND (utm_content = %s OR (%d = 0 AND utm_content IS NULL))",
264 $this->campaign_fields['utm_source'],
265 $this->campaign_fields['utm_medium'],
266 $this->campaign_fields['utm_campaign'],
267 $this->campaign_fields['utm_term'],
268 isset($this->campaign_fields['utm_term']) ? 1 : 0,
269 $this->campaign_fields['utm_content'],
270 isset($this->campaign_fields['utm_content']) ? 1 : 0
271 )
272 );
273
274 if (!is_null($campaign)) {
275 return $campaign->campaign_id;
276 }
277
278 return null;
279 }
280 }
281